Предупреждение — Предупреждение о проверке схемы 12200 Предоставленный XML-код не соответствует XML-схеме разметки Twilio

#http #post #twilio #twilio-twiml

Вопрос:

Я настраиваю чат-бота WhatsApp Twilio-Dialogflow, следуя этому руководству: 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. 
 

ответ.текст возвращает это :

 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, потому что я не использовал библиотеки twilio.twiml? Но из обучающего видео я не вижу, чтобы эта библиотека использовалась.

Комментарии:

1. Я хотел бы помочь здесь, но я думаю, что мне нужно немного больше контекста. Ошибка 12200 возникает, когда вы не отвечаете на входящий запрос webhook от Twilio с правильным TwiML, но я не вижу, где вы отвечаете на запрос здесь. Можете ли вы поделиться кодом, который отвечает на HTTP-запрос от Twilio, пожалуйста?

2. Привет @philnash спасибо за ваш ответ, я отредактировал код, может помочь взглянуть еще раз? Спасибо

Ответ №1:

Евангелист-разработчик Twilio здесь.

То, как вы (и видеоурок) настроили ответ, не совсем правильно. У вас есть веб-крючок для песочницы WhatsApp, указанный на вашей /api/getMessage конечной точке, и это правильно, но способ, которым вы отвечаете на этот запрос, не подходит для Twilio.

Когда Twilio делает запрос на веб-соединение для вашего приложения, он ожидает, что ответ будет XML-ответом, содержащим TwiML. Вы даже можете использовать TwiML для ответа сообщением, поэтому вам не нужно отправлять запросы в REST API для отправки сообщения.

Еще одна вещь, которую вы можете сделать, чтобы упростить процесс, — это установить и использовать вспомогательную библиотеку Twilio Python. Вы можете использовать его для выполнения запросов к API, а также для создания ответов TwiML.

Поэтому я бы рекомендовал вам установить библиотеку Python Twilio:

 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")
 

Это одновременно упростит ваш код и избавит вас от предупреждения о проверке схемы. Проверьте эту запись в блоге о создании с помощью Twilio и Flask для получения дополнительной информации.