Отслеживание статуса доставки сообщений в Python - PullRequest
0 голосов
/ 14 июля 2020

Мне постоянно приходится отслеживать статус доставки сообщений в Flask, Twilio и Python. Я нашел приведенный ниже код в документации Twilio для отслеживания доставки, но мне трудно его реализовать.

Как мне go из приведенного ниже кода, чтобы на самом деле видеть статус доставки сообщения в 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 голосов
/ 14 июля 2020

Вы указываете URL-адрес как status_callback, когда отправляете SMS :

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-адреса, указанного выше, измените его на свой URL-адрес ngrok. Однако имейте в виду, что URL-адрес ngrok изменяется каждый раз, когда вы перезапускаете соединитель, за исключением платного плана (очевидно) . Таким образом, вам нужно будет изменять URL-адрес в приведенном выше коде каждый раз, когда вы перезапускаете соединитель ngrok.

Имея это в виду, вы можете затем настроить отдельное приложение для обработки обратного вызова согласно блоку кода в вашем вопросе.

ОБНОВЛЕНИЕ

Я могу позвонить, но у меня все еще есть проблемы с Flask и статусом обратного вызова.

У меня нет учетной записи в Twillio для тестирования, но сначала я бы проверил, действительно ли запрос обратного вызова попадает на ваш Flask сервер.

Я предполагаю из do c ' s, что с status_callback URL-адресом http://postb.in/1234abcd этот запрос фактически попадает в конечную точку http://postb.in/1234abcd/MessageStatus, однако возможно, что это ошибка, и код flask должен быть: @app.route('/1234abcd'), если вы предоставили такой URL-адрес. (В документации это не слишком ясно).

Если вы уверены, что запрос достигает сервера, но ваш код не обрабатывает его должным образом, может быть целесообразно настроить универсальный маршрут, например:

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 -
...