Facebook Messenger Webhook不断发送消息

时间:2016-04-19 09:26:47

标签: facebook webhooks facebook-messenger messenger

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

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

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

http://prntscr.com/au3emz

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

感谢。

5 个答案:

答案 0 :(得分:4)

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

来自文档;

  

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

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

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

<强>解决方案: 修改您的页面订阅以排除message_echoes

enter image description here

答案 1 :(得分:3)

当某人向您的Facebook页面发送消息时,Facebook将该消息传输到您的Webhook地址,并等待诸如OK之类的http响应。并且它会一直向您的Webhook发送相同的消息,直到响应到达为止。

来自Facebook webhook文档(Webhook docs;

  

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

     

在您的Webhook确认消息后,收据将自动发送给用户。您还可以使用“发件人操作”通知已看到该消息。

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

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

希望这会有所帮助,

答案 2 :(得分:1)

我的测试应用程序遇到了同样的问题。我仍然是Messenger API的新手,我的解决方案可能很天真。

最初,代码就像:

[Serializable]
public class ListPokemons
{
    public string name;
    public GameObject componentObjc;
    public int hp;
    public int mana;
    public int rarity;    
}

public ListPokemons[] pokeAtributs;

// Use this for initialization
void Start () 
{
    //You are missing this part in your code (10 pokeAtributs  )
    pokeAtributs = new pokeAtributs[10];

    //Now you can do your stuff
    List<ListPokemons> list = pokeAtributs.ToList ();

}

永远发送响应1。正确的代码是:

if (text) {
  sendTextMessage(sender, 'Response 1');
} else {
  queryDB(
    sendTextMessage(sender, 'Response 2');
  )
}
res.sendStatus(200);

发送邮件后,您必须始终发送状态。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

<强>解决方案

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

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

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

感谢。