¿Quién me sigue en Twitter?

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



8 comentarios

  1. 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 😉

  2. @hecky: Yo he usado python-twitter y tweepy y, personalmente, te recomiendo tweepy, es realmente fácil de utilizar… 😀

    saludos!

  3. 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

Deja un comentario