Mostrando entradas con la etiqueta stream. Mostrar todas las entradas
Mostrando entradas con la etiqueta stream. Mostrar todas las entradas

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