我有一个使用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秒)。
所以我有两个问题:
14秒延迟是否过长,这就是为什么FB重新发送?如果是这样,我如何立即发送200OK响应(head :ok
)?
这完全是另一个问题吗?
答案 0 :(得分:0)
您还请确保已禁用“回声”。
转到“设置”>“ Webhooks”,编辑事件。
推荐使用像NodeJS这样的异步语言,在我的情况下,如果使用AWS SQS,我的工作人员会处理请求而未阻止(不要等待),我向FB返回200,“确定”,以避免FB再次发送消息到我的网络挂钩。
没有办法可能将 mid 存储在数据库中,并检查每个请求中是否存在 mid ,如果存在则不处理消息。我使用启用了TTL的Dynamo DB(AWS),因此每小时使用TTL删除我的数据库 autoclean 即可。
答案 1 :(得分:0)
我认为这是等待回复的15秒等待时间,当您回复的速度不够快时,Facebook自动重试也会发生在我身上。 Te EEe Te的想法很扎实,编写一些机制来缓存中点并在处理之前检查它是否重复