配置 Twilio webhook 时总是收到 400:Bad 请求

Always receiving 400:Bad request when Twilio webhook is configured

我想维护单独的 twilio phone 取消订阅者列表,这可以在通过 twilio 控制台配置 webhook 以接收传入消息时完成。当有人输入“STOP”时,我只会解析那些消息。我已成功配置 webhook

现在,当我在我的 twilio 号码中输入“STOP”时,我的 phone 总是收到错误的请求。我的代码如下所示

@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控制台日志显示如下

出于某种原因,我无法解析发送到我的 webhook 的请求对象。此帐户正在免费试用中。谁能给我指出正确的文档来解析传入的消息。

网络钩子是 application/x-www-form-urlencoded

Webhook FAQ

For inbound text messages, Twilio will send an HTTP POST request to your server with a body that uses the application/x-www-form-urlencoded encoding. View the list of parameters sent in that request.

这里是 Twilio 开发人员布道者。

正如 Alan 指出的那样,Twilio webhook 请求以 application/x-www-form-urlencoded 格式发送数据,与 Web 表单 post 数据的格式相同。它不是 JSON。 Twilio 还期望您的应用程序的响应为 application/xml.

因此,您应该从 request.form 读取数据,并且由于看起来您并不期望告诉 Twilio 对请求做任何进一步的事情,return 一个空的 <Response> TwiML element.

像这样的东西应该可以工作:

@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' }