Facebook Messenger bot not sending messages in order

后端 未结 11 2054
遥遥无期
遥遥无期 2021-01-01 21:00

I\'m playing around with building a simple Facebook Messenger chatbot and I\'m having trouble sending messages in sequence.

In the example above, it should

相关标签:
11条回答
  • 2021-01-01 21:28

    I added a messageId counter to the app that resets to 0 on every start of messagehandling. Then I delay with that number * 100 ms. This way I can add intentional delays as well with code like messageDelay += 15

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

    sendMessage extend:

    function sendTextMessage(recipientId, messageText) {
    //...
      setTimeout(function() {
        callSendAPI(messageData);
      }, messageDelay++ * 100)    
    }
    
    0 讨论(0)
  • 2021-01-01 21:30

    Instead of adding static timeouts, I would create a queue data structure. When the bot wants to send a message, append the contents to the end of the queue. On the message post callback, check if there are any messages still in the queue and call the function again using recursion and remove from the queue accordingly.

    0 讨论(0)
  • 2021-01-01 21:36

    The message is not sending in order because, the request is sent asynchronously to facebook, and can be sent in any order.

    To solve this you have to call the next sendTextMessage when the message that should be sent before it has received a response.

    0 讨论(0)
  • 2021-01-01 21:43

    They should be received in the order that they are sent. Make sure you're actually sending them in order and not calling an async function 4 times (and send order isn't guaranteed). (I read that you tested it but in all my testing I've never seen a receive come out of order if the send order was guaranteed.)

    0 讨论(0)
  • 2021-01-01 21:44

    After you send a POST to /me/messages, you'll receive a response that has a message id (mine start with 'mid.' which maybe stands for message id?):

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

    After being completely received by the FB Messenger API, you'll get a call to your webhook (with no message events) that confirms receipt:

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

    I think that delivery receipt is the best way to ensure delivery, then send the next message.

    0 讨论(0)
提交回复
热议问题