Всегда получаю 400: неверный запрос при настройке веб-перехватчика Twilio

Я хочу вести отдельный список отписавшихся от телефона Twilio, и это можно сделать, когда webhook настроен через консоль Twilio для приема входящих сообщений. Я бы разбирал только те сообщения, когда кто-то набирает "СТОП". Я успешно настроил веб-перехватчик

Теперь, когда я набираю "СТОП" на свой номер Twilio со своего телефона, я получаю всегда плохой запрос. Мой код выглядит следующим образом

      @app.route('/twilio/unsubscribes_incremental', methods=['POST', 'GET'])
def phone_unsubscribes_incremental():
    print("start")
    print("The arguments are ", request.args)
    payload = request.get_json(force=True)
    print("The payload is ", payload)
    #resp = MessagingResponse()
    if payload.get('Body') in twilio_unsubscribe_list:
        stream_data_to_bq(payload)
    #resp.message("")
    #return str(resp)
    return jsonify({"status":"ok"})

Моя консоль python показывает следующее

Моя консоль ngrok показывает следующее

Журналы моей консоли Twilio показывают следующее

По какой-то причине я не могу проанализировать объект запроса, отправленный на мой веб-перехватчик. Эта учетная запись находится в бесплатной пробной версии. Может ли кто-нибудь указать мне на правильную документацию для анализа входящих сообщений.

2 ответа

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

Как указывает Алан, веб-перехватчик Twilio запрашивает отправку данных в форме application/x-www-form-urlencoded, тот же формат, в котором веб-форма будет публиковать данные. Это не JSON. Twilio также ожидает, что ответ вашего приложения будет application/xml.

Итак, вы должны прочитать данные из request.formи, поскольку не похоже, что вы ожидаете, что Twilio сделает что-то еще с запросом, верните пустой <Response> TwiML-элемент.

Что-то вроде этого должно работать:

      @app.route('/twilio/unsubscribes_incremental', methods=['POST', 'GET'])
def phone_unsubscribes_incremental():
    print("start")
    print("The arguments are ", request.args)
    payload = request.form
    print("The payload is ", payload)
    if payload.get('Body') in twilio_unsubscribe_list:
        stream_data_to_bq(payload)
    resp = MessagingResponse()
    return str(resp), { 'Content-Type': 'application/xml' }

Вебхук application/x-www-form-urlencoded

Часто задаваемые вопросы о вебхуках

Для входящих текстовых сообщений Twilio отправит запрос HTTP POST на ваш сервер с телом, в котором используется кодировка application/x-www-form-urlencoded. Просмотрите список параметров, отправленных в этом запросе.

Другие вопросы по тегам