15
Dic

Trabajando con Twitter y Java

twitter-social-iconsSi no tienes ni idea de lo que es Twitter estás out, fuera, finito, acabado… y te estás perdiendo el big kahuna del momento en Internet. Te recomiendo que te pongas las pilas y que lo hagas YA.

Si eres un desarrollador y piensas “A mí plin Paquirrín. Eso no tiene nada que ver conmigo“, disculpa si te lo digo con crudeza: eres un looser. Saca durante un instante la cabeza de Hibernate y Spring porque te están impidiendo ver el sol :).

Twitter no es sólo una página güel, no es sólo un “Facebook pero en pequeño” ni la última tontuna de los modernos de turno. Twitter es una plataforma y, como tal, debes aprender a desarrollar para ella. Porque nunca sabes cuándo te puede venir bien utilizarla y porque, créeme, a tus clientes les puede parecer más o menos interesante que utilices Toplink, Hibernate o SQL con escoplo y martillo, pero es probable que alguno te pida algo para Twitter. ¿Quieres quedar como un zocolotroco desfasado o como un gurú del Interné? Invertir 5 minutos en la lectura de este articulo separa una cosa de la otra.

¿UNA PLATAFORMA?

Si amigo, Twitter  es una plataforma. Y ¿por qué es una plataforma? Porque te proporciona una completa API REST para que utilices todos los servicios que ofrece desde tu propia aplicación de una forma sencilla y gratuita.

Ésta es la clave del éxito de páginas como Twitter o Facebook, su espíritu de auténticas plataformas donde terceros desarrollen sus propias aplicaciones.

plataforma

Sí, twitter es una plataforma, pero NO de este tipo...

Sí, Facebook está muy bien, pero ¿alguien puede imaginárselo sin los cientos de juegos del tipo “¿Quien es el más listo de tus amigos?” o “El Granjero que llevas dentro”? ¿Y sin las miles de aplicaciones para enviar osos amorosos o bocatas de calamares a tus amigos? La genialidad de Twitter y Facebook es conseguir que terceros desarrollen, sin coste alguno para ellos, y hagan crecer y enriquezcan la plataforma. ¿Que esos terceros también se lucran? “Genial”, piensan ellos, así ganamos todos.

Por poneros un ejemplo de lo que NO es una plataforma, tenemos a nuestro propio clon local y reggaetonero de Facebook: el Tuenti. No hay un enlace a “Desarrolladores” o a “API” en la web de Tuenti. Ellos se lo guisan y ellos se lo comen. Vale, veremos como les va, pero, de momento, van cuesta abajo y sin frenos.

VALE ¿CÓMO EMPEZAMOS?

Lo primero que tienes que hacer es dar de alta una cuenta en Twitter. ¿Por qué? Porque con esa cuenta podrás registrar tus aplicaciones. Necesitamos registrar las aplicaciones en Twitter para utilizar OAuth como medio de autenticación.

La verdad, podríamos pasar del OAuth para hacer nuestra primera aplicación, pero ya que nos ponemos a juguetear con Twitter, mejor aún si aprendemos algo nuevo y ¡Carambolas! ¡El OAUth mola! :)

Key y Secret de Oauth que se obtiene al registrar la aplicación

Key y Secret de Oauth que se obtiene al registrar la aplicación

Hablar de OAuth no es el objetivo de este post, pero lo describiré de un modo breve. Básicamente, el método de autenticación OAuth se basa en que, el usuario no se autentica en tu web mediante usuario y contraseña sino que lo hace en la plataforma que gestione la autenticación (por ejemplo, Twitter) y ésta te da un token de autenticación que es el que tu guardas y utilizas para comunicarte en el futuro con dicha plataforma.

Evidentemente, ese token vale para y SÓLO para tu aplicación. Ahí está el truco. Y, para que la plataforma sepa qué aplicación es la que está requiriendo autenticación, te proporciona unas claves que tú envías cuando haces las llamadas de validación de claves. Twitter, al registrar una aplicación, te da las claves necesarias para  trabajar con OAuth desde tu aplicación.

Ah, una última cosa: como desarrolladores, Twitter nos asigna una serie de cuotas para el uso de sus servicios (recordemos, gratuitos). En concreto, 150 llamadas a la API por hora y por IP/Cuenta de Usuario.

Si nos hemos emocionado con todo esto de las plataformas y tenemos pensado desarrollar La Madre de todas las Aplicaciones de Twitter, podemos solicitar en este enlace que nos amplíen la cuota hasta 10.000 llamadas a la hora, pero, de momento, no creo que sea necesario.

Ahora sí, tenemos todo lo que hay que tener para empezar a desarrollar nuestra primera aplicación para Twitter.

MANOS A LA OBRA

Como hemos comentado antes, la API para trabajar con Twitter es una API REST. Si no sabes lo que es REST, aquí tienes un excelente artículo :P sobre el tema, pero, en cualquier caso, no te preocupes. No te hace falta saber absolutamente nada de REST porque utilizaremos uno de los envoltorios Java que ya están creados. Si eres capaz de invocar un System.out.println(), serás capaz de trabajar con esta API.

En la propia página de librerías Twitter tienes un montón de frameworks ordenados por lenguaje. Voy a centrarme en las opciones que hay para Java, el lenguaje que utilizo y amo, y dentro de éstas, en Twitter4j. Más que nada, porque es la que mejor diseño y documentación tiene.

Vamos a ir describiendo, paso por paso, cómo crear nuestra aplicación java/twitter:

  1. Descargamos la librería de la web de Twitter4j. En un fichero zip, encontraremos tanto la librería en sí como el resto de librerías que necesita para funcionar y, si lo preferimos, un fichero pom de Maven con todas las dependencias.
  2. Instalamos el conjunto de librerías, tanto Twitter4j como aquellas de las que depende, haciéndolas accesibles a nuestro classpath
  3. Nos crearemos la clase BoniTwitterTest donde copiaremos el siguiente código:
  4. [java autolinks="false" classname="BoniTwitterTest" collapse="true" firstline="1" gutter="true" htmlscript="false" light="false" padlinenumbers="false" smarttabs="true" tabsize="4" toolbar="true"]

    import twitter4j.Twitter;
    import twitter4j.TwitterException;
    import twitter4j.Status;
    import twitter4j.http.RequestToken;
    import twitter4j.http.AccessToken;

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Hashtable;

    public class BoniTwitterTest {

    private static Hashtable<String, AccessToken> almacen = new Hashtable<String, AccessToken>();

    public static void main(String args[]) throws Exception {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
    Twitter twitter = getTwitter();
    System.out.println("Introduzca su nombre de usuario:");
    String usuario = br.readLine();
    AccessToken accessToken = almacen.get(usuario);
    while (accessToken == null) {
    RequestToken requestToken = twitter.getOAuthRequestToken();
    System.out.println("Visita la siguiente página web y autoriza el acceso a tu cuenta:");
    System.out.println(requestToken.getAuthorizationURL());
    System.out.print("Una vez visitada, introduce el PIN y pulsa enter:");
    String pin = br.readLine();
    try {
    if (pin.length() > 0) {
    accessToken = twitter.getOAuthAccessToken(requestToken, pin);
    } else {
    accessToken = requestToken.getAccessToken();
    }
    // Se guarda el token de autenticación para utilizar en un futuro
    storeAccessToken(usuario, accessToken);
    } catch (TwitterException te) {
    if (401 == te.getStatusCode()) {
    System.out.println("No ha sido posible obtener el token de autentiación");
    } else {
    te.printStackTrace();
    }
    twitter = getTwitter();
    }
    } // FIN del bucle WHILE que asegura la autenticación
    twitter.setOAuthAccessToken(accessToken);
    System.out.println("Introduzca su nuevo estado de Twitter o NADA si desea salir y pulse ENTER:");
    String status = br.readLine();
    if (status == null || status.length() == 0) {
    System.out.println("Gracias por usar la aplicación. Adios !!!");
    System.exit(0);
    } else {
    Status tstatus = twitter.updateStatus(status);
    System.out.println("Se ha actualizado con exito el estado a [" + tstatus.getText() + "]");
    }

    } // FIN del bucle WHILE principal de la aplicación

    }

    /**
    * Este metodo nos devolvera una instancia del objeto Twitter con la OAuyth Key y el OAuth Secret configurados
    * @return una instancia del objeto Twitter
    */
    private static Twitter getTwitter() {
    Twitter twitter = new Twitter();
    twitter.setOAuthConsumer("OAuth Key", "OAuth Secret");
    return twitter;
    }

    /**
    * Guarda el token de autenticación de un usuario en una Hashtable
    * @param usuario el ID de usuario que servira como clave de guardado
    * @param at el token de autenticación
    */
    private static void storeAccessToken(String usuario, AccessToken at) {
    System.out.println("USUARIO TWITTER " + usuario);
    System.out.println("TOKEN " + at.getToken());
    System.out.println("TOKEN SECRET " + at.getTokenSecret());
    almacen.put(usuario, at);
    }

    }[/java]

  5. Tenéis que sustituir las cadenas de texto  ‘OAuth Key‘ y ‘OAuth Secret‘ por las claves que os haya proporcionado Twitter al registrar vuestra aplicación.
  6. ¿Que qué hace este código? Pues, básicamente, comprobar si tenéis el token de validación de un usuario en el sistema y, si no lo tenéis, pediros que visitéis una web para obtener un código o PIN de autorización que demuestre que el usuario ha autorizado a tu aplicación a acceder a la API de Twitter en su nombre.
    Esta es la web en la que el usuario autoriza o no a tu aplicación para trabajar en tu nomre en Twitter

    Ésta es la web en la que el usuario autoriza o no a tu aplicación para trabajar en tu nombre en Twitter

    Este es el PIN que te proporciona Twitter para que introduzcas en tu aplicación

    Éste es el PIN que te proporciona Twitter para que introduzcas en tu aplicación

  7. Una vez que introduces el PIN, obtienes el token de autenticación y ya puedes solicitar los servicios de Twitter en nombre del usuario autenticado.
  8. Nuestra pequeña aplicación, se limitará a solicitarnos el status con el que queremos actualizar la cuenta de Twitter del usuario autenticado.
  9. Si actualizamos el status con la frase ‘Actualizando el Estado de Twitter desde mi propia aplicación Java‘ podremos comprobar como en la cuenta de Twitter del usuario -en este caso, yo- el estado se ha modificado:

    twitter2

    Fijaos en que pone que el estado se ha modificado desde 'Prueba David' el nombre de mi aplicación registrada

Si accedéis a la API de Twitter desde una aplicación web, podréis redirigir el flujo de la aplicación a la página de autenticación y configurar dicha página para que invoque una de vuestras páginas mediante callback. Mola ¿verdad? Se autentican en Twitter y continúan en tu aplicación proporcionándote el PIN de autenticación de paso.

Evidentemente esta aplicación es una chorrez como un piano, pero es un ejemplo claro y sencillo sobre cómo registrar una aplicación en Twitter, cómo autenticar a un usuario mediante OAuth y cómo manejar su pool de servicios en nombre de ese usuario. A partir de aquí, enriquecer y hacer crecer esta mini aplicación, depende de vosotros. Seguro que se os ocurren un montón de ideas, simplemente estudiando las posibilidades de la API, pero os voy a proponer algo: ¿No creéis que sería interesante para un departamento de marketing una aplicación que buscara menciones de los productos de una compañía en los tweets de la gente y que guardara los IDs de la gente para, posteriormente mandarles tweets de respuesta con ofertas o comunicados? Yo, al menos, conozco a más de un gurú del marketing muuuy interesado :)

Espero que este humilde tutorial os haya servido de ayuda y os anime a crear la nueva killer application de esa pequeña gran plataforma llamada Twitter.

Algunos links de interés

API REST DE TWITTER: http://apiwiki.twitter.com/Twitter-API-Documentation

API JAVA TWITTER4J: http://yusuke.homeip.net/twitter4j/en/javadoc/index.html