FB Messenger API-接收重复请求

时间:2018-07-23 10:14:03

标签: ruby facebook api httpresponse facebook-messenger

我有一个使用Ruby构建的FB Bot,它可以让玩家玩寻宝游戏。

有时候,当我在一个团队中有多个玩家时,FB会两次向我发送一个玩家“ Answer” webhook。我调查了一下,起初以为如果FB没有收到200 OK响应(Docs here),则与20秒超时有关。在检查了日志之后,仅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. 这完全是另一个问题吗?

2 个答案:

答案 0 :(得分:0)

您还请确保已禁用“回声”。

转到“设置”>“ Webhooks”,编辑事件。

enter image description here

推荐使用像NodeJS这样的异步语言,在我的情况下,如果使用AWS SQS,我的工作人员会处理请求而未阻止(不要等待),我向FB返回200,“确定”,以避免FB再次发送消息到我的网络挂钩。

没有办法可能将 mid 存储在数据库中,并检查每个请求中是否存在 mid ,如果存在则不处理消息。我使用启用了TTL的Dynamo DB(AWS),因此每小时使用TTL删除我的数据库 autoclean 即可。

答案 1 :(得分:0)

我认为这是等待回复的15秒等待时间,当您回复的速度不够快时,Facebook自动重试也会发生在我身上。 Te EEe Te的想法很扎实,编写一些机制来缓存中点并在处理之前检查它是否重复