c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

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 LeopardPerlでテスト)。

#!/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スピードメーターとかつくってみたかったんよおっちゃん…。



超久々にPerlでスレッドとか、Basic認証を手で書いたりして、色々思い出したからヨシとします。