Skip to content

Instantly share code, notes, and snippets.

@jesboat
Created February 19, 2013 07:29
Show Gist options
  • Save jesboat/4983791 to your computer and use it in GitHub Desktop.
Save jesboat/4983791 to your computer and use it in GitHub Desktop.
A quick hack to Graphviz-ify your Facebook friends.
#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
use JSON::Syck qw(Load Dump);
use DB_File;
my $URL = 'https://graph.facebook.com/%s?method=GET&format=json&access_token=XYZ';
my $mech = WWW::Mechanize->new(autocheck => 0);
my %CACHE;
tie %CACHE, DB_File => 'query_cache.bdb'
or warn "Couldn't open query_cache.bdb: $!\n";
sub query {
my ($q) = @_;
if (not $CACHE{$q}) {
print STDERR "GET $q\n";
$mech->get(sprintf $URL, $q);
if (! $mech->success) {
die "Request for $q failed: ", $mech->status, "\n", $mech->content;
}
$CACHE{$q} = $mech->content;
}
return Load($CACHE{$q});
}
my %UID_TO_NAME;
my %MUTUALS;
my %FRIEND_UIDS;
sub get_friends {
my $result = query('me/friends');
my $friends = $result->{data};
for my $fr (@$friends) {
$UID_TO_NAME{$fr->{id}} = $fr->{name};
$FRIEND_UIDS{$fr->{id}} ++;
}
}
sub get_mutuals {
for my $friend (keys %FRIEND_UIDS) {
my $res = query("me/mutualfriends/$friend");
my $muts = $res->{data};
for my $mut (@$muts) {
$MUTUALS{$friend}{$mut->{id}} ++;
}
}
}
sub show_friend_list {
for my $fr (keys %FRIEND_UIDS) {
my @muts = keys %{$MUTUALS{$fr}};
my $count = @muts;
print "$fr: $UID_TO_NAME{$fr}: $count\n";
for my $mut (@muts) {
print " $mut: $UID_TO_NAME{$mut}\n";
}
}
}
sub top_by_mutuals {
my @mut_ids = keys %MUTUALS;
@mut_ids = sort { keys %{$MUTUALS{$a}} <=> keys %{$MUTUALS{$b}} } @mut_ids;
@mut_ids = reverse @mut_ids;
for my $idx (0 .. 9) {
print "$mut_ids[$idx]: $UID_TO_NAME{$mut_ids[$idx]}\n";
}
}
sub make_gv {
print "graph G {\n";
print " size=\"80,80!\";\n";
for my $fr (keys %FRIEND_UIDS) {
print " u$fr [label=\"$UID_TO_NAME{$fr}\"];\n";
}
while (my ($fr, $muts) = each %MUTUALS) {
for my $mut (keys %$muts) {
if ($fr < $mut) {
print " u$fr -- u$mut;\n";
}
}
}
print "}\n";
}
get_friends();
get_mutuals();
#top_by_mutuals();
make_gv();
#show_friend_list();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment