我正在尝试构建一个简单的 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
成功回调之后发送一条消息。这使我怀疑我没有正确地与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帖子这里的工单线程,以了解他们所说的具体情况。(感谢Louise引起Facebook的注意)
setTimeout
来实现发送消息之间的任意1秒延迟,从而解决了这个问题。它可以工作,但似乎有点像hack。希望能帮到你! - Brian