2016-04-19 14 views
5

Facebook Messenger APIで作業する方法を学んでいます。私は正常にWebhookをセットアップして、私はアプリケーションを購読しています。しかし私が私のページにメッセージを送るとき、私はバーストのような同じメッセージの複数のインスタンスを受け取ります。Facebook Messenger Webhookが継続的にメッセージを送信しています

私はWebhookで受信したときに自分のアプリケーションから送信したメッセージを保存しています。

私のデータベースのビューは、以下のスクリーンショットのようになります。

http://prntscr.com/au3emz

私はメッセージが未読であるので、それがかもしれ推測していますか?ただ野生の推測は確かに知っている誰かかもしれません。私はFacebook Office(ノード)の正確な例を試してみましたが、そこでも起こっています。

ありがとうございました。

+1

この問題も発生しました。ユーザーのボタンメッセージに送信すると、私のウェブフックがボタンメッセージをノンストップで送信し始めます。 –

+0

FacebookのチャットボットにClaudiaJSとAWS Lambdaを使用してこの問題が発生しました。時間切れを増やすように指示され、3分まで締め付けられたが、それでも起こる。 – SMT

答えて

0

ソリューション

私はこれらのメッセージを停止するには自分のアプリケーションに再びサブスクリプション要求を送りました。

本質的に私が経験したことは、メッセージを受信した後にwebhookの再購読アプリが次のメッセージまでそれ以上受信を停止することです。

解決策は「なぜこれが起こるのですか」ですがまだ知られていない。誰かが貢献できれば嬉しいです。

ありがとうございました。

+0

これは古い投稿であることを認識していますが、できるだけ早く '200 OK'レスポンスをFacebookに送り返す必要があります。そうしないと、その後のレスポンスが大幅に遅れることになります。あなたがしなければ、基本的には不吉なことになります。 –

1

私はテストアプリケーションで同じ問題がありました。私はまだMessenger APIが新しく、私のソリューションは素朴かもしれません。永遠レスポンス1を送信して保管

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
) 
} 
res.sendStatus(200); 

当初、コードは次のようでした。正しいコードは次のとおりです。

if (text) { 
    sendTextMessage(sender, 'Response 1'); 
    res.sendStatus(200); 
} else { 
    queryDB(
    sendTextMessage(sender, 'Response 2'); 
    res.sendStatus(200); 
) 
} 

メッセージを送信した後は常にステータスを送信する必要があります。

2

エコーメッセージcallback eventを購読すると、これがよく発生します。

ドキュメントから。

このコールバックは、ページによってメッセージが送信されたときに発生します。

これは、ボットが送信するメッセージのコピーを返すことを意味します。あなたのコードから、これは無限ループのフォームを引き起こします。あなたはResponse 1を受け取り続けるでしょう。

textの値を調べることで簡単に確認できます。それもResponse 1であり、ペイロード全体を調べると、フィールドは"is_echo":trueになります。

ソリューション: 編集ページのサブスクリプションmessage_echoes

enter image description here

1

を除外するために、私はFacebookの呼び出しと200と私の応答は、私のコードは2秒を待っていたのStatusCode betwen、私のコードは、このように、syncronousであることを検出私のトータルコードは200秒後に2秒後に応答します。
もし私が200秒のステータスコードを1秒間のfacebookでwebhookに返信してもらわないと、多くのプローブが私のために結果を出します。解決策は私のために着信メッセージを分析してタイムスタンプキー(A)を取得し、データベース(B)からタイムスタンプを取得しました。 A == Bと比較する。もし真であれば、私はそれを行いません。もしwebhookの処理が偽であれば、データベースに新しいタイムスタンプ(A)を書き、webhook proceasingを続行します。

関連する問題