sábado, 6 de febrero de 2010

Actualizar Twitter desde .net

Actualizar y recuperar el timeline de Twitter desde .net

Luego de una larga ausencia (que no se repetirá hasta que se repita) dejo un pequño ejemplo autodescriptivo sobre cómo actualizar y recuperar el timeline de Twitter con nuestro querido .net

Es un gran ejemplo sobre REST y las facilidades de System.Net y de LinqToXML, enjoy


using System;
using System.Linq;
using System.Net;
using System.Text;
using System.Xml.Linq;

namespace twitterUpdater
{
    /// <summary>
    /// Ejemplo sobre cómo actualizar twitter y leer el timeline desde .net
    /// http://apiwiki.twitter.com/Twitter-API-Documentation
    /// </summary>
    class Program
    {
        /// <summary>
        /// Nuestras credenciales de twitter
        /// </summary>
        public NetworkCredential Credential
        {
            get
            {
                return new NetworkCredential("leomicheloni", "mi_password");
            }
        }

        static void Main(string[] args)
        {
            var p = new Program();

            //Actualizamos nuestro estado
            p.Update("puedo tuitearte?");

            //traemos el timeline
            p.GetTimeLine();

            Console.ReadLine();
        }

        public void Update(string status)
        {
            var url = "http://twitter.com/statuses/update.xml?status={0}";

            var request = HttpWebRequest.Create(String.Format(url, status));

            request.ContentLength = 0; //el largo del contenido HTTP es cero porque todo lo necesario va en la url
            request.ContentType = "application/x-www-form-urlencoded"; ;
            request.Credentials = Credential; //nuestras credenciales de twitter
            request.Method = "POST"; //para enviar usamos el verbo POST

            //simplemente enviamos el request
            var response = request.GetResponse() as HttpWebResponse;

            if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Continue)
                throw new ApplicationException(response.StatusCode.ToString());
        }

        /// <summary>
        /// Recupera la actividad de las personas que seguimos y de nosotros mismos
        /// </summary>
        public void GetTimeLine()
        {
            var url = "http://twitter.com/statuses/friends_timeline.xml?count=3";

            var request = HttpWebRequest.Create(url);

            request.ContentLength = 0;
            request.ContentType = "application/x-www-form-urlencoded"; ;
            request.Credentials = Credential;
            request.Method = "GET"; //en este caso el verbo HTTP es GET

            var response = request.GetResponse() as HttpWebResponse;

            if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Continue)
                throw new ApplicationException(response.StatusCode.ToString());

            //recuperamos la respuesta
            var stream = response.GetResponseStream();

            var length = response.ContentLength;

            var buffer = new byte[length];

            stream.Read(buffer, 0, (int)length);

            var xml = Encoding.UTF8.GetString(buffer);

            //la respuesta es un xml como se especifica en http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-friends_timeline
            var doc = XDocument.Parse(xml);

            var statuses = from item in doc.Document.Element("statuses").Nodes().ToArray()
                           select (item as XElement);

            foreach (var status in statuses)
            {
                Console.WriteLine(status.Element("user").Element("name").Value + " = " + status.Element("text").Value);
            }
        }
    }
}

2 comentarios:

Shumito dijo...

great!

FAQ dijo...

Tengo una pregunta, intenté correr este programa pero no pude obtener el timeline completo(es decir response) viene incompleto, y no bien formado. algunos tag sin cerrar especificamente. Cuando intenta parsear el xml salta el error,alguna idea ? Gracias por compartir esto.