Twitter desde Silverlight Beta 2

Fácilmente! Esa es la forma en la que podemos obtener desde Silverlight Beta 2 nuestro post en Twitter. Este nos provee de una forma de obtener en diferentes formatos, nuestros últimos post y más información.

Con la siguiente URL: http://twitter.com/statuses/user_timeline/USERNAME.xml podemos obtener en formato XML los post y más información. Solo decir que debemos autenticarnos para poder recibir esta información.

Twitter provee los siguientes formatos: RSS, XML y JSON

Para más información sobre códigos de error posibles, limitaciones de uso, etc: Twitter API Documentation

En el ejemplo de hoy vamos a consumir el último mensaje del usuario de este blog FernandoBlog.

TwitterSL

Para ello crearemos en primer lugar una aplicación Silverlight hospedada en un Sitio Web también creado en el mismo momento. De la forma en la que lo haremos, crearemos un servicio WCF que expondrá un método de obtención de los mensajes del usuario. En la siguiente imagen se puede ver las clases que necesitaremos para tal servicio:

TwitterSL4

  • Service: Expone el contrato del servicio. En este caso dos métodos para obtener los mensajes del usuario identificado y otro para obtener los mensajes de un usuario a cuyos mensajes tenga acceso el usuario identificado.
  • TwitterHelper: Es la clase que realiza la petición HTTP al API de Twitter y donde se procesan los datos recibidos
private List<TwitterPost> GetRequest(string uri)
{
    WebRequest request = HttpWebRequest.Create(uri);

    if (!string.IsNullOrEmpty(_ttUser) && !string.IsNullOrEmpty(_ttPwd))
    {
        request.Credentials = new NetworkCredential(_ttUser, _ttPwd);
    }

    WebResponse res = request.GetResponse();
    StreamReader stream = new StreamReader(res.GetResponseStream());
    TextReader reader = new StringReader(stream.ReadToEnd());

    XDocument xDoc = XDocument.Load(reader);

    return (from post in xDoc.Descendants("statuses").Descendants("status")
           select new TwitterPost
           {
               Id = post.Element("id").Value,
               CreatedAt = DateTime.ParseExact(post.Element("created_at").Value, "ddd MMM dd HH:mm:ss zzzzz yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal),
               Text = HttpUtility.HtmlDecode(post.Element("text").Value)
           }).ToList<TwitterPost>();
}

  • TwitterPost: Representa un mensaje de twitter. El API devuelve mucha información que para este ejemplo solo con el Identificador, el texto del mensaje y la fecha de la creación del mismo nos es suficiente.

 

En la parte de Silverlight simplemente añadiremos una referencia la servicio WCF creado y haremos una llamada al método correspondiente.

public Page()
{
    InitializeComponent();
    ServiceClient client = new ServiceClient();
    client.TwitterPostsCompleted += new EventHandler<TwitterPostsCompletedEventArgs>(client_TwitterPostsCompleted);
    client.TwitterPostsAsync();
}

private void client_TwitterPostsCompleted(object sender, TwitterPostsCompletedEventArgs e)
{
    List<TwitterPost> twitter = e.Result;
    if (twitter.Count > 0)
    {
        TwitterPost lastTwitter = (from post in twitter orderby post.CreatedAt descending select post).First();
        txtPost.Text = lastTwitter.Text;
        txtTime.Text = RelativeCreatedAt(lastTwitter.CreatedAt);
    }
}

Como curiosidad se muestra la función utilizada para mostrar la fecha de creación del mensaje en relación al día en la que se obtiene el mensaje desde Silverlight:

private string RelativeCreatedAt(DateTime _createAt)
{
    TimeSpan _time = DateTime.Now.Subtract(_createAt);

    int _days = Convert.ToInt32(_time.TotalDays);
    if (_days > 0) return string.Format("Hace {0} dia{1}", _days, _days > 1 ? "s" : "");

    int _hours = Convert.ToInt32(_time.TotalHours);
    if (_hours > 0) return string.Format("Hace {0} hora{1}", _hours, _hours > 1 ? "s" : "");

    int _minutes = Convert.ToInt32(_time.TotalMinutes);
    if (_minutes > 0) return string.Format("Hace {0} minuto{1}", _minutes, _minutes > 1 ? "s" : "");

    int _seconds = Convert.ToInt32(_time.TotalSeconds);
    if (_seconds < 0) _seconds = 0;
    return string.Format("Hace {0} segundo{1}", _seconds, (_seconds > 1 || _seconds == 0) ? "s" : "");
}

Finalmente el resultado sería el siguiente.

TwitterSL2

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *