これはなに?
ヤーマン。
私はZEALSという会社でMessenger APIを使ってアプリケーションを開発しているのですが、Facebook Messenger APIで、ユーザーに対してメッセージを送信できないときが度々あります。
facebookサーバーへリクエストしているJSONの形式が違う〜とかはまぁもちろんデバッグすれば直せますが、ユーザーによって送信できたりできなかったりすることもしばしばあるので、そこらへんのエラー内容の整理とかをしていきます。
ちょくちょくデバッグのコツというか流れのTips?も僭越ながら盛り込んでみました。
そもそも、Messenger APIでエラーメッセージについてまとまっていますが、なかなか分かりにくく無いですか??(私だけ?)
Messenger APIは物凄い早さでアップデートが繰り返されています。
エラーメッセージが変わることもあるので予めご了承ください。
対象者: Facebook Messenger APIを使用してサービスを提供している人
どんなときにメッセージが送信できないの?
前提
まずは最低限、request bodyとresponse bodyを表示させて、messageの形式が合っているかどうかを確認してください。
ここではmessageの形式が合っている上で送信できないケースを中心に紹介し、デバッグ方法やアプリケーション上での対処内容等を書いていきたいと思います。
難易度★☆☆☆☆: ユーザーがブロックしている場合
{"error":{"message":"(#200) This person isn't available right now.","type":"OAuthException","code":200,"error_subcode":1545041,"fbtrace_id":"hogehoge"}}
ユーザーがスレッドをブロックしていると、こんなresponse bodyが返ってくることがあります。
このときのstatus codeは403
です。
ちなみにユーザーがブロックしているかどうかは、Facebook Pageの受信箱からユーザーへメッセージを送信しようとすると、
こんな感じになっていることからもユーザーがブロックしていることは判断できます。
このメッセージが出ていたらメッセージ送信はもう諦めましょう。誰も悪くない。
難易度★★☆☆☆: appで申請している権限が足りていない
続いてはこちらのresponse。
'{"error":{"message":"(#230) Requires pages_messaging permission to manage the object","type":"OAuthException","code":230,"fbtrace_id":"hogehoge"}}'
これも403
が返ってきます。少しテンパるかもしれませんが、無問題(もーまんたい)。
appのreviewでmessage_subscription
が追加されていないだけです。
トークンデバッガというものを使うとすぐに対処ができます。
ここにpages_messaging_subscriptions
というscopeが無いのが原因です。
appのreviewを申請し、page tokenを発行し直してください。
難易度★★★☆☆: access tokenが無効になっている
次はこのレスポンス。
{“error”:{“message”:“Error validating access token: The session has been invalidated because the user changed their password or Facebook has changed the session for security reasons.“,”type”:“OAuthException”,“code”:190,“error_subcode”:460,“fbtrace_id”:“hogehoge”}}
幸い、前述のトークンデバッガを使用すれば何かしらエラーメッセージが出力されることがほとんどです。
これもトークンを発行し直すしかありません。
トークンを発行し直すのにはGraph API Explorerから行うと良いでしょう。
難易度★★★★☆: response bodyがなくてparseできない!?
続いてはこちらのresponseを御覧ください。
''
そう、status_code: 500
です。
これマジで時々返ってきますからね。。
こうなったら時間を置いて再度試すしかありません。
事実、プロダクション環境ではmessenger apiを叩く箇所でretry処理を実行するようにしています。
難易度★★★★★: facebookページが凍結されている
(#2022) An error occurred while processing this request. Please try again later
こんなエラーが発生することがありました。
page tokenもユーザーのstatusも全く問題がなくて絶望します。
これ、ユーザーからのブロックが多いとユーザーに対してメッセージを送信できなくなるんだとか。
ある種の凍結ですね。facebookのサポートに問い合わせ、スパムアカウントではないことを報告して凍結解除して貰う必要があります。
凍結解除リクエストを送っても承認が降りないケースもあります。
そのときは凍結ページの高評価レビューを集めてから再度解除リクエストを送信すると承認が降ります。
難易度∞: Facebookの不具合でエラーメッセージ関係なしにエラーが出る
上記のエラー、全てが唐突に出ることがあります。
message_subscription
権限があったとしてもmessage_subscription
権限がない、というエラーが起きることもあります。
そんなときは素直にFacebook Bug ReportsへLet's Goです。
ちなみに、ブロックも何もしていないユーザーへメッセージを送信しようとした際に難易度★☆☆☆☆のユーザー受信拒否エラーが出ることもありました。こうなるともう意味がわかりません。
そのときの実際のBug Reportはこちら。
まとめ
デバッグをするときは、responseのbodyを見て対処していくことが多いです。
その際はToken Debuggerは必須ですね。
Bugのサポートは大体1日以内にレスを返してくれるので、本国のMessenger Developerも頑張っているということを忘れてはなりません。
Facebook Messenger APIに苛立ちを覚えるのではなく、愛を持って接していくことが大切なのかもしれませんね()