Son muchos los que viven obsesionados con su Twitter. ‘¿Tengo algún seguidor nuevo hoy?’ ‘¡mierda! ¡tengo 2 menos que ayer!’
Dado que no me fío mucho de las herramientas online que te exigen meter tu usuario y contraseña, he hecho unos pequeños scripts para ver mis seguidores, comprobar si me sigue la gente que yo sigo, etc.
Para comenzar, vamos a ver un sencillo script, al que pasándole dos usuarios, nos dice si se siguen entre ellos …
#! /bin/perl # by Pepelux (@pepeluxx) use Net::Twitter; my $nt = Net::Twitter->new(legacy => 0); my ($user1, $user2) = @ARGV; unless($ARGV[1]) { print "Usage: perl $0 <user1> <user2>\n"; exit 1; } my $res = $nt->friendship_exists($user1, $user2); if ($res eq true) { print "$user1 is following $user2\n"; } else { print "$user1 is not following $user2\n"; } $res = $nt->friendship_exists($user2, $user1); if ($res eq true) { print "$user2 is following $user1\n"; } else { print "$user2 is not following $user1\n"; }
Y el funcionamiento es sencillo:
pepelux@debian:~/twitter$ perl amigos.pl Usage: perl amigos.pl <user1> <user2> pepelux@debian:~/twitter$ perl amigos.pl pepeluxx chemaalonso pepeluxx is following chemaalonso chemaalonso is following pepeluxx
Aquí vemos que yo sigo al ‘maligno’ y él me sigue a mí.
pepelux@debian:~/twitter$ perl amigos.pl Usage: perl amigos.pl <user1> <user2> pepelux@debian:~/twitter$ perl amigos.pl pepeluxx reversemode pepeluxx is following reversemode reversemode is not following pepeluxx
En este caso, Rubén no me está siguiendo, a pesar de que yo le sigo hace años … mmm }:->
Bueno, pues esto es un chorrada de script, la verdad, pero nos sirve para ver un poco cómo usar el API de Twitter con Perl.
Tras esto, pensé en hacer algo automático que me sacara toda la gente que sigo y verificara si ellos me siguen a mí, por lo que me creé este otro script:
#! /bin/perl # by Pepelux (@pepeluxx) use Net::Twitter; use WWW::Curl::Easy; my ($user) = @ARGV; unless($ARGV[0]) { print "Usage: perl $0 <user>\n"; exit 1; } my $curl = WWW::Curl::Easy->new; my $nt = Net::Twitter->new(legacy => 0); my $url = "https://api.twitter.com/1/followers/ids.json?cursor=-1&screen_name=$user"; $curl->setopt(CURLOPT_HEADER,1); $curl->setopt(CURLOPT_URL, $url); my $response_body; $curl->setopt(CURLOPT_WRITEDATA,\$response_body); my $retcode = $curl->perform; if ($retcode == 0) { my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); $response_body =~ /\[([0-9|,]+)\]/; my @followers_id = split(/,/, $1); foreach (@followers_id) { print get_user($user, $_)."\n"; } } else { die("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n"); } exit; sub get_user { my $user = shift; my $id = shift; my $url = "https://api.twitter.com/1/users/lookup.json?user_id=$id"; $curl->setopt(CURLOPT_HEADER,1); $curl->setopt(CURLOPT_URL, $url); my $response_body; my $username = ""; my $screenname = ""; $curl->setopt(CURLOPT_WRITEDATA,\$response_body); my $retcode = $curl->perform; if ($retcode == 0) { my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE); $username = $response_body; my $pos = index($username, "\"name\""); if ($pos > -1 && length($username < 100)) { $username =~ /\"name\"\:\"(.+)\"/; $username = $1; $pos = index($username, "\""); $username = substr($username, 0, $pos) if ($pos > -1); } $screenname = $response_body; $screenname =~ /\"screen_name\"\:\"([a-z|A-Z|0-9|-|_|]+)\"/; $screenname = $1; } else { die("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n"); } my $res = $nt->friendship_exists($screenname, $user); my $follow = ""; if ($res eq true) { $follow = " :: is following $user"; } return "$username ($screenname - ID: $id)$follow"; }
Pasando un usuario como parámetro, nos dice los seguidores que tiene y si le siguen a él o no:
pepelux@debian:~/twitter$ perl seguidores.pl Usage: perl seguidores.pl <user> pepelux@debian:~/twitter$ perl seguidores.pl pepeluxx Paul Thompson (raganello - ID: 72968446) Pablo Dom\u00ednguez (PabloDgzRg - ID: 276615022) Jes\u00fas (jesusninoc - ID: 231410165) :: is following pepeluxx Darkasakerionz (Darkasakerionz - ID: 438326182) :: is following pepeluxx p0is0n-123 (p0is0nseginf - ID: 434205269) :: is following pepeluxx ..........
La cosa pintaba bien pero de repente …
"error":"Rate limit exceeded. Clients may not make more than 150 requests per hour.
Cagontó!! 150 por hora??? imposible!!! Así que tras indagar un poco traté de hacer una validación de usuario con el curl pero parece que desde el 2010 no se puede, así que no me quedó otra que crearme un ID de desarrollador en https://dev.twitter.com/apps/new y modificar de nuevo el script, que quedó así:
#! /bin/perl # by Pepelux (@pepeluxx) # to get a key => https://dev.twitter.com/apps/new use Net::Twitter; my ($myuser) = @ARGV; unless($ARGV[0]) { print "Usage: perl $0 <user>\n"; exit 1; } # write here your API KEY data my $consumer_key = "XXXX"; my $consumer_secret = "XXXX"; my $token = "XXXX"; my $token_secret = "XXXX"; my $nt = Net::Twitter->new( traits => [qw/OAuth API::REST/], consumer_key => $consumer_key, consumer_secret => $consumer_secret, access_token => $token, access_token_secret => $token_secret, ); # uncomment this line if you don't want to use an API KEY (only 150 requests) #my $nt = Net::Twitter->new(legacy => 0); my $cont = 0; for ( my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor}) { $r = $nt->friends_ids({screen_name=>$myuser,cursor=>$cursor}); while(@{$r->{ids}}) { my @ids = splice @{$r->{ids}},0,100; my $friends = $nt->lookup_users({user_id=>\@ids}); foreach (@$friends) { my $user = $_; my $screen_name = $user->{"screen_name"}; my $name = $user->{"name"}; print $screen_name." ($name)"; my $res = $nt->friendship_exists($screen_name, $myuser); if ($res eq true) { print " => is following $myuser"; $cont++; } print "\n"; } } print "\nYou follow $#friends\n"; print "You have $cont followers\n"; }
Si lo ejecutamos, podemos ver la gente que sigo y, de ellos, los que me siguen a mí:
pepelux@debian:~/twitter$ perl siguiendo.pl pepeluxx sandrogauci (Sandro Gauci) => is following pepeluxx borjalanseros (Borja Lanseros) => is following pepeluxx k3170Makan (Keith Makan) => is following pepeluxx virtualminds_es (I�aki R.) => is following pepeluxx jordi_prats (Jordi Prats) => is following pepeluxx JordanSec (Jordan) bytemarehack (Daniel Torres) => is following pepeluxx tinpardo (tinpardo) => is following pepeluxx ...........
Si queremos hacerlo a la inversa y listar todos los que nos siguen, usaríamos este otro script:
#! /bin/perl # by Pepelux (@pepeluxx) # to get a key => https://dev.twitter.com/apps/new use Net::Twitter; my ($myuser) = @ARGV; unless($ARGV[0]) { print "Usage: perl $0 <user>\n"; exit 1; } # write here your API KEY data my $consumer_key = "XXXX"; my $consumer_secret = "XXXX"; my $token = "XXXX"; my $token_secret = "XXXX"; my $nt = Net::Twitter->new( traits => [qw/OAuth API::REST/], consumer_key => $consumer_key, consumer_secret => $consumer_secret, access_token => $token, access_token_secret => $token_secret, ); # uncomment this line if you don't want to use an API KEY (only 150 requests) #my $nt = Net::Twitter->new(legacy => 0); my $cont = 0; my @followers; for ( my $cursor = -1, my $r; $cursor; $cursor = $r->{next_cursor} ) { $r = $nt->followers({ screen_name=>$myuser,cursor => $cursor }); push @followers, @{ $r->{users} }; for my $user (@followers) { my $screen_name = $user->{"screen_name"}; my $name = $user->{"name"}; print $screen_name." ($name)"; my $res = $nt->friendship_exists($myuser, $screen_name); if ($res eq true) { print " => $myuser is following"; $cont++; } print "\n"; } print "\nYou follow $cont\n"; print "You have $#followers followers\n"; }
Y en este caso, al ejecutarlo, veríamos algo así:
pepelux@debian:~/twitter$ perl seguidores.pl pepeluxx raganello (Paul Thompson) PabloDgzRg (Pablo Dom�nguez ) jesusninoc (Jes�s) => pepeluxx is following Darkasakerionz (Darkasakerionz) p0is0nseginf (p0is0n-123) => pepeluxx is following CharSecurity ([hat~se[urity) => pepeluxx is following Darkvidhck (David Galisteo) fpalenzuela (Pensador) k3170Makan (Keith Makan) => pepeluxx is following violetaromero3 (violeta romero) ..........
Estos scripts no es que sean muy útiles, pero nos sirven de iniciación para adentrarnos un poco en la API de Twitter. Toda la documentación está aquí: https://dev.twitter.com/
Saludos
Muy bueno pepelux
Yo quiero hacer algo asi pero con python, y realmente para descargar mis tweets que tengo marcados como favoritos que son los que me interesan mas. Como ves?
Saludos 😉
Hola hecky.
Dispones también de librerías para Python. Mira aquí: https://dev.twitter.com/docs/twitter-libraries#python http://code.google.com/p/python-twitter/
Si pepelux ya habia empezado a trabajar con uno pero lo deje =PPP
¡Gracias por la herramienta! Anda mira, si aparezco entre tus seguidores. 😉
Un saludo, y gracias :p
@hecky: Yo he usado python-twitter y tweepy y, personalmente, te recomiendo tweepy, es realmente fácil de utilizar… 😀
saludos!
Con esto ya se podría hacer un script para saber quien te deja de seguir… Un abrazo amigo.
Intente probarlo pero me salto este error
Can’t locate Net/Twitter.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.12.4 /usr/local/share/perl/5.12.4 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.12 /usr/share/perl/5.12 /usr/local/lib/site_perl .) at tw.pl line 4.
BEGIN failed–compilation aborted at tw.pl line 4.
y cuando intento instalar el modulo al final me sal esto
Files=30, Tests=2094, 97 wallclock secs ( 1.75 usr 0.23 sys + 89.09 cusr 3.25 csys = 94.32 CPU)
Result: PASS
MMIMS/Net-Twitter-3.18003.tar.gz
Tests succeeded but one dependency not OK (Crypt::SSLeay)
MMIMS/Net-Twitter-3.18003.tar.gz
[dependencies] — NA
Running make install
make test had returned bad status, won’t install without force
Tienes que instalarte el módulo Net::Twitter