您如何使用Node.JS从Twilio接收Whatsapp消息?

时间:2020-05-11 10:22:33

标签: javascript node.js twilio whatsapp

我正在尝试使用Node.JS构建Whatsapp聊天机器人,并且在接收来自Twilio的Whatsapp消息时遇到了一些麻烦。在检查调试器时,出现错误的网关错误,即。错误11200:HTTP检索失败。消息正在发送,并且ngrok显示发布请求,但是,dialogflow没有收到该请求。在终端上,错误显示UnhandledPromiseRejectionWarning:错误:3无效参数:未设置输入文本。我不确定是否是因为消息不是JSON格式。请帮忙!

这是app.post函数:

app.post('/api/whatsapp_query', async (req, res) =>{
        message = req.body;
        chatbot.textQuery(message.body, message.parameters).then(result => {
            twilio.sendMessage(message.from, message.to, result.fulfillmentText).then(result => {
                console.log(result);
            }).catch(error => {
                console.error("Error is: ", error);
            });
            return response.status(200).send("Success");
        })
    });

这是我导入的sendMessage函数:

const config = require('./config/keys');

const twilioAccountID = config.twilioAccountID;
const twilioAuthToken = config.twilioAuthToken;
const myPhoneNumber = config.myPhoneNumber;

const client = require('twilio')(twilioAccountID,twilioAuthToken);

module.exports = {
    sendMessage: async function(to, from, body) {
        return new Promise((resolve, reject) => {
            client.messages.create({
                to,
                from,
                body
            }).then(message => {
                resolve(message.sid);
            }).catch(error => {
                reject(error);
            });
        });
    }
}

这是我导入的textQuery函数:

textQuery: async function(text, parameters = {}) {
        let self = module.exports;
        const request = {
            session: sessionPath,
            queryInput: {
                text: {
                    text: text,
                    languageCode: config.dialogFlowSessionLanguageCode
                },
            },
            queryParams: {
                payload: {
                    date: parameters
                }
            }
        };
        let responses = await sessionClient.detectIntent(request);
        responses = await self.handleAction(responses)
        return responses[0].queryResult;
    },


1 个答案:

答案 0 :(得分:1)

这里是Twilio开发人员的传播者。

问题是您没有将正确的消息正文从传入的WhatsApp消息传递到textQuery函数。

首先,您应确保将来自Twilio的传入Webhook视为application/x-www-form-urlencoded。如果您使用的是正文解析器,请确保已启用urlencoded解析。

app.use(bodyParser.urlencoded());

第二,Twilio发送的参数以大写字母开头。因此,您的代码当前获取message = req.body,然后使用message.body。但这应该是message.Body

那两点应该可以使您解决。

最后一件事。如果您不传递回调函数,则Twilio Node.js库将返回Promise。因此,您无需在此处创建Promise:

module.exports = {
    sendMessage: async function(to, from, body) {
        return new Promise((resolve, reject) => {
            client.messages.create({
                to,
                from,
                body
            }).then(message => {
                resolve(message.sid);
            }).catch(error => {
                reject(error);
            });
        });
    }
}

您只需将通话结果返回给client.messages.create

module.exports = {
    sendMessage: async function(to, from, body) {
        return client.messages.create({ to, from, body });
    }
}

希望这会有所帮助。