微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

警告 - 12200 架构验证警告提供的 XML 不符合 Twilio 标记 XML 架构

如何解决警告 - 12200 架构验证警告提供的 XML 不符合 Twilio 标记 XML 架构

我正在按照本教程设置 Twilio-Dialogflow WhatsApp 聊天机器人: https://www.youtube.com/watch?v=r5EMHIQiGWE

代码如下:

from http.client import responses
from flask import Flask,request,jsonify
import os,dialogflow
from flask.globals import session
from google.api_core.exceptions import InvalidArgument
import requests

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'private_key.json'
DIALOGFLOW_PROJECT_ID = 'whatsapp-twilio-flask-dia-svau'
DIALOGFLOW_LANGUAGE_CODE = 'en'
SESSION_ID = 'me'

app = Flask(__name__)
app.config["DEBUG"] = True

@app.route('/')
def root():
    return "Hello World"

@app.route('/api/getMessage',methods=['POST'])
def home():
    message = request.form.get('Body')
    mobnum = request.form.get('From')
    session_client = dialogflow.SessionsClient()
    session = session_client.session_path(DIALOGFLOW_PROJECT_ID,SESSION_ID)
    text_input = dialogflow.types.TextInput(text=message,language_code = DIALOGFLOW_LANGUAGE_CODE)
    query_input = dialogflow.types.QueryInput(text=text_input)
    try:
        response = session_client.detect_intent(session=session,query_input=query_input)
    except InvalidArgument:
        raise
    sendMessage(mobnum,response.query_result.fulfillment_text)
    return response.query_result.fulfillment_text

def sendMessage(mobnum,message):
    url = "https://api.twilio.com/2010-04-01/Accounts/XXXXXXXXXX/Messages.json"
    payload = {'From': 'whatsapp:+14155238886','Body': message,'To': mobnum}
    headers = {'Authorization': 'Basic XXXXXXXXXXXXXXXXXXXXXXXXXXX'  }
    response = requests.request("POST",url,headers = headers,data=payload)
    print(response.text.encode('utf8'))
    return ""

if __name__ == '__main__':
    app.run()

在 Twilio 上运行代码会出现此错误,因此我没有在 WhatsApp 中得到回复

Warning - 12200
Schema validation warning
The provided XML does not conform to the Twilio Markup XML schema. 

response.text 返回这个:

print(response.text.encode('utf8')) :

b'{"sid": "XXX","date_created": "XXX","date_updated": "XXX","date_sent": null,"account_sid": "XXX","to": "whatsapp:+XXX","from": "whatsapp:+XXX","messaging_service_sid": null,"body": "Good day! What can I do for you today?","status": "queued","num_segments": "1","num_media": "0","direction": "outbound-api","api_version": "2010-04-01","price": null,"price_unit": null,"error_code": null,"error_message": null,"uri": "XXX","subresource_uris": {"media": "XXX"}}'

有人可以帮忙吗?我是否因为没有使用 twilio.twiml 库而从 Twilio 收到上述错误?但是从教程视频中,我没有看到正在使用这个库。

解决方法

这里是 Twilio 开发者布道者。

您(和视频教程)设置响应的方式不太正确。您已将 WhatsApp 沙盒网络钩子指向您的 /api/getMessage 端点,这是正确的,但您响应该请求的方式不适用于 Twilio。

当 Twilio 向您的应用程序发出 Webhook 请求时,它期望响应是包含 TwiML 的 XML 响应。您甚至可以使用 TwiML 来响应消息,因此您无需向 REST API 发出请求即可发送消息。

为了让事情变得更简单,您可以做的另一件事是install and use the Twilio Python helper library。您可以使用它向 API 发出请求以及构建 TwiML 响应。

因此,我建议您安装 Twilio Python 库:

pip install twilio

然后使用应用程序中的库来构建并返回 TwiML 响应,如下所示:

from http.client import responses
from flask import Flask,request,jsonify,Response
import os,dialogflow
from flask.globals import session
from google.api_core.exceptions import InvalidArgument
from twilio.twiml.messaging_response import MessagingResponse
import requests

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = 'private_key.json'
DIALOGFLOW_PROJECT_ID = 'whatsapp-twilio-flask-dia-svau'
DIALOGFLOW_LANGUAGE_CODE = 'en'
SESSION_ID = 'me'

app = Flask(__name__)
app.config["DEBUG"] = True

@app.route('/')
def root():
    return "Hello World"

@app.route('/api/getMessage',methods=['POST'])
def home():
    message = request.form.get('Body')
    mobnum = request.form.get('From')
    session_client = dialogflow.SessionsClient()
    session = session_client.session_path(DIALOGFLOW_PROJECT_ID,SESSION_ID)
    text_input = dialogflow.types.TextInput(text=message,language_code = DIALOGFLOW_LANGUAGE_CODE)
    query_input = dialogflow.types.QueryInput(text=text_input)
    try:
        intent = session_client.detect_intent(session=session,query_input=query_input)
    except InvalidArgument:
        raise
    response = MessagingResponse()
    response.message(intent.query_result.fulfillment_text)
    return Response(str(response),mimetype="application/xml")

if __name__ == '__main__':
    app.run()

在这段代码中,我们没有调用原始的 sendMessage 函数,而是从 MessagingResponse 导入 twilio.twiml.messaging_response 并创建一个我们作为 XML 返回的响应,使用 Response 对象来设置内容和 mimetype。

Response(str(response),mimetype="application/xml")

这将简化您的代码并消除架构验证警告。查看 building with Twilio and Flask 上的这篇博文了解更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。