【php】twitter Streaming API の statuses/filter を試す
問題
twitter Streaming API の statuses/filter って、どうやって使うのかな。

答え
Streaming API - 一度接続すると、延々とデータが流れてくる。
statuses/firehose だと、何でも全部取得できそうなのだが、特別な許可が必要らしい。
特に許可の必要のない statuses/filter を試してみる。
php
<?php
// OAuthのいつもの
$consumer_key = '********************';
$consumer_secret = '******************************************';
$oauth_token = '***************************************************';
$oauth_token_secret = '***********************************';
// APIのURL
$url = 'https://stream.twitter.com/1.1/statuses/filter.json';
// リクエストのメソッド
$method = 'GET';
// パラメータ
$post_parameters = array(
);
$get_parameters = array(
'locations' => '132.2,29.9,146.2,39.0,138.4,33.5,146.1,46.20',
);
$oauth_parameters = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => microtime(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_token' => $oauth_token,
'oauth_version' => '1.0',
);
// 署名を作る
$a = array_merge($oauth_parameters, $post_parameters, $get_parameters);
ksort($a);
$base_string = implode('&', array(
rawurlencode($method),
rawurlencode($url),
rawurlencode(http_build_query($a, '', '&', PHP_QUERY_RFC3986))
));
$key = implode('&', array(rawurlencode($consumer_secret), rawurlencode($oauth_token_secret)));
$oauth_parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_string, $key, true));
// 接続&データ取得
// $fp = stream_socket_client("ssl://stream.twitter.com:443/"); でもよい
$fp = fsockopen("ssl://stream.twitter.com", 443);
if ($fp) {
fwrite($fp, "GET " . $url . ($get_parameters ? '?' . http_build_query($get_parameters) : '') . " HTTP/1.0\r\n"
. "Host: stream.twitter.com\r\n"
. 'Authorization: OAuth ' . http_build_query($oauth_parameters, '', ',', PHP_QUERY_RFC3986) . "\r\n"
. "\r\n");
while (!feof($fp)) {
echo fgets($fp);
}
fclose($fp);
}
上のソースの説明
条件は、ユーザー、キーワード、場所などが指定できる。
上の例では、日本語のツイートを集めてみようと思ったので、パラメータ locations を使って、下図あたりの位置を指定した。

リクエスト先のURLは以下のようになる(上図の四角の領域を、南西、北東、南西、北東…の緯度経度で指定する)。
https://stream.twitter.com/1.1/statuses/filter.json?locations=132.2,29.9,146.2,39.0,138.4,33.5,146.1,46.20
ブラウザでアクセスしてみると、ベーシック認証のダイアログが出てきて、ベーシック認証でいけてしまうようだが、ドキュメントに書いてあるとおりOAuthにする。
ちょっと試すだけなら、dev.twitter.com のOAuth Toolに、OAuthのAuthorizationヘッダに入れるデータを教えてもらうのもよし。よくあるOAuthのライブラリにお願いするのもよし。
上のソースでは、ライブラリなしで計算したので、上のソースだけコピー&貼り付けすれば、だいたい動作すると思う(主な処理は最後10行なのに、ほとんどOAuthの計算になってしまった)。
twitter APIからのレスポンスは、HTTPで延々と送られてくるので、fsockopen()やstream_socket_client()して接続して、一度fwrite()でHTTPリクエストを送信したら、fgets()で延々とレスポンスを取得し続ける。こちらから止めるか、twitter側から切られることで切断する。

1つのアカウントで1つの接続しか作れないとのことなので、同じアカウントで複数のプログラムを動かそうとすると、後からつないだ方は、「Server overloaded, try again in a few seconds.」と言われて、「HTTP ERROR: 503」になる。
Twitterのstreamingを試そうとしてBad Requestにハマる | 生きる 2014年10月25日 22:15
[…] 【php】twitter Streaming API の statuses/filter を試す をコピペ参考にさせてもらって twitterのデータをストリーミングで受け取って 大量のデータであんなことやこんなことを・・・と妄想していました。 […]