Twilio报12200 Schema验证警告,Dialogflow WhatsApp聊天机器人无回复如何解决?
问题解决方法
错误根源
你遇到的Twilio 12200 Schema校验错误,是因为Twilio向你的/api/getMessage接口发送Webhook请求后,接口返回了纯文本内容,Twilio默认要求Webhook接口必须返回符合TwiML规范的XML格式响应,哪怕你已经主动调用Twilio发信接口推送回复,也需要返回合法的响应格式,否则就会触发该警告。
从你贴的接口返回日志可以看到,你主动调用Twilio发信的请求已经提交成功(status字段为queued),没有收到WhatsApp回复和这个警告没有直接关系,后面会补充排查点。
修复方案
方案1:保留现有主动发信逻辑,仅修改返回值
不需要修改现有的sendMessage调用逻辑,只需调整接口返回格式为合法TwiML即可,修改代码如下:
- 首先引入flask的make_response工具:
from flask import Flask, request, jsonify, make_response
- 修改
home接口的返回逻辑,替换原来的return response.query_result.fulfillment_text部分:
sendMessage(mobnum,response.query_result.fulfillment_text) # 新增返回合法TwiML的逻辑 resp = make_response('<Response />') resp.headers['Content-Type'] = 'application/xml' return resp
方案2:改用TwiML返回回复,省略主动发信步骤
这种方式更简洁,不需要你自己封装请求调用Twilio发信接口,直接通过返回TwiML让Twilio自动发送回复:
- 先安装twilio库:
pip install twilio
- 修改代码引入TwiML工具:
from twilio.twiml.messaging_response import MessagingResponse
- 替换
home接口里的sendMessage调用和原有返回逻辑:
# 删掉原来的sendMessage调用,替换为以下代码 resp = MessagingResponse() resp.message(response.query_result.fulfillment_text) return str(resp), 200, {'Content-Type': 'application/xml'}
教程未使用TwiML仍可运行的原因
你参考的教程未使用TwiML也能正常运行,大概率是教程发布时间较早,当时Twilio对Webhook返回值的校验规则更宽松,允许返回非TwiML格式的内容。
收不到WhatsApp回复的排查点
修改完返回格式后如果还是收不到消息,按以下顺序排查:
- 确认
sendMessage方法里的Twilio ACCOUNT_SID、AUTH_TOKEN(即headers里的Basic认证串,为ACCOUNT_SID:AUTH_TOKEN的Base64编码)填写正确 - 测试阶段需要你的WhatsApp账号先给Twilio官方测试号
+14155238886发送教程要求的加入代码,完成测试账号绑定才能收到消息 - 确认你的Flask服务已经通过内网穿透工具暴露到公网,Twilio控制台配置的Webhook地址和你服务的公网地址一致,请求方法设置为POST
内容的提问来源于stack exchange,提问作者sirimiri
相关产品推荐
相关产品推荐

