web-dev-qa-db-ja.com

Facebookで繰り返し電話を受ける-メッセンジャーwebhook

FacebookメッセンジャーのWebhookを正常にセットアップしました。昨日までメッセージの送受信もできました。しかし、今日、ユーザーから1つのメッセージを送信すると、サーバーwebhook POST APIで複数の呼び出しが発生します。停止しないようです。

13
n.arrow001

理解した。私はFacebookからのすべての通信に応答を送信していました。そのため、ACKメッセージにも応答することになりました。次に、もう1つのACKが来ました。それが無限ループにつながった理由です。

this ページでは、受信したメッセージのさまざまなオブジェクト構造を見つけることができます。

テキスト

{
"object":"page",
"entry":[
{
  "id":PAGE_ID,
  "time":1457764198246,
  "messaging":[
    {
      "sender":{
        "id":USER_ID
      },
      "recipient":{
        "id":PAGE_ID
      },
      "timestamp":1457764197627,
      "message":{
        "mid":"mid.1457764197618:41d102a3e1ae206a38",
        "seq":73,
        "text":"hello, world!"
      }
    }
  ]
}
]
}

メッセージ配信コールバック

{
 "object":"page",
 "entry":[
  {
     "id":PAGE_ID,
     "time":1458668856451,
     "messaging":[
        {
           "sender":{
              "id":USER_ID
           },
           "recipient":{
              "id":PAGE_ID
           },
           "delivery":{
              "mids":[
                 "mid.1458668856218:ed81099e15d3f4f233"
              ],
              "watermark":1458668856253,
              "seq":37
           }
        }
     ]
  }
 ]
}

したがって、区別するためにentry[0].messaging[0].messageを参照できます。これはユーザーが送信したメッセージにのみ存在します。コールバックまたはポストバックには、この部分は含まれていません。応答する前に、これを確認してください。存在する場合は応答し、存在しない場合は応答しないでください。

7
n.arrow001

それらの通話はすべて同じ内容ですか、それとも異なりますか? Facebookが送信する正確なメッセージ文字列をログに記録し、それらに何が含まれているかを確認できます。

たとえば、ユーザーがメッセージを受信したことを通知するメッセージ配信コールバックがあります。 JSONは次のようになります。

{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}

編集:あなたがない httpステータス200で着信を確認している場合もあります。FacebookがWebhookからエラーを受信した場合、メッセージは複数回送信されます。

13
Juergen

私の問題も同様でしたが、複数のメッセージ配信の投稿を受け取っていました。数時間のフラストレーションの後、メッセージがすべてのデバイスに配信されるたびに Message Delivered callback が呼び出されることに気付きました。したがって、Webアプリとモバイルアプリの両方にログインしている場合、コールバックは2回呼び出されます。

6
Partinder Singh

Facebookのメッセンジャーを使用する場合は、メッセージを送信した後、次の2つのことを考慮する必要があります。

A) メッセージ配信

B) メッセージ読み取り

Webhookを使用しているため、これはイベントの1つが発生するたびにトリガーされます(メッセージの受信、送信したメッセージの配信、ユーザーによるメッセージの読み取り)。したがって、たとえばWebhookでmessage_deliveriesをアクティブ化し、アクションとしてメッセージを送信すると、ループが発生します。

これを処理する適切な方法は、基本コードにあります。 PHP例:

        // Skipping delivery messages
        if (!empty($message['delivery'])) {
            #Do something here if you want
            continue;
        }

        // Skipping read messages
        if (!empty($message['read'])) {
            #Do something here if you want
            continue;
        }

それが役に立てば幸い !