Aplicación Login de Twitter WPF – Manejando la API de Twitter


Twitter proporciona una API para que las personas puedan extender las características de Twitter y no estén obligadas a usar el sitio oficial, permitiendo que se creen diferentes versiones, como está donde se buscan los Tweets que contengan la palabra Saudade, y por cada Tweet se crea un confeti y podemos ver que dice el Tweet o esta otra donde se ven en el globo terráqueo los Tweets de cada usuario según su localidad.

La API está desarrollada en la técnica de arquitectura REST (Representational State Transfer), para acceder a los servicios accedemos a la URL y si es necesario nos autenticamos con un usuario de Twitter.

Al acceder al servicio se retorna un estado HTTP 200 OK si la autentificación fue exitosa, y un estado 401 junto con un mensaje de error si fallo la autentificación, las peticiones están limitadas a 15 peticiones por hora, para evitar ataques de fuerza bruta.

Los métodos usados para acceder pueden ser POST o GET, y el formato de la respuesta es XML o JSON.

Bien, para empezar creamos un proyecto en Visual Studio en WPF, adicionamos dos TextBlock, 1 TextBox (name = user), 1 PasswordBox (name = password) y  un botón para hacer Login:

 login1

 

Vamos a aplicar el Template creado anteriormente al TextBox, para ello adicionamos el archivo MiTexto.xaml a nuestro proyecto:

 adicionararchivo2

Al agregarlo debemos modificar la propiedad de Copy to Output Directory para que al compilarse, el archivo sea copiado a nuestra carpeta del Proyecto si esta no existe:

copiarcompilar3

Ahora le indicamos a nuestra aplicación que hay un archivo de recursos, para poderlo usar, para ello vamos al archivo App.xaml y escribimos lo siguiente:

<Application.Resources> 

        <ResourceDictionary Source="MiTexto.xaml"/>

    </Application.Resources>

Ahora le aplicamos nuestro template al TextBox, asignándole a la propiedad Template nuestro recurso:

<TextBox Height="31" Margin="119,27,10,0" Name="textBox1" VerticalAlignment="Top" FontSize="16" Template="{StaticResource MiTexto}" /> 

Pero nuestro PasswordBox se ve diferente, y si le asignamos el template ocurre un error, puesto que en el Template le asignamos como TargetType la clase TextBox.

Para que acepte el control PasswordBox, asignamos como TargetType la clase Control, esta clase la heredan las clases TextBox y PasswordBox, la parte del código modificado es el siguiente:

<ControlTemplate x:Key="MiTexto" TargetType="{x:Type Control}"> 

Ahora si podemos aplicar nuestro template al control PasswordBox:

 aplicartemplate4

Ahora creamos una función que recibirá como parámetro el usuario y el password y retornara un mensaje, la función hará uso de la clase WebClient del NameSpace System.Net para acceder a la URL  http://twitter.com/account/verify_credentials.xml con el método DownloadString, el servicio verifica las credenciales y si todo está bien retorna un XML con los datos del Usuario, como es necesario autenticarnos para obtener los datos, usamos la clase NetWorkCredential  que tendrá el usuario y el password, la función retorna como resultado el XML o una excepción si falla algo.

Antes de hacer todo, validamos que el usuario haya ingresado el usuario y el password, el código de la función es:

private String validar(String usuario, String password) 

{

  if (String.IsNullOrEmpty(usuario))

     {

      this.user.Focus();

      return "El Usuario es obligatorio";

     }

  if (String.IsNullOrEmpty(password))

     {

      this.password.Focus();

      return "El Password es obligatorio";

     }

  try

     {

      NetworkCredential credencial = new NetworkCredential

      {

        UserName = usuario,

        Password = password

      };

String xml = String.Empty;

      using (WebClient cliente = new WebClient())

       {

        cliente.Credentials = credencial;

        xml = cliente.DownloadString("http://twitter.com/account/verify_credentials.xml");

        return xml;

       }

     }

     catch (Exception ex)

      {

       if (ex.Message.Contains("401"))

        {

         return "Usuario o Password incorrecto";

        }

       else if (ex.Message.Contains("Service Uavailable"))

        {

         return "En este momento el servicio se encuentra ocupado. Intente más tarde";

        }

      else

       {

         return ex.Message;

        }

     }

}

Para hacer uso de la función, necesitamos un TextBlock que será donde mostraremos el mensaje obtenido. Adicionamos un control Expander que tendrá un TexBlock (name = mensaje) :

 expander5

El código del botón Login:

private void button1_Click(object sender, RoutedEventArgs e) 

{

  this.mensaje.Text = validar(this.user.Text, this.password.Password);

  expander1.IsExpanded = true;

}

Asignamos el resultado de la función al TextBlock, y luego expandemos el control expander, para mostrar el mensaje, si todo salió bien se va a mostrar una parte del XML. Para mirar el resultado completo del XML podemos hacer un BreakPoint y ver el resultado:

 xmlresult6

Para recorrer el XML en el código y obtener el valor de los nodos vamos a usar LINQ to XML.

Adicionamos lo siguiente al código, reemplazando  return xml;

// recorrer xml con LINQ
XDocument doc = XDocument.Parse(xml);
var dato = from datos in doc.Descendants("user")
                                  where datos.Element("id") != null
                                  select datos;
 
return "Ok, se ha logueado con el usuario: " + dato.ElementAt(0).Element("screen_name").Value;

Lo que hicimos fue declarar una variable tipo XDocument del namespace System.Xml.Linq, y asignarle el xml resultante, luego creamos una sentencia muy parecida a SQL, el where que escribir en el código sobra, pero lo adicione para mostrar que se pueden filtrar las consultas.

El resultado de la sentencia queda guardado en la variable dato, luego podemos acceder a dicha variable para obtener cualquier nodo:

return "Ok, se ha logueado con el usuario: " + dato.ElementAt(0).Element("screen_name").Value; 

El resultado final adicionando una imagen para mostrar el avatar y pantallas de error son:

 loginfinal7

 loginfinalerror8

 

Para que vean otra forma de crear una aplicación, este link

Para descargar el código AQUI.

Actualización:

Encontre un Link para Construir una aplicación en Twitter con Silverlight 3:

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032434058&EventCategory=4&culture=en-US&CountryCode=US

6 pensamientos en “Aplicación Login de Twitter WPF – Manejando la API de Twitter

    • Para configurar la clase WebClient y permitir que pase a través de un Proxy, necesitas un objeto de la clase WebProxy, luego configurar el WebProxy y luego hacer que la clase WebClient lo tome:
      Ejemplo:
      WebProxy miproxy = new WebProxy(“http://192.168.1.1:123”, true);
      miproxy.Credentials = new NetworkCredential(struserproxy, strpassproxy,strmidominio); // si tienes los datos para acceder al proxy
      //wp.UseDefaultCredentials = True // también puedes usar esta forma y no configurar el password ni el usuario
      using (WebClient cliente = new WebClient())
      {
      cliente.Proxy = myproxy; // aqui asignas el proxy al cliente web
      cliente.Credentials = cred;
      xml = cliente.DownloadString(“http://twitter.com/account/verify_credentials.xml”);
      }

      • estimado, siento molestarlo nuevamente pero no me resulta el hecho de conectarlo a un proxy, si pudieras orientarme de mejor manera seria ideal.

        saludos

    • Pues la verdad no he usado la clase WebClient a través de un Proxy, me imagino que te saldrá un error de acceso restringido.
      Pero para usar la clase webclient y ejecutar un webservice, y necesitamos configurar un proxy, solo debemos crear la instancia de la clase WebProxy:
      WebProxy myProxy = new WebProxy(“http://address:port/”,true);
      si no es necesario autenticarnos, simplemente asignamos el proxy a la instancia de webClient:
      WebClient Cliente = new WebClient();
      Cliente.Proxy = myProxy;
      Luego podrias probar haciendo un llamado a una página:
      try
      {
      cliente.OpenRead(“http://www.google.com”);
      MessageBox.Show(“El proxy esta bien”);
      }
      catch (Exception e)
      {
      MessageBox.Show(“El proxy esta mal configurado, error: ” + e.Message);
      }

      Si puedes decirme que error o que especificamente ocurre, si no, tocará googlear para encontrar la solución jejejejej

Deseas comentar o sugerir algo?

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s