我正在学习使用Facebook Messenger API。我已成功设置webhook,我已订阅该应用程序。但是当我向我的页面发送消息时,我收到了同一个消息的多个实例,如一个爆发。
我正在存储从Webhook收到的应用程序发送的消息。
我的数据库视图如下面的屏幕截图所示。
我猜这可能是因为消息仍然未读?只是一个疯狂的猜测可能是其他人肯定知道的。我尝试了Facebook Office(节点)的确切示例,它也在那里发生。
谢谢。
如果您订阅了回显消息callback event,通常会导致这种情况。
从文件;
当您的页面发送消息时,将发生此回调。
这意味着您将获得机器人发送的任何消息的副本。从你的代码中,这将导致一种无限循环的形式;你会继续收到Response 1
。
您可以通过检查text
的值来轻松确认这一点;你会发现它也是Response 1
并且在检查整个有效载荷时它将有"is_echo":true
字段。
解决方案:编辑您的页面订阅以排除message_echoes
当有人向您的Facebook页面发送消息时,Facebook会将该消息传输到您的Webhook地址并等待http响应,如OK。它会不断向您的webhook发送相同的消息,直到响应到来。
来自Facebook webhook docs(Webhook docs;
必需200 OK响应当您收到webhook事件时,您必须始终返回200 OK HTTP响应。 Messenger平台将每20秒重新发送一次webhook事件,直到收到200 OK响应。如果未能返回200 OK,可能会导致您的webhook被Messenger平台取消订阅。
在您的webhook确认消息后,将自动向用户发送送达回执。您还可以使用发件人操作来通知已看到该消息。
您可以看到所有这些消息都具有相同的时间戳。
作为解决方案;您可以定义一个消息队列来存储这些消息,如果队列中没有带有消息发送者ID和时间戳的消息,您可以将消息添加到队列中。
希望这可以帮助,
我的测试应用程序遇到了同样的问题。我仍然是Messenger API的新手,我的解决方案可能很天真。
最初,代码如下:
if (text) {
sendTextMessage(sender, 'Response 1');
} else {
queryDB(
sendTextMessage(sender, 'Response 2');
)
}
res.sendStatus(200);
哪个一直在发送响应1。正确的代码是:
if (text) {
sendTextMessage(sender, 'Response 1');
res.sendStatus(200);
} else {
queryDB(
sendTextMessage(sender, 'Response 2');
res.sendStatus(200);
)
}
发送消息后,您必须始终发送sendStatus。
我发现facebook调用和200响应状态代码我的代码等待了2秒,我的代码是同步的,因此,我的总代码在2秒后响应200代码。 许多调查结果对我来说,如果我不在200秒内向facebook发送200状态代码重新发送消息给webhook。对我来说,解决方案是分析传入的消息并获得时间戳密钥(A),然后我从数据库(B)获得时间戳。比较A == B ..如果为真,我不做和结束。我的webhook处理,如果是false则在数据库中写入新的时间戳(A)并继续webhook正在进行。
解
我再次向我的应用程序发送了订阅请求以停止这些消息。
基本上我所经历的是,收到消息后webhook重新订阅应用程序将停止任何进一步接收,直到下一条消息。
这虽然解决方案的核心是“为什么会这样?”还不知道。如果有人可以贡献,会很高兴。
谢谢。