Weitere ähnliche Inhalte
Ähnlich wie 最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析 (16)
Mehr von Masahiro NAKAYAMA (20)
Kürzlich hochgeladen (10)
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
- 6. recent_zombies
• 自分のTLで直近N分に発言した人を数える
– 要するに「今TLに居る人」の数
– Twitter API: User Streams で漏らさず取得
https://dev.twitter.com/docs/streaming-apis/streams/user
– 可視化というぐらいでグラフ表示
– だいたい2時間ぐらいで作った
– とりあえず、直近5分と直近30分で運用
– githubで公開
https://github.com/nekoruri/recent_zombies
- 8. 出力例
直近5分
地震で跳ね上がったけど
Twitterごと落ちた\(^o^)/
直近30分
- 11. イベント駆動
• AnyEvent::Twitter::Stream
– TwitterのUser Streamsを追いかける
– 1件ごとにコールバックが呼ばれる
– ツイートの発言日とuser.idを記録
• AnyEvent->timer
– 1分毎にコールバックが呼ばれる
– 直近60秒、300秒のuser.idの数を数える
– GrowthForecastに投げる
Net::GrowthForecast++
- 13. while(1) {
my $done = AnyEvent->condvar;
my $streamer = AnyEvent::Twitter::Stream->new(
consumer_key => $consumer_key,
consumer_secret => $consumer_secret,
token => $token, Twitterに接続
token_secret => $token_secret,
method => 'userstream',
timeout => 45,
on_tweet => sub {
my $tweet = shift; tweetが来たら
save_tweet($tweet);
}, save_tweetを呼ぶ
on_error => sub {
my $error = shift;
warn "ERROR: $error";
$done->send;
}, エラーやStreamsが切れたら
on_eof => sub { 次のループで再接続
$done->send;
},
);
my $timer;
$timer = AnyEvent->timer(
after => 0, 60秒ごとに
interval => 60,
cb => sub {
update_gfを呼ぶ
update_gf();
},
);
$done->recv; イベント待ち開始
}
- 14. my %tweets;
sub save_tweet
{
my $tweet = shift;
return unless $tweet->{text}; 時刻をunixtimeに
my $ts = Time::Piece->strptime($tweet->{created_at}, "%a %b %d %H:%M:%S %z %Y");
$tweets{$ts->epoch}{$tweet->{user}{id}}++;
}
sub update_gf 1秒毎にuser_idを保存
{
my $now = localtime->epoch;
my $delete_period = 300;
# 古いキーを削除
foreach my $old_key (grep { $_ < $now - $delete_period } keys(%tweets)) {
delete $tweets{$old_key};
} 古すぎるデータは削除
#last60
my @last60_users = uniq( map { keys $tweets{$_} } grep { $now - 60 <= $_ } (keys %tweets));
$gf->post( 'twitter', 'recent_zombies', 'last60', scalar @last60_users);
#last300
my @last300_users = uniq( map { keys $tweets{$_} } grep { $now - 300 <= $_ } (keys %tweets));
$gf->post( 'twitter', 'recent_zombies', 'last300', scalar @last300_users);
}
user_idをuniqして数えて
GrowthForecastに投げる