Twitter API のアクセスには回数制限があります。
一時間あたり
OAuth認証を行った時で350回ぐらい、行っていない時で150回ぐらいと、
回数が異なります。
ただ、このカウントはどうも正確に回数をカウントしてないっぽくて、
ここでは「ぐらい」としています。
なぜに正確じゃないのかは不明です・・・orz
サーバーへの負荷でカウントしたりしてなかったりなのかなぁ・・・
と、
思いつつ・・・
で、
OAuth認証なしの150回の制限の時にPHPで
Twitter APIのアクセス制限の対策のサンプルコードを書いたので
ここに記載しておきます。
内容の説明としては
残り時間と残り回数からアクセスする平均時間を算出して、
一定時間はTwitter APIへアクセスしないようにしています。
Twitter APIから取得した値はローカルに保存しておき、
一定時間内はそのファイルの内容を返すというものになっています。
OAuth認証を用いた場合はアクセス制限のカウントは
「ユーザー + IPアドレス」になっていますので
ユーザーごとにファイルをわける必要がありますので、
その時はソースコードを修正してください。
<head>
<title>Twitter APIのテスト</title>
</head>
<body>
<?php
//検索のフォーマットは「twitter search operators」で検索するといい
$search_word = ‘#twitter’;
$tweets = json_decode(get_tweet($search_word));
foreach ($tweets->results as $result) {
echo ‘<div style=”font-size:1.5em; color:#ff0000″>’ . $result->from_user . ‘</div><div>’ . $result->text . ‘</div>’;
}
?>
</body>
</html>
<?php
/**
* Twitter API でツィートを取得してくる。
* (検索のフォーマットは「twitter search operators」で検索するといい)
* @param string 取得するクエリ(例:’from:ユーザー名’, ‘#ハッシュタグ’, ‘単語’など・・・)
* @param boolean 対象を日本語とするか(デフォルト:true)
* @return string json形式のテキスト。戻り値はjson_decode()などでデコードして使う
*/
function get_tweet($search_word, $japanese = true) {
//API実行のプロパティを取得する(後なん回実行できるとか)
//これはAPI実行のカウントに入らないらしい。
$url = “http://twitter.com/account/rate_limit_status.json”;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
$properties = json_decode($response);
$remaining_time = $properties->reset_time_in_seconds – time();//リセットするまでの時間(秒数)
if ($properties->remaining_hits > 0) {//残り時間、残りの回数から平均何秒で実行出来るか算出
$per_seconds = $remaining_time / $properties->remaining_hits;
} else {
$per_seconds = $remaining_time;
}
/*
OAuth認証をしていた場合
APIの制限は「IPアドレス + ユーザー」なのでユーザーごとに
ファイル名をわける必要があるので、必要に応じて書き換えてください。
*/
$filename = ‘tweet.txt’;
if (!file_exists($filename) || time() – filemtime($filename) > $per_seconds) {//一定時間すぎていればtwitterから新たにデーを取得してくる
$fp = fopen($filename, “w”);//ファイルを開く(なければ作成)
$url = “http://search.twitter.com/search.json?q=” . urlencode($search_word);//ツィートの取得(今回はjson形式)
if ($japanese) {
$url .= ‘&lang=ja’;//対象を日本語とする
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$tweets_data = curl_exec($ch);
curl_close($ch);
$tweets_obj = json_decode($tweets_data);
if (!isset($tweets_obj->error) && !is_null($tweets_obj)) {
fwrite($fp, $tweets_data);//取得したデータをそのままファイルに保存
}
fclose($fp);
} else {
//ファイルの内容をそのままreturnする
$fp = fopen($filename, “r”);
$tweets_data = fread($fp, filesize($filename));
fclose($fp);
}
return $tweets_data;
}