在 Facebook Messenger Bots 中的单个回发中发送多个回复消息

Sending multiple reply messages on single postback in Facebook Messenger Bots

我想在 Messenger 上针对单个用户触发的回发发送多个回复。我一直在关注 Messenger 的 developer documentation,但找不到真正的操作方法。

我的代码结构与他们在网站上提供的教程非常相似,我有一个“handlePostback”函数,它识别接收到的回发并将其与集合进行比较的预定义有效负载以找到“response”JSON 对象。此响应被提供给“callSendAPI”,它将此 JSON 对象置于将消息发送回 Messenger API 的基本格式中。

function handlePostback(sender_psid,receivedPostback)
{ if(payload== 'defined_payload') {
  response = {
  text: 'Some text'
  };
callSendAPI(sender_psid,response);
}

function callSendAPI(sender_psid,response) {
let body = {
recipient: {
id= sender_psid
},
message: response
};
// Followed by code for POST request to the webhook
}

这是基本结构,现在我想发送多条消息作为对一个回发的回复。我做了一些挖掘,发现解决方案可能是创建一个消息 [] 数组。但是我该怎么做呢?因为我的 'response' 是通过那个函数生成的,消息结构应该是这样的(我认为):

let body = {
 recipient: {
 id=sender_psid
 },
 messages: [ {
  response1
  },
  {
  response2
  }
 ]
};

我希望我能解释我的问题,如果我能提供更多细节,请告诉我!

不要修改 callSendAPI 函数。在您的 handlePostback 函数中多次调用 callSendAPI

callsendAPI(sender_psid,response1);
callsendAPI(sender_psid,response2);

问得好。如果您不熟悉 Node.js ,这样做的方法不是很明显,并且在 Facebook 的发送 API 文档中也没有很好地记录。

首先,您可能已经观察到,使用数组发送多条消息的方法行不通。 Facebook 有一个解决方案,可以通过一个请求发送最多 100 API 个呼叫,但我认为您的情况不需要这样做。如果您想了解更多信息,请查看 Batched Request Documentation,您会发现实现与您的不同。

一个可行的解决方案是多次调用 callSendAPI 函数。 但此解决方案有一个主要缺点:您将无法控制发送消息的实际顺序。例如,如果您想发送两条单独的消息,您无法保证哪一条会先发送给用户

要解决此问题,您需要以一种方式链接您的 callSendAPI 函数,以保证下一个 callSendAPI 调用仅在第一条消息发送后才会发生。您可以通过 使用回调或承诺 在 NodeJS 中执行此操作。如果你对它们都不熟悉,你可以阅读 this for callbacks and this for promises。

您需要修改 callSendAPI 函数,尤其是向 Facebook 发送 POST 请求的部分。我将通过使用 promises 和模块 node-fetch 来解决您的问题。

const fetch = require('node-fetch');

function handlePostback(sender_psid,receivedPostback){ 
  if (payload == 'defined_payload') {
    response = {
      text: 'Some text'
    };
    response2 = //... Another response
    response3 = //... Another response
  callSendAPI(sender_psid,response).then(() => {
    return callSendAPI(sender_psid, response2).then(() => {
      return callSendAPI(sender_psid, response3); // You can add as many calls as you want
      });
   });
  }
}

function callSendAPI(sender_psid,response) {
  let body = {
    recipient: {
      id= sender_psid
    },
    message: response
  };
  const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN); // Here you'll need to add your PAGE TOKEN from Facebook
  return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(body),
  });
}

我发现下面的 link 有助于理清在单个 post 返回上实现多个响应的方法。

https://codingislove.com/build-facebook-chat-bot-javascript/

就像你说的,数组应该可以。创建一个包含多个响应消息的数组变量

var multipleResponse = {
   messages: [{
      response1
   },
   {
      response2
   }]
};

并将数组变量推送到您的函数

function callSendAPI(sender_psid,response) {

    let body = {
         recipient: {
            id= sender_psid
         },
         message: []
    };
    // Followed by code for POST request to the webhook
}

最终将数组推送到您的函数数组

body.message.push(multipleResponse.messages);

@Christos Panagiotakopoulos。我没有得到使用 then 链接的 mainMenuResponse。相反,我得到了三次回应。 handlePostback 函数 =>

// Handles messaging_postbacks events
function handlePostback(sender_psid, received_postback) {
  let response;

  // Get the payload for the postback
  let payload = received_postback.payload;

  // Set the response based on the postback payload
  if (payload === 'fashionTip') {
    response = { "text": getFashionTip() } // calls a function which gives a fashion-tip

  // Send the message to acknowledge the postback
  callSendAPI(sender_psid, response).then(() => {
    return callSendAPI(sender_psid, mainMenuResponse)
  });

callSendAPI函数=>

// Sends response messages via the Send API
function callSendAPI(sender_psid, response) {
  // construct the message body
  let request_body = {
    "recipient": {
      "id": sender_psid
    },
    "message": response
  }

  // Send the HTTP request to the messenger platform
  request({
    "uri": "https://graph.facebook.com/v2.6/me/messages",
    "qs": {"access_token": PAGE_ACCESS_TOKEN},
    "method": "POST",
    "json": request_body
  }, (err, res, body) => {
    if (!err) {
      console.log("Message sent!");
    } else {
      console.error("Unable to send mesage:" + err);
    }
  });
}