Facebook Messenger Webhook不断发送消息

问题描述 投票:5回答:5

我正在学习使用Facebook Messenger API。我已成功设置webhook,我已订阅该应用程序。但是当我向我的页面发送消息时,我收到了同一个消息的多个实例,如一个爆发。

我正在存储从Webhook收到的应用程序发送的消息。

我的数据库视图如下面的屏幕截图所示。

http://prntscr.com/au3emz

我猜这可能是因为消息仍然未读?只是一个疯狂的猜测可能是其他人肯定知道的。我尝试了Facebook Office(节点)的确切示例,它也在那里发生。

谢谢。

facebook webhooks facebook-messenger messenger
5个回答
4
投票

如果您订阅了回显消息callback event,通常会导致这种情况。

从文件;

当您的页面发送消息时,将发生此回调。

这意味着您将获得机器人发送的任何消息的副本。从你的代码中,这将导致一种无限循环的形式;你会继续收到Response 1

您可以通过检查text的值来轻松确认这一点;你会发现它也是Response 1并且在检查整个有效载荷时它将有"is_echo":true字段。

解决方案:编辑您的页面订阅以排除message_echoes

enter image description here


3
投票

当有人向您的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和时间戳的消息,您可以将消息添加到队列中。

希望这可以帮助,


1
投票

我的测试应用程序遇到了同样的问题。我仍然是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。


1
投票

我发现facebook调用和200响应状态代码我的代码等待了2秒,我的代码是同步的,因此,我的总代码在2秒后响应200代码。 许多调查结果对我来说,如果我不在200秒内向facebook发送200状态代码重新发送消息给webhook。对我来说,解决方案是分析传入的消息并获得时间戳密钥(A),然后我从数据库(B)获得时间戳。比较A == B ..如果为真,我不做和结束。我的webhook处理,如果是false则在数据库中写入新的时间戳(A)并继续webhook正在进行。


0
投票

我再次向我的应用程序发送了订阅请求以停止这些消息。

基本上我所经历的是,收到消息后webhook重新订阅应用程序将停止任何进一步接收,直到下一条消息。

这虽然解决方案的核心是“为什么会这样?”还不知道。如果有人可以贡献,会很高兴。

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.