Desde su lanzamiento a mediados de 2006, Twitter ha crecido muchísimo siendo el sitio de microblogging más popular. Mucha gente está desarrollando Aplicaciones y Mashups gracias a la API de Twittter, acá te damos una guía para que tú también puedas hacerlo.

twitterUno de los mayores éxitos de Twitter ha sido proporcionar una API funcional desde sus inicios, esto permite que otras personas extiendan las características que Twitter ofrece.

Desarrollen aplicaciones para enviar y compartir nuestros tweets sin estar obligados a utilizar el sitio oficial. Resulta interesante como han surgido diferentes proyectos que nos permiten apreciar y analizar los datos del servicio en diferentes formas. Todo gracias a que Twitter pensó en grande y esta compartiendo sus datos vía la API.

Detalles generales de la API

Para trabajar con la API de Twitter, contamos con la documentación oficial, acá están descritos todos los métodos que podemos utilizar. La API de Twitter está desarrollada en base al estilo arquitectural REST (Representational State Transfer).

Que a diferencia del XML-RPC es un diseño carente de estados y todos los métodos están disponibles en una única URL. Con excepción de algunos métodos públicos, todos los demás requieren de las credenciales de un usuario registrado, donde la autenticación se hace por medio de HTTP. En un futuro cercano Twitter espera ofrecer soporte al esquema OAuth.

La llamada a los métodos se hace por medio de peticiones HTTP GET o POST, según sea el caso. Para los métodos que devolverán datos podemos pedirlos en formato XML, JSON, RSS o ATOM. Cuando realizamos llamadas a los métodos debemos revisar el HTTP Status Code que nos devuelva el servidor de Twitter, si recibimos un código diferente de 200 sabremos que algo ha salido mal y el significado del código dependerá del método que estemos llamado.

Un punto muy importante que debemos tener en claro al trabajar con la API de Twitter, es que tenemos un límite de 70 peticiones por cada hora, por cada usuario (no por aplicación/IP). Los métodos públicos y los que requieren una petición POST no cuentan en este límite.

Esta restricción puede llegar a ser una de las mayores complicaciones cuando desarrollas con la API, hay que procurar optimizar las llamadas para no quedarnos fuera rápidamente. Si realmente necesitas hacer más peticiones, considera usar Jabber.

Enviando peticiones a la API

Para enviar las peticiones a la API de Twitter usaremos la extensión cURL. Para procesar los datos, usaremos XML, aprovechando que en PHP5 contamos con SimpleXML por defecto.

Primero veamos como hacer una petición GET usando cURL:

function getrequest($url,$user,$password)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // no imprimir nada
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERPWD, "$user:$password"); // autenticación
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // para no esperar indefinidamente
    curl_setopt($ch, CURLOPT_GET, 1);

    $result = curl_exec($ch);

    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if( $http_status != "200" ) {
        return null;
    }

    return $result;
}

cRUL se encargará de hacer la petición vía HTTP, nosotros sólo debemos preocuparnos del resultado de esta, que es el valor de $http_status, si es diferente de 200 sabemos que algo ha salido mal. Dependiendo de como diseñemos nuestra aplicación, sería recomendable guardar el valor de $http_status para mostrar un mensaje de error más acorde a las circunstancias. Si queremos saber los últimos 20 estados en el friend_timeline de nuestro usuario, definimos una función para ello:

function getfriendtime() {
    $result = getrequest( 'http://twitter.com/statuses/friends_timeline.xml', $user, $password );
    if ( !$result ) 
       return false;

    $replies = simplexml_load_string( $result );
    return $replies;
}

Como en la petición indicamos que la respuesta fuera un XML, con ayuda de la funcion simplexml_load_string() obtenemos un objeto (en este caso $replies) que represente este XML. Este objeto será un array de hasta viente elementos, donde cada uno contendrá esta información:

object(SimpleXMLElement)#6 (8) {
    ["created_at"]=> string(30) "Tue Apr 08 21:18:14 +0000 2008"
    ["id"]=> string(9) "785335201"
    ["text"]=> string(33) "@prigazzi ah ok, 95% tablefull :D"
    ["source"]=> string(3) "web"
    ["truncated"]=> string(5) "false"
    ["in_reply_to"]=> string(136) "@j_aroche por ahora, estructura general, header, footer, etc, totalmente tableless. El resto, sigue con las tablas que trae de fábrica."
    ["in_reply_to_user_id"]=> string(8) "10312222"
    ["user"]=> object(SimpleXMLElement)#26 (8) {
      ["id"]=> string(6) "849211"
      ["name"]=> string(13) "Javier Aroche"
      ["screen_name"]=> string(8) "j_aroche"
      ["location"]=> string(9) "Guatemala"
      ["description"]=> string(29) "Software Developer since 2002"
      ["profile_image_url"]=> string(85) "http://s3.amazonaws.com/twitter_production/profile_images/52346493/ie7logo_normal.jpg"
      ["url"]=> string(24) "http://javieraroche.com/"
      ["protected"]=> string(5) "false"
    }
}

Como vemos cada tweet incluye toda la información necesaria que podamos necesitar, hasta información del usuario evitándonos tener que hacer peticiones adicionales.

La mayoría de peticiones a la API de Twitter se manejan de forma muy similar, lo único que cambiará es la estructura del XML (como al pedir la lista de followers) o incluso solo tienes que saber cuál fue el valor de $http_status sin tener que interpretar el XML resultante (como al crear un favorito o agregar un nuevo amigo).

Solo hay dos peticiones, un nuevo estado y enviar un mensaje directo, que se manejarán un tanto diferente ya que requieren hacer un POST. Por ejemplo para actualizar el estado de nuestro usuario sería:

function postupdate($username,$password,$message){

    $args= 'status='.urlencode($message);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://twitter.com/statuses/update.xml');
    curl_setopt($ch, CURLOPT_VERBOSE, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // no imprimir nada
    curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);

    $result = curl_exec($ch);
    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if( $http_status != "200" ) {
        return false;
    }

    return true;
}

Es importante que antes de enviar el mensaje lo codifiquemos con urlencode() para no tener problemas si este lleva una URL. Incluso puedes agregar un filtro en el mensaje que detecte urls y la acorte utilizando un servicio adicional.

Siempre es bueno aprender como funciona la API, pero también puedes optar por usar alguna librería/clase para la API de Twitter que te ahorre tiempo de desarrollo.

Trabajar con la API no es complicado, lo que hace falta es tener una idea sobre la cual puedas aprovechar la comunidad detrás de Twitter. Cada día salen interesantes herramientas, tal vez tu tengas la siguiente. 😉