焼きサンマ綺麗に食べるブログ

焼きサンマ食べたい

GraphVizで遊んだ

Twitterのfriendsとfollowerをグラフ化しようとしてGraphVizを使ってみた。

いろいろやってみたら100ノードぐらいで限界がきたのでやめた。
なんか載せた図みたいになった(friends 100のみで)。解像度は本当は1536×1472です。


目標は全く達成できてないけどソース載っけてみる。
とりあえず、モジュールNet::TwitterGraphVizの使い方がわかったのでよしとしよう。

#!/usr/bin/env perl

package main;
use strict;
use warnings;
use Carp;
use utf8;

use Net::Twitter;
use GraphViz;

my $username = $ARGV[0];
my $password = $ARGV[1];
my $output_file = $ARGV[2];

my $twit = create_twitter($username, $password);
my @followings = @{ get_followings($twit, $username) };

my $g = GraphViz->new( directed => 1,
                       layout => 'fdp',
                       overlap => 'compress',
                       ratio => 'auto',
                       width => 16,
                       height => 16,
                       node => { fontsize => 10, },
                     );

$g->add_node( $username );
map { $g->add_node( $_ );
      $g->add_edge( $username => $_ );  } @followings;

$g->as_png($output_file);

sub create_twitter {
    my ($user, $pass) = @_;
    
    my $twit = Net::Twitter->new( username => $user, password => $pass);
    return $twit;
}

sub get_followings {
    my $twit = shift;
    my $user = shift;

    my $user_info = $twit->show_user( $user );

    my @followings = ();
    
    #for (my $i = 0; $i <= int ( $user_info->{'friends_count'} / 100 ) ; $i++) {
    for (my $i = 0; $i <= 0 ; $i++) {
        my $temp_followings = $twit->following( { page => $i + 1 });
        map { push @followings, $_->{'screen_name'} } @{ $temp_followings };
        
        #print "$i ", scalar @followings, "\n";
        sleep(1);
    }

    return \@followings;
}

sub get_followers {
    my $twit = shift;
    
    my $temp_followers = $twit->followers();
    my @followers = ();
    map { push @followers, $_->{'screen_name'} } @{ $temp_followers };
    return \@followers;
}
1;
__END__