古い記事
ランダムジャンプ
新しい記事
今日から始まった謎のツイッタードラマ(?)を横目に、ツイッターの Streaming API を試してみました。この本を参考にしました。

辻村浩 / Twitter API プログラミング

(ref. [2010-04-14-1])

ストリーミングAPIって何かというと、タイムラインがひたすらだらだらと流れ続けるAPIです。
以下紹介するのは契約無しで自由に使えるバージョンで、タイムラインから適当に間引いて全体の5%くらいが取得できるみたい。
噂では億単位のお金を払えばほぼ100%取れたりするみたいだけどよく分からない。

使い方を curl コマンドで説明。

JSONで欲しい場合はこう(U=アカウント名、P=パスワード):
curl -uU:P http://stream.twitter.com/1/statuses/sample.json

XMLで欲しい場合はこう:
curl -uU:P http://stream.twitter.com/1/statuses/sample.xml

特定のキーワードにマッチするのだけフィルタリングもできます。
「google」を含むツイートだけ取り出すには:
curl -uU:P -dtrack=google http://stream.twitter.com/1/statuses/filter.json
(curl の「-d」オプションは POST します。詳しくは「man curl」)

Perl のサンプルプログラムをどうぞ。
さくらの500円レンタルサーバで動くように書きました(JSON.pm は必要)。
日本語のユーザの最新のつぶやきを取ってきて100件単位で出力します。
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
use utf8;
use open ':utf8';
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my $user = "apipix";
my $passwd = "PASSWORD";
my $ep = "http://stream.twitter.com/1/statuses/sample.json";
my $cmd = "/usr/bin/curl -u$user:$passwd --stderr /dev/null $ep";

if (open(my $fh, '-|', $cmd)) {
    my @tweets = ();
    while (<$fh>) {
        my $j = from_json($_);
        next unless $j->{'user'} and $j->{'user'}{'lang'} eq "ja";
        push @tweets, $j;
        if (@tweets == 100) {
            proc(\@tweets);
            @tweets = ();
        }
    }
    close $fh;
}

sub proc {
    my ($j_ref) = @_;
    foreach my $j (@$j_ref) {
        print "$j->{'user'}{'name'}: $j->{'text'}\n";
    }
}

実際に使う場合は、あとから解析・分析することを前提に、数分くらいの単位でファイルに書き出すようなロジックにして、どんどんデータを蓄積していくと良いかと。
もちろんオンメモリでがっつりやっちゃってもいいし。
参考書籍:
徳山豪 / オンラインアルゴリズムとストリームアルゴリズム (アルゴリズム・サイエンスシリーズ 5 数理技法編)

(ref. [2007-09-13-2])

ちなみに、Streaming API を使うにあたって専用の別アカウントを取りました。使い方を間違ってアカウント停止になっちゃうと困るからね。
専用アカウントはこちらです→@apipix
絶賛自作自演中です。