FacebookのGraph APIで、いいね!数取得やOGPキャッシュクリアがエラー4で失敗する場合の対策
今日は、かなり技術的なトピックです。Facebookの「いいね!数データ取得」や「OGPキャッシュクリア」が失敗することはありませんか? そのときは、APIにアクセストークンを付けてリクエストしましょう。
※今回の記事は、頭から最後まで技術的な解説です。この記事で解説している問題が発生している場合、開発担当の人にこれを教えて「これで解決できないかな?」と聞いてみてください。
FacebookのGraph APIが「Application request limit reached」で失敗
Facebookの「いいね!」数を取得したり、OGPのキャッシュをクリアしたりという動作を、CMSの内部で自動的に行っている人は多いのではないでしょうか。
その場合、Facebookの「Graph API」という仕組みを使います。次のようなリクエストですね。
- いいね!数の取得
https://graph.facebook.com/?id=対象ページのurl
- OGPキャッシュのクリア
https://graph.facebook.com/?id=対象ページのurl&scrape=true
しかし、特にAPIリクエストの数が多くないのに、次のようなエラーが返ってしまうことはないでしょうか。
- エラー内容
(#4) Application request limit reached
- HTTPレスポンスコード
403(Forbidden)
FacebookのRate Limiting解説では、1時間あたり200コールまで大丈夫とあるのに、それ以下のアクセス数でも「リクエスト制限」がかかるというのは、どういうことでしょうか。
おそらく、Graph APIのコールにアクセストークンを指定していないのではないでしょうか。
その場合、リクエスト数がIPアドレス単位で判断されます。そのため、同じレンタルサーバーや同じ出口IPアドレスを使っている他のサイトのせいで、ほとんどAPIを使っていないあなたのサイトもリクエスト数制限がかかってしまうのです。
「以前は問題なかったのに、最近失敗するようになった」という場合は、同じIPアドレスを共有している他のシステムが最近動きを変えたのかもしれません。
解決策:APIコールにアクセストークンを指定する
結論としては、この場合の解決策は「アクセストークンを指定してAPIを呼び出す」です。
OGPのキャッシュクリアなどの、Graph APIのURLエンドポイントへのリクエストにもアクセストークンを指定できることは、リファレンスにも記載されています。
書式は次のとおりです。
- いいね!数の取得
https://graph.facebook.com/?id=対象ページのurl&access_token=アクセストークン
- OGPキャッシュのクリア
https://graph.facebook.com/?id=対象ページのurl&scrape=true&access_token=アクセストークン
このアクセストークンを取得するのも簡単です。
開発者向けFacebookでFacebookアプリを作る(ウェブサイトアプリとして作成)。
そのアプリの「アプリID」と「app secret」を確認する(開発者向けFacebookで確認できます)。
次のリクエストでアクセストークンを取得します。
https://graph.facebook.com/oauth/access_token?client_id=アプリID&client_secret=app secret&grant_type=client_credentials
JSONレスポンスからアクセストークンを取得できます。
このアクセストークン値を保存しておいて、いいね!数の取得やOGPキャッシュのクリアをするときに、access_tokenパラメータとして指定してリクエストを作ります。
これで、同じIPアドレスを使っている他のシステムが無茶をしているせいで、ちゃんと設計している自分のサイトのAPIリクエストが制限されるということはなくなります。
ただし、アクセストークンを取得するリクエストもRate Limitの対象です。そのため、アクセストークン取得のリクエストを投げすぎると、やはり制限されてしまいます。
アクセストークンはサーバー側で保存しておいて再利用するようにしましょう(ただし期限が切れたら再取得する必要があるので注意)。
かなり技術的な内容なので、ほとんどのWeb担読者さんには何のことやらだと思います。
でも、大企業さんほど自社データセンターで同居している他部署が行儀悪い動きをしていて巻き添えで「(#4) Application request limit reached」をくらっていることがあるのではないかと思い、記事にしました。
何人かの方のお役に立てればと。
ソーシャルもやってます!