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

问题描述

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

enter image description here

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

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

enter image description here

我的ngrok控制台显示如下

enter image description here

我的 twilio 控制台日志显示如下

enter image description here

由于某种原因,我无法解析发送到我的 webhook 的请求对象。此帐户处于免费试用状态。任何人都可以向我指出解析传入消息的正确文档。

解决方法

这里是 Twilio 开发者布道者。

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

因此,您应该从 request.form 读取数据,并且由于您似乎并不希望告诉 Twilio 对请求执行任何进一步操作,因此返回一个空的 <Response> {{3 }}。

这样的事情应该可以工作:

@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

Webhook FAQ

对于入站文本消息,Twilio 将发送一个 HTTP POST 请求到 您的服务器的主体使用 application/x-www-form-urlencoded 编码。查看名单 该请求中发送的参数。