sábado, 14 de enero de 2012

Twitter Automatización


Twitter Automatización

Qué es Twitter? Ni idea. Supongamos que tenemos que escribir unos scripts para manejar la información de una cuenta de Twitter o incluso gestionarla, miramos entonces algunos ejemplos https://dev.twitter.com/docs/open-source-examples. Mmmh, creo que Perl estaría bien. Pero hay alguna librería ya escrita? https://dev.twitter.com/docs/twitter-libraries. Aquí se menciona a Net::Twitter, una librería que implementa la interface a la API de Twitter para hacer cosas como por ejemplo: twittear, enviar mensajes directos, seguir amigos, crear lista, bloquear usuarios, buscar ubicaciones, y todo lo que se puede hacer en Twitter. Pero buscando en http://search.cpan.org/ encuentro otras muchas librerías, en esa lista destaco a AnyEvent::Twitter::Stream, escrita por Tatsuhiko Miyagawa y que sirve para recibir el stream de Twitter en un loop.

Manos a la obra

Twitter no es solo una red social, es un medio de comunicación, el más rápido. Es información compartida en tiempo real. Por eso vamos a leer los tweets en tiempo real con el siguiente ejemplo:

Qué necesitamos?

Creamos una aplicacion nueva en https://dev.twitter.com/apps/new con nuestra cuenta de twitter. La aplicacion tendrá un nombre y una descripción que son obligatorios (la descripción de 10 caracteres o mas), una Website también obligatoria pero puede ponerse "https://dev.twitter.com/apps/new" si no se tiene una, la URL Callback puede dejarse en blanco. Una vez creada nos muestra la información de la aplicación y su Consumer key. Debemos generar un access token ahora con el botón Crear mi Access Token. Luego en la pestaña Configuración podemos cambiar los derechos de acceso: Lectura, Lectura y Escritura, Lectura, Escritura y Mensajes Directos.
Una vez seguidos estos pasos ya podemos escribir el siguiente script y ver como aparecen nuestros tweets y los de nuestros amigos. Necesitamos la Consumer Key y Secret, el Token Access y Secret.

use Data::Dumper;
use AnyEvent::Twitter::Stream;
use strict;

run() unless caller();
1;

sub run{
  my $consumer_key= 'TU-CONSUMER-KEY';
  my $consumer_secret= 'TU-CONSUMER-SECRET';
  my $token= 'TU-TOKEN';
  my $token_secret= 'TU-TOKEN-SECRET';
  read_twitter($consumer_key,$consumer_secret,$token,$token_secret);
  return;
}

sub read_twitter{
   my ($consumer_key,$consumer_secret,$token,$token_secret)=@_;
   my $debug=0;
   local $ENV{'ANYEVENT_TWITTER_STREAM_SSL'} = 'https';
   my $cv= AnyEvent->condvar;
   my $listener = AnyEvent::Twitter::Stream->new(
      consumer_key      => $consumer_key,
      consumer_secret   => $consumer_secret,
      token             => $token,
      token_secret      => $token_secret,
      # "firehose" for everything, "sample" for sample timeline
      method   => "userstream",  
      on_tweet => sub {
         my $tweet = shift;
         print Dumper($tweet) if $debug;
         if ($tweet->{'delete'}{'direct_message'}){
            my $tweet_id= $tweet->{'delete'}{'direct_message'}{'id'};
            my $user_id= $tweet->{'delete'}{'direct_message'}{'user_id'};
            warn "Borrado tweet_id: $tweet_id - user_id: $user_id\n";
         }
         elsif ($tweet->{'direct_message'}){
            my $sender_name= $tweet->{direct_message}{sender_screen_name};
            print "Mensaje Directo: $sender_name\n";
         }
         elsif($tweet->{'friends'}){
            print Dumper(\$tweet);
         }
         elsif($tweet->{'event'}){
            print "Evento: $tweet->{event}\n";
         }
         elsif($tweet->{'user'}){
            my $user_name= $tweet->{user}{screen_name};
            print "Tweet Nuevo: $user_name: $tweet->{text}\n";
            print "Mirando el tweet por dentro:\n".Dumper($tweet)."\n";
         } else{
            print 'Otra cosa';
         }
      },
      on_keepalive => sub {
         warn "ping\n";
      },
      on_connect => sub {
         print Dumper(@_);
      },
      on_error => sub {
         print Dumper(@_);
         $cv->send;
      },
      on_eof=> $cv,
      on_delete => sub {
         # callback executed when twitter send a delete notification
         my ($tweet_id, $user_id) = @_; 
         warn "Borrado tweet_id: $tweet_id - user_id: $user_id\n";
      },
      timeout => 45000,
   );

   $cv->recv;

   print "\n";
   return;
}