跟踪Python中消息的传递状态

时间:2020-07-14 01:30:53

标签: python flask twilio

我一直在跟踪Flask,Twilio和Python中消息的传递状态。我在Twilio的文档中找到了以下用于跟踪投放的代码,但是很难实现它。

如何从下面的代码转到在Python中实际查看消息的传递状态?我正在运行ngrok,但是很困惑将该URL放在何处。任何帮助表示赞赏!

from flask import Flask, request
import logging

logging.basicConfig(level=logging.INFO)

app = Flask(__name__)

@app.route("/MessageStatus", methods=['POST'])
def incoming_sms():
    message_sid = request.values.get('MessageSid', None)
    message_status = request.values.get('MessageStatus', None)
    logging.info('SID: {}, Status: {}'.format(message_sid, message_status))

    return ('', 204)

if __name__ == "__main__":
    app.run(debug=True)

1 个答案:

答案 0 :(得分:0)

send the SMS时,您以status_callback的形式提供URL:

from twilio.rest import Client

# Your Account Sid and Auth Token from twilio.com/console
# DANGER! This is insecure. See http://twil.io/secure
account_sid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
auth_token = 'your_auth_token'
client = Client(account_sid, auth_token)

message = client.messages \
    .create(
         body='McAvoy or Stewart? These timelines can get so confusing.',
         from_='+15017122661',
         status_callback='http://postb.in/1234abcd',
         to='+15558675310'
     )

print(message.sid)

因此,将其更改为您的ngrok URL,而不是上面的postb.in URL。但是请注意,除非在付费计划(apparently)上,否则每次重新启动连接器时,ngrok URL都会更改。因此,每次重新启动ngrok连接器时,都需要在上述代码中更改URL。

请记住,然后您可以根据问题中的代码块将单独的应用设置为handle the callback


更新

我可以拨打电话,但是Flask和回拨状态仍然存在问题。

我没有要使用Twillio进行测试的帐户,但我首先要检查该回调请求是否确实在您的Flask服务器上。

我将从文档的代码示例中假设,请求的status_callback URL为http://postb.in/1234abcd实际上命中了端点http://postb.in/1234abcd/MessageStatus,但是有可能是错误的,并且flask代码应该是:@app.route('/1234abcd')(如果您提供了这样的URL)。 (在文档中不太清楚)。

如果您确定请求已到达服务器,但是您的代码无法正确处理,则建议设置catch-all路由,例如:

from flask import Flask, request
app = Flask(__name__)

@app.route('/', defaults={'path': ''}, methods=['POST'])
@app.route('/<path:path>', methods=['POST'])
def catch_all(path):
    print (path, request.url, request.get_data())
    return ('', 204)

这将使您可以检查到达服务器的所有请求,而不管路径如何。

您还可以使用requests库测试此万能路线(不要与Flask的request对象混淆!):

# From any other terminal
import requests
r = requests.post('http://localhost:5000/',json={1:2})
r = requests.post('http://localhost:5000/asd',data={3:4})

服务器控制台输出:

http://localhost:5000/ b'{"1": 2}'
172.17.0.1 - - [17/Jul/2020 23:11:55] "POST / HTTP/1.1" 200 -
asd http://localhost:5000/asd b'3=4'
172.17.0.1 - - [17/Jul/2020 23:12:00] "POST /asd HTTP/1.1" 200 -