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; }