如何通过Twilio Webhook在WhatsApp与IBM Watson集成中获取媒体URL
核心思路
Twilio收到WhatsApp图片消息后,会通过Webhook发送包含媒体信息的请求,你可以通过中间服务转译请求格式,直接把媒体URL传递给IBM Watson;也可以只传消息ID到Watson,再让Watson调用Twilio API获取媒体URL。
方案一:通过中间服务直接传递媒体URL
配置Twilio Webhook
在Twilio的WhatsApp号码设置中,将Webhook地址指向你搭建的中间服务接口(比如https://your-server.com/twilio-webhook)。Twilio收到图片消息时,会自动发送POST请求到这个接口,请求里包含MediaUrl0(图片直接访问URL)、MessageSid(消息ID)、Body(图片文件名)等关键字段。中间服务处理并转发到Watson
用任意后端语言编写接口接收Twilio的请求,提取媒体信息后,按照IBM Watson的要求格式发送请求。以下是Node.js Express的示例代码:
const express = require('express'); const axios = require('axios'); const app = express(); app.use(express.urlencoded({ extended: true })); // 接收Twilio的Webhook请求 app.post('/twilio-webhook', async (req, res) => { // 提取Twilio请求中的媒体信息 const mediaUrl = req.body.MediaUrl0; const messageSid = req.body.MessageSid; const fileName = req.body.Body; // 构造Watson需要的请求体 const watsonPayload = { input: { text: `用户发送了图片:${fileName},访问链接:${mediaUrl}` }, // 若Watson支持结构化数据,可单独传递字段到上下文 context: { media_url: mediaUrl, message_sid: messageSid, file_name: fileName } }; // 发送请求到IBM Watson的对话API await axios.post('YOUR_WATSON_ASSISTANT_API_URL', watsonPayload, { headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_WATSON_API_KEY' } }); // 给Twilio返回空响应,告知消息已处理 res.send('<Response></Response>'); }); app.listen(3000, () => console.log('中间服务运行在3000端口'));
- Watson中使用媒体URL
在Watson Assistant的对话节点中,你可以直接引用context.media_url变量获取图片链接,用于后续存储、展示或业务逻辑处理。
方案二:传递MessageSid到Watson,由Watson主动获取媒体URL
如果不想搭建中间服务,也可以让Twilio把MessageSid传给Watson,再通过Watson的Webhook调用Twilio API获取媒体URL:
配置Twilio直接传递MessageSid
在Twilio的Webhook设置中,确保请求包含MessageSid字段(默认会包含),将Webhook直接指向Watson的Webhook地址,或通过Watson的对话节点触发Webhook调用。Watson中调用Twilio API获取媒体URL
在Watson的Webhook实现中,用Twilio的账号凭据调用Messages API,通过MessageSid获取媒体信息:
const twilio = require('twilio'); const client = twilio('你的Twilio Account SID', '你的Twilio Auth Token'); // Watson Webhook的处理函数 exports.handler = async (req) => { const messageSid = req.body.context.message_sid; // 从Watson上下文中获取MessageSid const message = await client.messages(messageSid).fetch(); const mediaUrl = message.media[0]?.url; // 获取第一张图片的URL // 返回媒体URL到Watson上下文 return { context: { media_url: mediaUrl } }; };
注意:这种方式需要在Watson的Webhook中存储Twilio的敏感凭据,建议用环境变量管理,避免泄露。
内容的提问来源于stack exchange,提问作者gayatri

