在 Python 中跟踪消息的传递状态

Posted

技术标签:

【中文标题】在 Python 中跟踪消息的传递状态【英文标题】:Track Delivery Status of Messages in Python 【发布时间】:2020-11-03 06:58:56 【问题描述】:

我一直在跟踪 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】:

当您 send the SMS 时,您提供的 URL 为 status_callback

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)

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

考虑到这一点,您可以根据问题中的代码块将单独的应用设置为 handle the callback。


更新

我可以拨打电话,但我仍然遇到 Flask 和回调状态问题。

我没有要测试的 Twillio 帐户,但我会先检查回调请求是否真的到达了您的 Flask 服务器。

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

如果您确定请求正在到达服务器,但您的代码没有正确处理它,那么设置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 -

【讨论】:

谢谢,我可以拨打电话,但我仍然遇到 Flask 和回调状态的问题。你会怎么做?

以上是关于在 Python 中跟踪消息的传递状态的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云消息传递消息日志

ios通知消息传递状态

获取 smack 中最近消息的传递状态

如何在Python 3.5中的异步方法调用之间传递上下文?

salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

专为实时而构建:使用Apache Kafka进行大数据消息传递 第2部分