Twiteando desde C#: Leyendo tweets

A estas alturas de la serie conocemos las bases para twittear desde C# y ya hemos enviado nuestro primer tweet. Para cubrir mi objetivo inicial ya sólo queda una cosa más: poder leer tweets.

El API REST para leer Tweets

Twitter agrupa los tweets en timelines, que son ni más ni menos que las distintas opciones que nos aparecen en la propia página de Twitter: el timeline global con lo que vamos escribiendo y van escribiendo aquellos a los que seguimos, el timeline sólo con nuestros tweets, el timeline de menciones, etc.

El acceso a todos los timelines es similar por lo que nos centraremos en el home timeline, que incluye nuestros tweets y los de aquellos a los que seguimos. Para acceder a este timeline tenemos que usar el API REST de acceso al home timeline.

A la hora de cargar datos desde un timeline podemos jugar con varios parámetros, pero seguramente los más interesantes sean los que nos permiten acotar los resultados. La paginación de un timeline tiene su miga, porque al tratarse de una lista de eventos que se actualiza en tiempo real un sistema de paginación tradicional presenta algunos problemas.

De momento vamos a limitarnos a descargar los últimos N tweets del timeline sin preocuparnos de nada más. En la documentación sobre cómo trabajar con timelines se explica con mayor detalle las alternativas que tendríamos para decidir qué tweets descargar.

A diferencia de escribir un tweet, para esto se usa una petición GET por lo que los parámetros van en la URL en lugar de en el cuerpo:

var count = 20;
var request = (HttpWebRequest)WebRequest.Create("http://api.twitter.com/1/statuses/home_timeline.xml?count={0}".FormatWith(count));
request.Method = "GET";

Los parámetros de la URL irían codificados en RFC3986, igual que cuando los mandamos con un POST, pero en este caso al tratarse solamente de un número no es necesario codificar nada.

Autorizando la petición con OAuth

Como siempre que usamos el API REST de Twitter, necesitamos añadir la cabecera de autorización OAuth. El procedimiento es idéntico al indicado en el post anterior así que os lo ahorro.

La única cosa con la que hay que tener más cuidado es la generación de la firma, que como ya dije se calculaba a partir de una cadena con este formato:

method&url&parameters

Hay que tener en cuenta varias cosas:

  • El método HTTP para esta petición es GET.
  • La url no contiene los parámetros. Es decir, en nuestro caso la url completa de la petición sería algo así como http://api.twitter.com/1/statuses/home_timeline.xml?count=14, pero para la firma sólo hay que incluir http://api.twitter.com/1/statuses/home_timeline.xml.

Procesando la respuesta

Al enviar un tweet el contenido de la respuesta del servidor nos daba igual, ya que si había algún problema Twitter devolvería un error HTTP y se generaría una excepción, por lo que si no había excepción es que todo había funcionado. En este caso sí que nos interesa la respuesta, puesto que la información que queremos obtener se encuentra en la respuesta a la petición web.

Si recordáis el primer post de la serie, decíamos que se podía elegir el formato de la respuesta y en el segundo explicábamos que para ello se cambiaba la parte final de la URL entre .json, .xml o cualquiera de los formatos soportados.

Aunque JSON es mucho más moderno, más cool, más eficiente y más todo, he preferido usar XML por una simple razón: el soporte para XML en .NET es mucho mejor que el soporte para JSON (a menos, claro, que uses librerías externas como la excelente Json.NET).

Para extraer la información de la respuesta necesitamos un código parecido a éste:

using (var stream = response.GetResponseStream())
    return XDocument.Load(new XmlTextReader(stream))
        .Descendants("status")
        .Select(x => x.Element("text").Value)
        .ToArray();

Sólo estamos extrayendo el contenido del tweet, pero se pueden extraer muchos más datos (usuario, hora, geolocalización,…).

El resultado completo

He dejado un gist con el código completo para descargar tweets. A poco que os fijéis, si lo comparáis con el código de escribir un tweet veréis que está casi todo repetido y sigue siendo feo. Bueno, ya llegará el momento de arreglarlo. De momento, ahí lo dejo como referencia para el que le pueda ser útil.

5 comentarios en “Twiteando desde C#: Leyendo tweets

  1. hola!!..sería posible que en un futuro post publicaras algo sobre twitter stream?..para recibir los resultados en tiempo real…el proceso es similar o tiene muchas variantes??…gracias

  2. No he probado a usar los streams, así que no puedo decirte mucho sobre ellos.

    Supongo que la parte de autorización sería similar, pero a la hora de parsear la respuesta no podrías usar un XDocument/XmlDocument porque no tienes toda la respuesta de golpe sino que la recibes poco a poco, así que imagino que tendrías que jugar con un XmlSerializers o XmlReaders.

    Puede ser un tema interesante para un post, tal vez próximamente…

  3. Como harias para indexar a los seguidores de alguien, y a su vez indexar a los seguidores de esos seguidores, de tal manera de poder tener una BD de todo el entorno que te esta siguiendo, y cuales son sus ramificaciones ? Esto seria posible ?
    Y si tengo 200.000 seguidores ? Sigue siendo posible ?

  4. Podrías utilizar el API de GET followers/ids para ir construyendo el árbol, pero ten en cuenta que twitter pone un límite en el número de peticiones que puede hacer una aplicación.

    Si vas almacenando los datos en una base de datos local, seguramente con paciencia y el tiempo suficiente serías capaz de reconstruir ese grafo. Lo que no sabría estimar es el tamaño que puede tener. Depende mucho del número de niveles que quieras indexar, pero el crecimiento tiene pinta de ser casi exponencial (no exactamente exponencial porque los followers se solapan entre ellos, especialmente en los primeros niveles).

  5. tengo una pregunta se puede utilizar la ddl de twiterizer y tweetSharp para recibir los ultimos tweet en c# con silverlight con la nueva version del Api de twitter, lo he estado intentanto pero aun no he podido algún consejo

Comentarios cerrados.