Jugando con Java y el API de Twitter

Twitter tiene un API muy completa que nos permite interactuar con su servicio desde nuestras aplicaciones. Esta tarde he estado enredando un poco con ella y la verdad es que se me ocurren un montón de aplicaciones prácticas(logueos, análisis automáticos, integración en servicios de noticias, estadísticas, seguimiento de usuarios, actualizaciones automáticas del perfil, etc…)

Existen librerías en un montón de lenguajes que facilitan aún mas su uso. Pero en este caso yo he preferido programar un servicio desde cero (lo cual, gracias a la documentación del API no ha sido nada complicado).

El siguiente ejemplo es una aproximación sencilla que permite actualizar nuestro estado (enviar un post) desde aplicación Java.

/*
 *   http://creativecommons.org/licenses/by-nc/3.0/deed.es
 */

package org.francho.java.twitter;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
// http://commons.apache.org/codec/
import org.apache.commons.codec.binary.Base64;

/**
 *
 * @author francho - http://francho.org/lab/
 */
public class Twitter {

    private String username;
    private String pass;
    private String response;

    Twitter(String username, String pass) {
        setCredentials(username, pass);
    }

    /**
     * Ejemplo de acción implementada.
     *
     * Actualiza el estado de Twitter con el texto que recibe
     *
     * @param status
     */
    public void statusesUpdate(String status) {
        try {
            URL url = new URL("http://twitter.com/statuses/update.xml");
            status = URLEncoder.encode(status, "UTF-8");
            String parametros = "status=" + status;
            doTwitterRequest(url, parametros);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Se encarga de la conexión con Twitter.
     * Necesita tener precargada los datos de autentificación (constructor), la url y los parámetros
     */
    private void doTwitterRequest(URL url, String parametros) {
        response = "";
        try {
            // Creamos una conexión
            URLConnection conn;
            conn = url.openConnection();
            conn.setAllowUserInteraction(false);
            conn.setDoOutput(true);

            // Configuramos la autentificación (sencilla basada en HTTP)
            conn.setRequestProperty("Authorization", "Basic " + getBasicCredentials());

            // Preparamos la conexión con el servidor (vamos a mandar un formulario por post)
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // Abrimos el canal de comunicación de envío
            DataOutputStream out = new DataOutputStream(conn.getOutputStream());
            // Mandamos los parámetros de la acción que (los ha tenido que precargar el método correspondiente)
            out.writeBytes(parametros.toString());
            // Nos aseguramos de que todo se envíe
            out.flush();
            // Ya hemos dicho lo que teníamos que decir, así que cerramos la conexión de envio
            out.close();

            // Capturamos la respuesta
            BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            String l = "";
            while ((l = input.readLine()) != null) {
                response += l + "\n";
            }

        } catch (IOException ex) {
            Logger.getLogger(Twitter.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

    public void setCredentials(String username, String pass) {
        this.username = username;
        this.pass = pass;
    }

    public String getBasicCredentials() {
        byte[] credentialsBytes = (username + ":" + pass).getBytes();
        byte[] encodedBytes = Base64.encodeBase64(credentialsBytes);
        return new String(encodedBytes);
    }

    public String getResponse() {
        return response;
    }
}

Este sería un ejemplo de uso de nuestra clase:

/*
 *   http://creativecommons.org/licenses/by-nc/3.0/deed.es
 */

package org.francho.java.twitter;

import java.util.Date;

/**
 *
 * @author francho - http://francho.org/lab/
 */
public class Test {
    public static void main(String[] args) {
        Twitter twitter = new Twitter("yoEnTwitter", "miclave");

        Date ahora = new Date();

        twitter.statusesUpdate("Jugando con Java y el API de Twitter " + ahora);
        System.out.println(twitter.getResponse());
    }
}
About these ads

Acerca de francho

Maño, unutopico, geek, artesano de software, aprendiz ágil, programador Android en activo, sysop retirado, linuxero de corazón, papá a tiempo completo... Más en francho.org/about

Publicado el 9 enero, 2010 en Banco de pruebas, Java y etiquetado en , , , . Guarda el enlace permanente. 16 comentarios.

  1. A esto me refería de sacar partido a Twitter : http://www.followbase.com/ (atención al cliente y soporte a través de Twitter)

  2. Hola loco, estoy emepzando con java y este post está bastante bueno. En un rato me voy a poner a hacer unas pruebas a ver que sale. Gracias por compartir.

  3. hey amigo me marca error en
    20.-import org.apache.commons.codec.binary.Base64;
    de la clase twitter tengo q bajar una librerio o q

  4. Yo tb he echo algunas cosillas con el API de Twitter, en C# (que por cierto, de no ser por los “imports” de arriba, creo que este código en java es casi idéntico!)

  5. Jeje, bueno es saberlo. La verdad es que nunca me he metido con el C# pero el código que he visto por ahí no me ha costado nada leerlo ;)

  6. hey amigo yo estoy programando en la plataforma de eclipse es lo mismo o q y ¿el codigo funciona con el eclipse?

  7. akumetsu, si tienes bien configurado el SDK de Java no tiene porque haber ningún problema.

    Eso si, ten en cuenta que debes añadir a tu proyecto la librería de apache para el base64

  8. Hola Francho, solo unas cuantas preguntas que no me queda claro, por que en haces uso de la libreria de apache, en que parte del programa haces uso de dicha libreria y por que mencionas android, acaso esto es para un mobil¿?

    Gracias …

  9. Youdy, el ejemplo está escrito en Java, pero podría usarse con unos pequeños cambios en Android.

    De todas formas si deseas desarrollar una aplicación “seria” te recomendaría que usaras la librería Twitter4j (http://twitter4j.org/) que incorpora todo lo necesario (incluso la autentificacion oauth).

    Si te interesa mucho el tema, la gente de O’Reilly hace unos meses saco un webminar que explicaba paso a paso como hacer una aplicación de Twitter completa para Android. Tienes los detalles en:

    http://broadcast.oreilly.com/2010/05/android-twitter-app-oauth.html


  10. Youdy:

    Hola Francho, solo unas cuantas preguntas que no me queda claro, por que en haces uso de la libreria de apache, en que parte del programa haces uso de dicha libreria y por que mencionas android, acaso esto es para un mobil¿?
    Gracias …

    jeje. muchas gracias por responde, la verdad crei que duraria añoos, disculpa la insistencia, para que usas apache, se podria correr la aplicacion si dicha libreria de apache???

    gracias de nuevo, :D

  11. Youdy, la librería de apache la uso es org.apache.commons.codec.binary.Base64 y se utiliza para “encodear” las credenciales (línea 105).

    De todas formas creo haber leido por algún lado que desde hace unas semanas Twitter ya no admitia este tipo de autentificación (basic). Mira http://apiwiki.twitter.com/ para más info.

    Un saludo

  12. gracias, me ah sido util la info… :D, estaremos en contacto!

  13. Yo confirmo, que ese tipo de autentificación ya no vale para Twitter, podrias actualizar el post, o de alguna forma, decir como se puede realizar la autentificación por oauth con Twitter, pero con conexion HTTP.

    Muchisimas gracias!

  1. Pingback: Bitacoras.com

  2. Pingback: Tweets that mention Jugando con Java y el API de Twitter « {francho(lab)} -- Topsy.com

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 1.025 seguidores

%d personas les gusta esto: