【问题标题】:Stickers and Gif cause Facebook Messenger bot to freeze贴纸和 Gif 导致 Facebook Messenger bot 冻结
【发布时间】:2016-04-26 12:14:03
【问题描述】:

Facebook Messenger API 总体上非常可爱。但是,每当用户向我的机器人发送贴纸(例如,气球大拇指贴纸)时,它总是会冻结大约 20 秒。如果用户发送大量贴纸,机器人就会崩溃,Facebook 会向我发送“Webhook 失败”开发者警报。

我怀疑我的代码有问题,但我找不到任何错误。我发现一个有趣的事情是,当机器人崩溃并且 Facebook 向我发送“Webhook 失败”警报时,如果我通过在命令行中输入以下内容重新订阅我的应用程序到页面,机器人将恢复并回复消息。

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

脸书专页:https://www.facebook.com/rscoregod/

注意:该机器人目前仍不向公众开放,请留言,以便我将您添加为测试用户。

非常感谢!

【问题讨论】:

    标签: node.js facebook facebook-graph-api facebook-messenger


    【解决方案1】:

    最终,我自己找出了问题所在。我的代码(或 facebook 的入门代码;)确实有问题。

    来自Messenger平台的入门@9​​87654321@

    后处理程序定义如下

    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 时,“event”变量的“message”字段将为空。因此,不会评估以下块中的代码,并且不会发出 HTTP 请求,因为 sendTextMessage 函数 POST 到 Facebook 服务器。

    if (event.message && event.message.text) {
      text = event.message.text;
      sendTextMessage(sender, "Text received, echo: "+ text.substring(0, 200));
    }
    

    我通过简单地为贴纸和 GIF(或其他附件)添加另一个简单的 if 语句解决了这个问题。当用户发送附件(GIF 或贴纸)时,“事件”变量将具有“附件”属性。换句话说, 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了解更多详情

    【讨论】:

    • 嗨,当我在我的机器人中寻找类似问题的解决方案时,偶然发现了这个问题。你介意看看我在这里发布的问题,让我知道我错过了什么吗? stackoverflow.com/questions/48255932/…
    猜你喜欢
    • 2016-08-05
    • 2017-05-26
    • 2016-08-23
    • 2017-11-10
    • 2016-11-09
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多