16

シンプルな Facebook Messenger チャットボットの構築をいじっていますが、メッセージを順番に送信するのに問題があります。

ここに画像の説明を入力

上記の例では、「Hello!」、「1」、「2」、「3」の順に出力されているはずです。私は現在、この単純なテキスト メッセージ機能を実装するために、ここにある Facebook ドキュメントに従っています。Express Node.JS サーバー コードを以下に含めました。

関数の定義sendTextMessage():

var request = require("request");
function sendTextMessage(user, text) {
    messageData = {
        text: text
    };
    request({
        url: "https://graph.facebook.com/v2.6/me/messages",
        qs: {access_token: PAGE_ACCESS_TOKEN},
        method: "POST",
        json: {
            recipient: {id: user},
            message: messageData
        }
    }, function(error, response, body) {
        if (error) {
            console.log("Error sending message: ", error);
        } else if (response.body.error) {
            console.log("Error: ", response.body.error);
        } else {
            console.log("Message successfully send.")
        }
    });
}

それを使用して応答を送信します。

sendTextMessage(user, "Hello!");
sendTextMessage(user, "1");
sendTextMessage(user, "2");
sendTextMessage(user, "3");

requestメッセージをキューに入れ、それぞれの成功コールバックの後に一度に 1 つのメッセージのみを送信する単純なキューを実装してみました。これは、Messenger API を正しく操作していないのではないかと疑っています。

誰かがこの問題に遭遇しましたか? メッセージを順番に送信するにはどうすればよいですか? ありがとう!

編集

単純なキューを実装しましたが、まだこの問題が発生しているため、単純なキュー システムのコードをここに含めます。

var queue = [];
var queueProcessing = false;

function queueRequest(request) {
    queue.push(request);
    if (queueProcessing) {
        return;
    }
    queueProcessing = true;
    processQueue();
}

function processQueue() {
    if (queue.length == 0) {
        queueProcessing = false;
        return;
    }
    var currentRequest = queue.shift();
    request(currentRequest, function(error, response, body) {
        if (error || response.body.error) {
            console.log("Error sending messages!");
        }
        processQueue();
    });
}

queueRequest(/* Message 1 */);
queueRequest(/* Message 2 */);
queueRequest(/* Message 3 */);

アップデート

この「バグ」は Facebook に報告されましたが、修正する予定はないようです。彼らが言っていることの詳細については、こちらの Facebook の投稿のチケット スレッドをお読みください。(これについてFacebookの注目を集めてくれたLouiseに感謝します)

4

11 に答える 11

10

私は同じ問題を抱えていたので、これについて Facebook にバグレポートを提出しました。彼らはそれが実際にバグであることを認め、修正に取り組んでいます: https://developers.facebook.com/bugs/565416400306038

于 2016-06-22T20:57:07.363 に答える
4

/me/messages に POST を送信すると、メッセージ ID を持つ応答が返されます (メッセージ ID を表す「mid.」で始まる私のメッセージは?):

{ recipient_id: '1015411228555555',
  message_id: 'mid.1464375085492:b9606c00ca33c12345' }

FB Messenger API によって完全に受信された後、受信を確認する Webhook への呼び出し (メッセージ イベントなし) を受け取ります。

{ sender: { id: '1015411228555555' },
  recipient: { id: '566031806XXXXXX' },
  delivery:
   { mids: [ 'mid.1464375085492:b9606c00ca33c12345' ],
     watermark: 1464375085604,
     seq: 176 } }

確実に配達してから次のメッセージを送るには配達確認が一番だと思います。

于 2016-05-27T18:56:36.110 に答える
0

送信された順に受信する必要があります。実際にそれらを順番に送信していることと、非同期関数を 4 回呼び出していないことを確認してください (送信順序は保証されません)。(あなたがそれをテストしたと読みましたが、私のすべてのテストで、送信順序が保証されていた場合に受信が順不同になるのを見たことはありません。)

于 2016-05-17T01:13:49.563 に答える
0

メッセージ処理が開始されるたびに 0 にリセットされる messageId カウンターをアプリに追加しました。次に、その数 * 100 ミリ秒遅延します。このようにして、次のようなコードで意図的な遅延を追加することもできますmessageDelay += 15

receivedMessage(event) {
  messageDelay = 0;
  //...

sendMessage 拡張:

function sendTextMessage(recipientId, messageText) {
//...
  setTimeout(function() {
    callSendAPI(messageData);
  }, messageDelay++ * 100)    
}
于 2017-06-17T00:29:00.697 に答える