首页 > 解决方案 > FB Messenger API - 接收双重请求

问题描述

我有一个使用 Ruby 构建的工作 FB Bot,它允许玩家进行寻宝游戏。

但有时,当我在一个团队中有多名球员时,FB 会两次向我发送球员“答案”网络钩子。我已经研究过了,起初认为这与 20 秒超时有关,如果 FB 没有得到 200 OK 响应(Docs here)。不过,在检查日志后,我仅在 14 秒后从 FB 收到了第二个 webhook。见下文:

# Webhook #1 
{"object"=>"page", "entry"=>[{"id"=>"252445748474312", "time"=>1532153642358, "messaging"=>[{"sender"=>{"id"=>"1709242109154907"}, "recipient"=>{"id"=>"252445748474312"}, "timestamp"=>1532153641935, "message"=>{"mid"=>"0FeOChulGjuPgg3YJqEgajNsY8kMfNRt_bpIdeegEeE54h-KB8szcd-EQ-UHUT3850RwHgH4TxVYFkoFwxqhtg", "seq"=>402953, "text"=>"Larrikins"}}]}]}

# Webhook #2 (14 seconds later)
{"object"=>"page", "entry"=>[{"id"=>"252445748474312", "time"=>1532153656901, "messaging"=>[{"sender"=>{"id"=>"1709242109154907"}, "recipient"=>{"id"=>"252445748474312"}, "timestamp"=>1532153641935, "message"=>{"mid"=>"0FeOChulGjuPgg3YJqEgajNsY8kMfNRt_bpIdeegEeE54h-KB8szcd-EQ-UHUT3850RwHgH4TxVYFkoFwxqhtg", "seq"=>402953, "text"=>"Larrikins"}}]}]}

请注意,除了第一个“时间”属性(14 秒后)之外,两者都完全相同。

由于我在收到第一个 webhook 后处理了许多方法和调用,因此只有在我完成发送消息作为响应后,才会将 200 OK 响应发送回 FB(因此延迟了 14 秒)。

所以我有两个问题:

  1. 14 秒的延迟是否太长,这就是 FB 重新发送的原因?如果是这样,我怎样才能立即发送 200OK 响应(head :ok)?

  2. 这完全是另一个问题吗?

标签: rubyfacebookapihttpresponsefacebook-messenger

解决方案


您还确保禁用“Echo”。

转到设置> Webhook,编辑事件。

在此处输入图像描述

推荐使用 NodeJS 之类的异步语言,在我的情况下,您使用 AWS SQS,我有工作人员在不阻塞的情况下处理请求(不要等待),我向 FB 返回 200“ok”以避免 FB 再次将消息发送到我的 webhook .

另一种方法可能将中间存储在数据库中,如果中间存在,则检查每个请求,如果存在则不处理消息。我使用启用了 TTL 的 Dynamo DB (AWS),因此使用 TTL,我的数据库每小时自动清理一次,以擦除旧请求


推荐阅读