如何使用Node.JS接收来自Twilio的Whatsapp消息?

问题描述 投票:2回答:1

我正试图使用Node.JS构建一个Whatsapp聊天机器人,在接收来自Twilio的Whatsapp消息时遇到了一点麻烦。在检查调试器时,我得到了一个Bad Gateway错误,即Error 11200: HTTP Retrieval Failure。消息正在发送,ngrok显示了post请求,但是,dialogflow没有收到请求。在终端上,错误显示为UnhandledPromiseRejectionWarning。错误:3 INVALID ARGUMENT 3 INVALID ARGUMENT。输入文本未设置。我不知道是不是因为消息不是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;
    },


javascript node.js twilio whatsapp
1个回答
1
投票

Twilio开发者布道者在此。

问题是您没有将正确的消息体从传入的WhatsApp消息传递给您的 textQuery 功能。

首先,你应该确保你把来自Twilio的webhook处理为 application/x-www-form-urlencoded. 如果你使用的是body-parser,请确保你开启了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 });
    }
}

希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.