【问题标题】:Facebook Messenger Webhook continuously sending messagesFacebook Messenger Webhook 不断发送消息
【发布时间】:2016-08-11 09:13:48
【问题描述】:

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

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

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

http://prntscr.com/au3emz

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

谢谢。

【问题讨论】:

  • 我也遇到过这个问题。当我向用户发送按钮消息时,我的网络挂钩开始不停地发送按钮消息
  • 在 Facebook 聊天机器人中使用 ClaudiaJS 和 AWS Lambda 时遇到了这个问题。被告知要增加超时,将其延长到 3 分钟,但它仍然会发生。

标签: facebook webhooks facebook-messenger messenger


【解决方案1】:

当有人向您的 Facebook 主页发送消息时,Facebook 会将该消息传输到您的 Webhook 地址并等待类似 OK 的 http 响应。它会不断向您的 webhook 发送相同的消息,直到响应到达。

来自 Facebook webhook 文档 (Webhook docs;

必需的 200 OK 响应 当您收到 webhook 事件时,您必须始终返回 200 OK HTTP 响应。 Messenger 平台将每 20 秒重新发送一次 webhook 事件,直到收到 200 OK 响应。未能返回 200 OK 可能会导致您的 webhook 被 Messenger 平台取消订阅。

在您的 webhook 确认消息后,将自动向用户发送送达回执。您还可以使用 Sender Actions 来通知消息已被看到。

您可以看到所有这些消息都具有相同的时间戳。

作为一种解决方案;您可以定义一个消息队列来存储这些消息,如果队列中没有带有消息发送者 ID 和时间戳的消息,则将消息添加到队列中。

希望这会有所帮助,

【讨论】:

    【解决方案2】:

    如果您订阅 echo 消息callback event,通常会出现这种情况。

    来自文档;

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

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

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

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

    【讨论】:

      【解决方案3】:

      我的测试应用程序也遇到了同样的问题。我还是 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);
        )
      }
      

      您必须在发送消息后始终发送状态。

      【讨论】:

        【解决方案4】:

        我检测到在 facebook 调用和我的 200 状态码响应之间,我的代码等待了 2 秒,我的代码是同步的,因此,我的总代码在 2 秒后响应 200 个代码..
        许多探测结果对我来说,如果我不在一秒钟内向 facebook 发送 200 状态代码,则 facebook 会重新向 webhook 发送消息。对我来说,解决方案是分析传入的消息并获取时间戳键 (A),然后我从数据库 (B) 中获取时间戳。比较 A==B.. 如果为真,我不做任何事情并结束。我的 webhook 处理,如果为假,则在数据库中写入新的时间戳 (A) 并继续 webhook 处理。

        【讨论】:

          【解决方案5】:

          解决方案

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

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

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

          谢谢。

          【讨论】:

          • 我知道这是一篇旧帖子,但您必须尽快明确地向 Facebook 发送 200 OK 回复,否则会严重延迟后续回复。如果你不这样做,基本上事情就会变得古怪。
          • 您必须在收到请求后显式发送状态码 200 作为响应。如果从您的 webhook 收到请求后,响应需要超过 20 秒才能到达信使服务器,则信使将再次发送重复的请求。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-06
          • 2017-06-04
          • 2021-05-04
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          相关资源
          最近更新 更多