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

我想发送多个回复,以便在Messenger上单个用户触发的回发。 我一直在关注Messenger的开发人员文档 ,并不能真正find如何做到这一点。

我的代码结构与他们在网站上给出的教程非常相似,我有一个“ handlePostback ”函数,它识别收到的回发,并将其与一组预定义的有效负载进行比较,以find“ 响应 ”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 } 

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

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

我希望我能解释我的问题,请让我知道,如果我可以提供更多的细节!

很好的问题。 如果你不熟悉Node.js,那么做的方法不是太明显,在Facebook的Send API文档中没有很好的logging。

首先,使用数组发送多个消息的方法,您可能已经注意到了将不起作用。 Facebook有一个解决scheme可以发送多达一百个API请求,但在我看来这不是你需要的。 如果您想了解更多关于它的信息,请查看批处理的请求文档 ,您会发现实现与您的不同。

一个可行的解决scheme是多次调用callSendAPI函数。 但是这个解决scheme有一个主要的缺点 :你将无法控制发送的消息的实际顺序。 例如,如果您想要发送两封单独的邮件, 则无法保证将首先发送给用户

为了解决这个问题,你需要链接你的callSendAPI函数,以保证下一个callSendAPI调用只有在第一个消息已经被发​​送后才会发生。 您可以使用callback或承诺在NodeJS中执行此操作。 如果你对其中的任何一个都不熟悉,你可以阅读这个callback和这个承诺。

你需要修改你的callSendAPI函数,特别是发送POST请求到Facebook的部分。 我将通过使用promise和模块node-fetch来提出解决scheme。

 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), }); } 

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

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