Facebook Messenger API整体上非常甜美。但是,每当用户向我的机器人发送贴纸(例如气球拇指贴纸)时,它总是会冻结约20秒。如果用户发送了很多贴纸,那么机器人就会崩溃,Facebook会发送给我#Webhook失败"开发人员警报。
我怀疑我的代码有问题,但我找不到任何错误。我发现有趣的是,当机器人崩溃并且Facebook发送给我时,#Webhook失败了#34;警报,如果我通过在命令行中输入以下内容将我的应用重新订阅到页面,则机器人将恢复并返回响应消息。
curl -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=<PAGE_ACCESS_TOKEN>"
以下是一些可能对您有所帮助的信息。
回购:https://github.com/lorix-lpan/r-score-god
Server.js:https://github.com/lorix-lpan/r-score-god/blob/master/src/server.js
Facebook页面:https://www.facebook.com/rscoregod/
注意:僵尸程序目前仍然无法供公众使用,请发送消息,以便我可以将您添加为测试用户。
非常感谢!
答案 0 :(得分:2)
最终,我自己想出了问题。我的代码确实存在问题(或者Facebook的入门代码;))。
来自Messenger平台的入门page
后处理程序定义如下
app.post('/webhook/', function (req, res) {
messaging_events = req.body.entry[0].messaging;
for (i = 0; i < messaging_events.length; i++) {
event = req.body.entry[0].messaging[i];
sender = event.sender.id;
if (event.message && event.message.text) {
text = event.message.text;
sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
}
}
res.sendStatus(200);
});
然而,当贴纸或GIF被发送到服务器时,&#34;消息&#34> &#34;事件的领域&#34;变量将为空。因此,自从sendTextMessage函数POST到Facebook服务器后,将不会评估以下块中的代码并且不会发出HTTP请求。
if (event.message && event.message.text) {
text = event.message.text;
sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
}
我通过简单地为贴纸和GIF(或其他附件)添加另一个简单的if语句解决了这个问题。当用户发送附件(GIF或贴纸)时,&#34;事件&#34;变量将有一个&#34;附件&#34;属性。换句话说,将定义event.attachments。我的解决方案如下:
app.post('/webhook/', function (req, res) {
messaging_events = req.body.entry[0].messaging;
for (i = 0; i < messaging_events.length; i++) {
event = req.body.entry[0].messaging[i];
sender = event.sender.id;
if (event.attachments) {
sendTextMessage(sender, 'I am an attachment');
}
if (event.message && event.message.text) {
text = event.message.text;
sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
}
}
res.sendStatus(200);
});
查看此commit了解更多详情