Использование API-интерфейсов Twilio — I: отправка SMS-сообщений
я использовал SMS-API Twilio для моего веб-приложение который отправляет текстовые уведомления, чтобы предложить пользователям заполнить новую информацию на своих информационных панелях, когда конкретное событие было обновлено в базе данных. Приложение написано на Python Flask
и использует Postgres relational database
. Вот ссылка на код гитхаба для приложения. Следующая часть кода и объяснение, относящееся к Twilio SMS API, можно найти в модуле: send_twilio.py
.
Вспомогательная библиотека Twilio Python
Для взаимодействия с API Twilio сначала необходимо загрузить вспомогательную библиотеку Twilio. Я использую версию библиотеки Python- сумеречный питон который представляет собой модуль для использования Twilio REST API и создания действительного TwiML для SMS-взаимодействия с пользователями. Самую последнюю версию библиотеки можно найти на PyPi, и ее можно установить с помощью команды:
pip install twilio
Для доступа к библиотеке внутри вашего модуля Python можно использовать следующую команду импорта.
from twilio.rest import TwilioRestClient
Регистрация в Twilio
Чтобы использовать Twilio SMS API для отправки сообщений, необходимо зарегистрировать учетную запись Twilio и приобрести номер телефона Twilio. При регистрации назначается SID и токен аутентификации, которые можно использовать в вашем модуле Python для входа на сервер Twilio. Я начал с бесплатной пробной версии, но позже купил телефон без возможности SMS. Цены доступны для приложений с легким использованием, таких как мое, которые еще не масштабируются для большого количества пользователей.
ACCOUNT_SID = "AC85250cc80055bfd5dfe95eb9072eaa65"
AUTH_TOKEN = "8de0e1f992ca4f46499ec975a6d8c142"
#Twilio client is invoked to create an HTTP message
client = TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)
SMS-уведомления пользователям моего приложения с помощью Twilio API
Как только ваше приложение зарегистрируется в Twilio, у вас будет SID и токен, как указано выше. Twilio предоставляет API-интерфейсы, позволяющие сторонним приложениям взаимодействовать с Мое приложение использует таблицы БД «Пользователи» и «События» — таблица «Пользователи» содержит номера телефонов пользователей, которые должны быть уведомлены в случае обновления события, а таблица «События» содержит информацию о событии. статус (СОЗДАНО/ОБНОВЛЕНО/УДАЛЕНО), относящийся к различным событиям для каждого пользователя. Задание cron настроено для запуска этого модуля — планировщика SMS, который отслеживает базу данных на предмет любых обновленных событий и отправляет пользователю уведомление с запросом на обновление информации о событии. Планировщик отправляет триггерное сообщение в Twilio для отправки SMS-напоминаний пользователям, чьи события истекли, предлагая им заполнить информацию на информационных панелях приложений.
Запросы SQL-SELECT и UPDATE используются для поиска пользователей и обновления соответствующих событий в таблицах. Если запрос Twilio возвращается с действительным Sid (smsid, возвращенный Twilio), Sid сохраняется в файле журнала на будущее, а статус события обновляется до TWILIO_SMS_SENT.
#Twilio message schedule in the python module
def twilio_sms_scheduler():
import random
from random import randrange
batchid = randrange(0,10000)
marked_for_sms_events = models.Event.query.filter(and_(
models.Event.status==STATUS_CREATED,
models.Event.datetime<=datetime.datetime.now(), models.Event.batchid==0)).update(dict(batchid=batchid))
models.db.session.commit()
sms_events = models.Event.query.join(models.User).filter(and_(
models.Event.batchid==batchid, models.Event.userid==models.User.userid)).all()
#An HTTP POST message is sent to /2019-04-01/Accounts/{AccountsSid}/Message for event in sms_events:
if event.user.phone:
message = client.messages.create(
to=event.user.phone, from_="+19193733763",
body="This is a reminder to update the event desc here-
statuscallback="
Если для SMS от Twilio получен действительный Sid, обновите статус события.
if (message.sid is not None):
models.Event.query.filter_by(eventid=event.eventid).
update(dict(status=SATIAPP_STATUS_SENT_SMS))
models.db.session.commit()
return None