TwitterのストリーミングAPIをPerlでガンガンよんだりよまなかったり
TwitterのストリーミングAPIが公開されましたね。
http://apiwiki.twitter.com/Streaming-API-Documentation
curl http://stream.twitter.com/1/statuses/sample.json -uuzulla:PASSWORD
とかするとガンガン流れるのが見れて面白い訳ですよ。
で、こうやって流れてるのを見ると、実際どれくらいの流量があるのかリアルタイムに知りたいじゃないですか?
ってことで、てきとーにPerlで書いてみた(OSX LeopardのPerlでテスト)。
#!/usr/bin/perl $|=1; use strict; use threads; use threads::shared; use Socket; use MIME::Base64; # http://stream.twitter.com/1/statuses/sample.json my $host = 'stream.twitter.com'; my $port = getservbyname('http', 'tcp'); my $iaddr = inet_aton($host) or die "$host:$port host not found\n" ; my $path = '/1/statuses/sample.json'; my $user_id = 'uzulla'; my $password = 'PASSWORD'; my $data :shared = ''; my $thread = threads->new(\&dumpflow, ""); readflow( $host, $port, $iaddr,$path, $user_id, $password); 1; sub readflow { my ($host, $port, $iaddr,$path , $user_id, $password) = @_; my $sock_addr = pack_sockaddr_in($port, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "socket error\n"; connect(SOCKET, $sock_addr) or die "$host:$port connection error\n"; select(SOCKET); $|=1; select(STDOUT); print SOCKET "GET ".$path." HTTP/1.0\r\n"; print SOCKET "Authorization: Basic\r\n "; print SOCKET encode_base64("${user_id}:${password}")."\r\n"; print SOCKET "\r\n"; while (<SOCKET>){ { lock($data); $data .= $_; } } print 'read DONE'; } sub dumpflow { my $_tmp = 0; for(;;){ $_tmp = 0; $_tmp++ while $data =~ /\n/g; print $_tmp. "\n"; { lock($data); $data = ''; } threads->yield(); sleep 1;#何秒毎に出力するか、1ならX Posts/sec、10ならX Posts/10sec。 } }
うごかすよ!
MONO:twitterflowmeter uzulla$ /usr/bin/perl ./engine.pl 14 20 21 19 16 16 23 15 22 19 20 16 21 …
うん、オチをいうとね、どうも20Post/sec以上は出してくれないみたいなんだ、ぎゃふん。
つーか、3秒も考えればそんなの提供されるわけねーってわかるわなwwwTwitterなんてどんだけトラフィックながれてんだって話だよねwアホやw。
でも、もうちょっとリニアに変わってくれるとおもってたんだ…。
本当はこれとFlashのクライアントを連携して、適当Twitterスピードメーターとかつくってみたかったんよおっちゃん…。