Twitterでつぶやかれたリンクをすべて取得できないかなと考えていた。 そこでまずリンクが分量的にどのくらいのスピードで流れているか確認したい。
「http」とかの検索ワードで検索APIを一定時間おきに叩くというのが簡単にできそうだけど、分量が多すぎて抜け漏れがありそうだし、なんかスマートじゃない。
Twitter Streaming APIを使ってみる
Twitterのデータをリアルタイムに取得できる、Twitter Streaming APIというものがある。以前から使ってみたかったのだが、なかなか使う機会がなかったので、今回はそちらを使ってみることにする。
Streaming APIには、全ツイートの一部を返す、statuses/sample
と、statuses/filter
がある。後者ならフィルタされていないんじゃなかろうか。
POST statuses/filter | Twitter Developers
ちなみにどのくらいのスピードで流れているか確認したいだけなので、Twitter 公式のテストツールでやってみようと思ったが、そもそもストリーミングには対応していなかった。Streaming APIは、ずーっと延々とデータが送られてくるというものなので、単純なAPI用のコンソールでは対応していないんだろう。WebSocketとかじゃなくて、Commet。
そこで、phirehose というライブラリを使って確認したのだが、あまりにも簡単だったのでメモしておく。
phirehose
fennb/phirehoseというライブラリを使う。 他ライブラリに依存せず、ストリーミングAPIのインターフェースのみを提供、というのが良い。 OAuthを使うライブラリだと、PEARのライブラリとかに依存していると面倒だけど、これは入れるだけでいいので非常に楽。 5分くらいでできる。
ファイルの取得
git clone git@github.com:fennb/phirehose.git
OAuth の登録
https://apps.twitter.com/ から、アプリを登録して、「Keys and Access Tokens」から自分のアクセストークンを取得。
ファイルの修正
いくつかサンプルが入っているので、これを直接編集して使う。
今回は example/filter-otuah.php
を使うので、これを開いて、TWITTER_CONSUMER_KEY
, TWITTER_CONSUMER_SECRET
, OAUTH_TOKEN
, OAUTH_SECRET
をさっきのサイトで取得した値を入れる
標準出力に出してもいいけど、せっかくなのであとから分析したいので、
print $data['user']['screen_name'] . ': ' . urldecode($data['text']) . "\n";
している箇所を、
file_put_contents('sample.txt', $data['created_at'] .' '.$data['user']['screen_name'] . ': ' . str_replace("\n", '', urldecode($data['text'])) . "\n", FILE_APPEND);
とかに変えておく。
実行
$ cd /path/to/project/example $ php filter-oauth.php ... Phirehose: Consume rate: 69 status/sec (4146 total), avg enqueueStatus(): 0.64ms, avg checkFilterPredicates(): 0ms (0 total) over 60 seconds, max stream idle period: 1 seconds.
ファイルに保存されるので、tail -f
しながら眺める
処理中は1分おきにステータスが標準出力に出てくる。
結果
2016年10月4日9:30頃から30分ほど行った際に取得できたデータは以下。
/statuses/filter
track=http
27分26秒で78218件 → 44.3件/s
/statuses/sample
26分33秒で78218件で62810件 → 39.4件/s
全世界のツイートは約5億/日らしい*1ので、約5800/sが発生していることになる。 ということは、sampleでとれたツイートは全体の約0.6%
リンク付きのツイート、全体の3割とすると、filterでとれたツイートは全体の2.5%((44.3/(5800*.3)))