koni blog

東京のウェブエンジニア koni です!ウェブサービスをガシガシ作っていきます!

超簡単に PHP で Twitter Streaming API を叩く

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)))

参考

Streaming APIで日本全国のツイートを収集する - メヘンニミン