慣れるより愛せ！！Facebook Messenger APIでメッセージが送信できないときの対処まとめ

## これはなに?
ヤーマン。
私は[ZEALS](http://zeals.co.jp)という会社でMessenger APIを使ってアプリケーションを開発しているのですが、Facebook Messenger APIで、ユーザーに対してメッセージを送信できないときが度々あります。
facebookサーバーへリクエストしているJSONの形式が違う〜とかはまぁもちろんデバッグすれば直せますが、ユーザーによって送信できたりできなかったりすることもしばしばあるので、そこらへんのエラー内容の整理とかをしていきます。
ちょくちょくデバッグのコツというか流れのTips?も僭越ながら盛り込んでみました。
そもそも、Messenger APIで[エラーメッセージについてまとまっています](https://developers.facebook.com/docs/messenger-platform/reference/send-api/error-codes)が、なかなか分かりにくく無いですか??(私だけ?)

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の受信箱からユーザーへメッセージを送信しようとすると、

[![Screenshot from Gyazo](https://gyazo.com/f964414837698e4fce7fecf247717175/raw)](https://gyazo.com/f964414837698e4fce7fecf247717175)
こんな感じになっていることからもユーザーがブロックしていることは判断できます。
このメッセージが出ていたらメッセージ送信はもう諦めましょう。誰も悪くない。


### 難易度★★☆☆☆: 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`が追加されていないだけです。
[トークンデバッガ](https://developers.facebook.com/tools/debug/accesstoken)というものを使うとすぐに対処ができます。
<img width="1057" alt="スクリーンショット 2018-05-21 17.40.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/88837/1b022298-d3dd-d172-fed5-89623fb8a5a6.png">

ここに`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”}}
```

幸い、前述の[トークンデバッガ](https://developers.facebook.com/tools/debug/accesstoken)を使用すれば何かしらエラーメッセージが出力されることがほとんどです。

これもトークンを発行し直すしかありません。
トークンを発行し直すのには[Graph API Explorer](https://developers.facebook.com/tools/explorer/)から行うと良いでしょう。


### 難易度★★★★☆: response bodyがなくてparseできない！？
続いてはこちらのresponseを御覧ください。

```
''
```
そう、status_code: `500` です。
<b>これマジで時々返ってきますからね。。</b>
こうなったら時間を置いて再度試すしかありません。
事実、プロダクション環境では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](https://developers.facebook.com/support/bugs/)へLet's Goです。

ちなみに、ブロックも何もしていないユーザーへメッセージを送信しようとした際に難易度★☆☆☆☆のユーザー受信拒否エラーが出ることもありました。こうなるともう意味がわかりません。
そのときの実際のBug Reportは[こちら](https://developers.facebook.com/support/bugs/465154327166499/)。

## まとめ
デバッグをするときは、responseのbodyを見て対処していくことが多いです。
その際は[Token Debugger](https://developers.facebook.com/tools/debug/accesstoken)は必須ですね。

Bugのサポートは大体1日以内にレスを返してくれるので、本国のMessenger Developerも頑張っているということを忘れてはなりません。
Facebook Messenger APIに苛立ちを覚えるのではなく、愛を持って接していくことが大切なのかもしれませんね()