InstagramのAPIを使って、Instagramに投稿した写真をサイトのトップページに表示する仕組みを作ろうと思い、いろいろ調べているとAPIへのアクセス制限があり一時間に5000件となっていました。
5000件・・・アクセスが少ないサイトだと全く問題無いけど、ある程度アクセスのあるサイトだと問題になりそうな制限だな。
制限回数を超えたアクセスするとどうなるのか?
公式サイトのLimitsに制限回数を超えた時のエラー内容が書いてあるのですが、たまに古い情報が載っている時もあるので、実際に5000回以上アクセスして調査をする事にしました。
実際にアクセスして調べてみる
5000回以上アクセスした結果、5001回目のアクセスでエラーが返ってくるということが分かりました。
返ってくるHTTPステータスコードは公式サイトのものと同じでしたが、戻り値はご丁寧に日本語で返してくれていました。
429 UNKNOWN STATUS CODE
{ "code": 429, "error_type": "OAuthRateLimitException", "error_message": "1時間に送信できるリクエスト数の上限に達しました。過去1時間に5000件(最大5000)のリクエストを送信しています。" }
ということで、一時間に5000件以上のアクセスがあるサイトでこの仕組を使う場合、直接InstagramのAPIへアクセスしていると確実にAPIの制限に引っかかります。
APIで返ってくるJSONデータをサーバー上に保持して、定期的に更新がかかるような仕組みを作ったほうが良さそうですね。
APIの戻り値をサーバーで保持しよう
ということで、APIの戻り値を保存出来るPHPの関数を書いてみました。
PHPコード
function save_api_to_file($url, $file_name){ $context = stream_context_create(array( 'http' => array('ignore_errors' => true) )); $response = file_get_contents($url, false, $context); preg_match('/HTTP¥/1¥.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches); $status_code = $matches[1]; if($status_code == '200'){ header('HTTP/1.1 200 OK'); header('Content-Type: application/json; charset=utf-8'); file_put_contents($file_name, $response, LOCK_EX); echo $response; }else{ header($http_response_header[0]); echo 'An error occurred. Please try again later.'; } }
この関数をcronとかで一定間隔で実行して、作られたファイルをAjaxすればよいと思います。
下記フォーマットで実行すれば、ファイルが生成されます。
save_api_to_file('【APIのリクエストURL】', '【保存するファイル名】');
しっかり仕様を調べて、エラーにならないようにしましょう!