我正在学习使用Facebook Messenger API。我已成功设置webhook,我已订阅该应用程序。但是当我向我的页面发送消息时,我收到了同一个消息的多个实例,如爆发。
我正在存储从我的应用程序发送的消息,当它在Webhook上接收时。
我的数据库视图如下面的屏幕截图所示。
我猜这可能是因为邮件仍未读?只是一个疯狂的猜测可能是其他人肯定知道的。我尝试了Facebook Office(节点)的确切示例,它也在那里发生。
感谢。
答案 0 :(得分:4)
如果您订阅 echo 消息callback event,通常会导致这种情况。
来自文档;
当您的信息页已发送消息时,将发生此回调。
这意味着您将获得机器人发送的任何消息的副本。从你的代码中,这将导致一种无限循环的形式;你会继续收到Response 1
。
您可以通过检查text
的值来轻松确认这一点;您会发现它也是Response 1
,并且在检查整个有效负载时,它将包含字段"is_echo":true
。
<强>解决方案:强>
修改您的页面订阅以排除message_echoes
答案 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重新订阅应用程序将停止任何进一步接收,直到下一条消息。
虽然解决方案的核心是“为什么会这样?”还不知道。如果有人能做出贡献,我们会很高兴。
感谢。