【问题标题】:facebook messenger bot api with node js sends multiple replies带有节点 js 的 facebook messenger bot api 发送多个回复
【发布时间】:2016-10-26 13:12:52
【问题描述】:

消息机器人 api 出现错误。出于某种原因,它会在向某个用户发送消息时触发多个,例如 20 个。我在节点上使用heroku。我不知道它为什么这样做?任何帮助将非常感激。

"use strict";
var express = require("express");
var app = express();
var bodyParser = require('body-parser');
var request = require('request');

app.use(bodyParser.json());

app.get('/', function(req, res){

   res.send('hello'); 

});


app.get('/webhook', function (req, res) {
    if (req.query['hub.verify_token'] === 'my_voice_is_my_password_verify_me') {
        res.send(req.query['hub.challenge'])
    }
    res.send('Error, wrong token')
})
app.post('/webhook', function (req, res) {
    let messaging_events = req.body.entry[0].messaging;
    for (let i = 0; i < messaging_events.length; i++) {
        let event = req.body.entry[0].messaging[i]
        let sender = event.sender.id
        if (event.message && event.message.text) {
            let text = event.message.text
            sendTextMessage(sender, "Text received, echo: " + text.substring(0, 200))
        }
    }
    res.sendStatus(200)
})

function sendTextMessage(sender, text) {
    let messageData = { text:text }
    request({
        url: 'https://graph.facebook.com/v2.6/me/messages',
        qs: {access_token: process.env.PAGE_ACCESS_TOKEN},
        method: 'POST',
        json: {
            recipient: {id:sender},
            message: messageData,
        }
    }, function(error, response, body) {
        if (error) {
            console.log('Error sending messages: ', error)
        } else if (response.body.error) {
            console.log('Error: ', response.body.error)
        }
    })
}







app.listen(process.env.PORT || 8080);

【问题讨论】:

  • 您的代码看起来不错。您发送的所有值是什么以及按什么顺序发送?
  • 有人找到解决这个问题的方法吗?目前我正在缓存每条消息并检查下一条消息之间的时间差。如果它以微秒为单位,我将忽略它。这似乎解决了我现在的目的。

标签: node.js heroku facebook-messenger chatbot facebook-chatbot


【解决方案1】:

这可能是 Messenger 客户端的错误。他们在使用 Android 应用程序时遇到了很多问题。检查this bugthis bug

我建议您使用具有下限的rate limiter(例如,每秒最多 1 个请求)来解决问题。这也将防止将来 Messenger 客户端中可能出现的错误。或者您可以等待他们解决客户端中的问题,但请记住,版本过时的用户会给您的机器人带来麻烦。

另外,请考虑您可以在消息事件中接收送达回执。考虑在代码中插入下面的 sn-p 以忽略这些事件。

...
for (let i = 0; i < messaging_events.length; i++) {
    let event = req.body.entry[0].messaging[i]
    if (event.hasOwnProperty('delivery')) {
        continue;
    }

    ...
}
...

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2018-05-09
    • 2017-06-04
    相关资源
    最近更新 更多