基于Twilio与Node.js的WhatsApp机器人:无法回复消息问题
修复Twilio WhatsApp机器人无法回复消息的问题
看起来你的机器人已经能发单向消息,但卡在接收用户消息后回复这一步了,我帮你排查下核心问题和修复方案:
核心问题分析
你的代码里有两个关键问题导致无法正常回复:
- 没有向Twilio返回合法响应:Twilio调用你的Webhook后,需要你返回200状态码或Twiml响应,否则它会认为请求失败,不会完成后续流程,甚至会重试请求。
- 硬编码用户号码:你把
to字段写死成了固定值,但实际应该从Twilio的请求参数中获取用户的真实号码(req.body.From),不然无法针对发起消息的用户回复。
修复后的完整代码
// 先确保正确初始化Twilio客户端 const twilio = require('twilio'); const client = twilio('YOUR_ACCOUNT_SID', 'YOUR_AUTH_TOKEN'); const express = require('express'); const app = express(); // 必须解析Twilio发送的表单数据(Twilio默认用x-www-form-urlencoded格式) app.use(express.urlencoded({ extended: true })); app.post('/message', (req, res) => { const incomingMessage = req.body.Body.trim().toLowerCase(); const userPhoneNumber = req.body.From; // 从Twilio请求中获取用户的WhatsApp号码(自动带whatsapp:前缀) const twilioWhatsappNumber = 'whatsapp:+YOUR_TWILIO_NUMBER'; // 注意格式要带whatsapp:前缀 if (incomingMessage === 'hello') { client.messages .create({ body: 'Hello, how can I help you?', from: twilioWhatsappNumber, to: userPhoneNumber }) .then((message) => { console.log(`回复消息成功,SID: ${message.sid}`); // 向Twilio返回200状态码,确认请求处理完成 res.status(200).send('Message sent'); }) .catch((error) => { console.error('发送回复失败:', error); // 出错时也要返回状态码,避免Twilio重试 res.status(500).send('Failed to send message'); }); } else { // 处理非"hello"的消息,同样需要返回响应 res.status(200).send('Received message, no response configured'); } }); // 启动服务器,确保端口可访问 app.listen(3000, () => { console.log('Server running on port 3000'); });
额外检查点
- Webhook配置:在Twilio控制台的WhatsApp号码设置中,把"当收到消息时"的Webhook URL设为你的公网可访问地址(比如用ngrok暴露本地端口),方法选择
POST,格式选application/x-www-form-urlencoded。 - 号码格式:所有WhatsApp号码必须带
whatsapp:前缀,Twilio会自动在req.body.From中带上这个前缀,你直接用就行。 - 依赖安装:确保已经安装了
express和twilio包:npm install express twilio
内容的提问来源于stack exchange,提问作者yossi lerer
相关产品推荐
相关产品推荐

