С выходом нового трейлера «Звездных войн» я в последнее время пребываю в настоящем космическом восторге. Это было довольно очевидно по моему наряду во время демо API на BostonHacks в прошлые выходные. Twilio также недавно устраивала закрытые показы «Марсианина» для участников сообщества в нескольких разных городах.
Неудивительно, что я считаю Международную космическую станцию (МКС) потрясающей. Естественно, мне захотелось знать, когда она пролетает прямо над мной. Узнав о существовании Open Notify API для МКС, я понял, что просто обязан создать систему уведомлений, которая позволит подписчикам получать SMS каждый раз, когда МКС пролетает над их регионом.
Вы можете посмотреть приложение, которое я создал, и изучить его код, если хотите. Или я могу показать вам пошагово, как его собрать, и как масштабировать отправку, используя пул номеров Twilio вместо одного, применяя новые функции Twilio Copilot.
**Инструменты для отслеживания МКС**
Мы создадим веб-приложение, в котором пользователи смогут подписываться на уведомления. Для этого мы будем использовать Flask в качестве веб-сервера и Open Notify API для МКС, чтобы узнавать, когда станция пролетает над заданными широтой и долготой.
Прежде чем приступить к написанию кода, убедитесь, что у вас установлены Python и pip (он должен идти в комплекте с большинством версий Python). Это будет работать как в Python 2.7, так и в Python 3. Вам также потребуется установить Redis, что можно сделать с помощью следующих команд в терминале:
Запустить сервер Redis сейчас было бы полезно, так как он понадобится нам позже. Запустите его в фоновом режиме с помощью этой команды:
Затем создайте virtualenv, чтобы мы могли чисто установить все наши библиотеки Python с помощью pip. Если вы не знакомы с pip и virtualenv, можете ознакомиться с этим руководством.
Давайте установим Flask для нашего веб-сервера и модуль Twilio для Python для отправки текстовых сообщений:
Чтобы отправлять текстовые сообщения в момент, когда запланирован пролет МКС, нам понадобится использовать очередь задач, такую как RQ, и планировщик для добавления задач в очередь в определенное время. RQ использует Redis в качестве бэкенда для очереди задач, а RQ Scheduler позволяет нам планировать добавление задач в очередь. Установка RQ Scheduler также автоматически установит зависимости RQ и redis-py:
Последняя зависимость, которую нужно установить — это requests, которая позволит нам отправлять GET-запросы к Open Notify API:
Наконец, прежде чем мы начнем писать код, убедитесь, что у вас есть хотя бы один номер телефона Twilio с поддержкой SMS в вашем аккаунте Twilio. У вас еще нет аккаунта Twilio? Не проблема, ведь регистрация занимает всего пару минут. Я подожду здесь, любуясь звездами, пока вы его оформите.
**Планирование с помощью Python-RQ**
Установив все зависимости, мы можем приступить к созданию приложения.
Open Notify API для МКС принимает GET-запрос с широтой и долготой местоположения пользователя и возвращает список временных меток для следующих запланированных пролетов над этой точкой. Давайте напишем функцию, которая будет возвращать объект datetime следующего пролета МКС для заданных широты и долготы.
Откройте файл с именем `iss.py`
и добавьте следующий код:
Попробуйте вызвать эту функцию с тестовыми значениями, чтобы проверить, что она действительно работает. В этом примере я собираюсь использовать местоположение штаб-квартиры Twilio. Откройте оболочку Python и попробуйте сделать следующее:
Затем, используя время, возвращаемое API, мы можем использовать rq-scheduler, чтобы поставить в очередь функцию, которая будет вызвана для отправки текстового сообщения во время следующего пролета.
Давайте напишем функцию, добавляющую задачу в нашу очередь для отправки текстового сообщения пользователю, который только что подписался.
Вернитесь к `iss.py`
и обновите свой код, добавив эту новую функцию и необходимые импорты:
В приведенном выше коде мы добавляем номер телефона в Redis для целей логирования в связке с широтой и долготой места, где находился пользователь в момент подписки. Затем мы получаем время следующего пролета МКС и планируем вызов функции `notify_subscriber`
. Эта функция пока только выводит сообщение, но позже мы настроим ее на отправку SMS.
Чтобы этот код заработал, мы сначала должны запустить процессы RQ Schedule.
Вернитесь в терминал и запустите rqworker в фоновом режиме. Этот процесс опрашивает Redis и выполняет текущие задачи из очереди:
Теперь запустите rqscheduler. Этот процесс опрашивает Redis каждую минуту и перемещает запланированные задачи в соответствующие очереди, когда их пора выполнять:
Наш текущий код выводит в консоль информацию каждый раз, когда МКС пролетает над заданными широтой и долготой. Давайте немного развлечемся и настроим нашу функцию `notify_subscriber`
на отправку текстовых сообщений.
**Отправка текстового сообщения с помощью Twilio в Python**
Теперь мы будем использовать TwilioRestClient для отправки SMS через REST API Twilio. Убедитесь, что вы приобрели номер телефона Twilio. Хотя это приложение будет отлично работать и с пробным аккаунтом, его апгрейд позволит вам удалить текстовую вставку пробного аккаунта из отправляемых сообщений, а также даст возможность покупать дополнительные номера для масштабирования приложения.
Давайте закончим писать нашу функцию `notify_subscriber`
для отправки реального текстового сообщения. Вернитесь к `iss.py`
и добавьте следующий выделенный код:
Обратите внимание, что в конце мы снова добавляем подписчика в очередь планировщика. Это позволяет нам продолжать отправлять уведомления каждый раз, когда МКС возвращается. Теперь мы также отправляем им текстовое сообщение при первоначальном добавлении в очередь. Не забудьте заменить `TWILIO_PHONE_NUMBER`
на реальный номер телефона, с которого можно отправлять сообщения.
Чтобы этот код заработал, вам нужно будет задать ваши учетные данные аутентификации Twilio в качестве переменных среды. Эти значения можно найти на панели управления вашего аккаунта:
Если вы хотите увидеть этот код в действии, добавьте следующие две строки в ваш файл для вызова функции `add_to_queue`
. Вы можете вызвать ее с вашими реальными широтой и долготой, но пока я укажу фиктивные значения:
Вы должны получить сообщение о подписке, и, если хотите проверить, работают ли уведомления, можете посмотреть, где в данный момент находится МКС.
**Создание Flask-приложения для подписчиков**
Flask — это очень простой и легковесный веб-фреймворк для Python. Нам нужен лишь базовый функционал, и Flask дает нам именно то, что нужно.
Создайте базовый файл `app.py`
для нашего Flask-приложения. Пока мы просто будем возвращать страницу `index.html`
:
В приведенном выше коде мы задаем маршрут `/`
, который принимает `GET`
-запросы. Этот маршрут просто возвращает `index.html`
, который будет служить нашей страницей регистрации. Этот HTML-файл еще не существует, так что давайте это исправим. На странице будет форма с полем ввода для номера телефона и кнопкой отправки. Создайте директорию с именем `templates`
, откройте файл с именем `index.html`
и добавьте следующий код:
Обратите внимание, что мы создали два скрытых элемента для хранения значений широты и долготы. Мы получим их с помощью GeoLocation API из HTML5. Создайте директорию с именем `static`
и запишите следующий код в файл с именем `getLocation.js`
внутри вашей новой директории:
Теперь подключите этот скрипт в вашем `index.html`
в самом низу блока `:`
Проверьте, работает ли это, запустив ваше Flask-приложение:
И перейдите по адресу http://localhost:5000/, чтобы увидеть его в действии, прежде чем вернуться к коду.
Теперь создайте маршрут для отправки формы методом `POST`
. Снова откройте `app.py`
и добавьте маршрут `/subscribe`
, который добавляет пользователя в очередь с его номером телефона, широтой и долготой. Снова откройте ваш файл `app.py`
и добавьте этот маршрут:
Теперь у нас есть приложение, с помощью которого люди могут подписываться на уведомления о МКС!
**Масштабирование с помощью Twilio Copilot**
Всё это потрясающе, но Международная космическая станция *является* международной в конце концов. Что, если мы захотим уведомлять друзей со всего мира, используя пул номеров Twilio? Здесь на сцену выходит Twilio Copilot, предоставляя несколько новых функций, которые делают добавление международных возможностей в наше приложение очень простым.
В частности, мы будем использовать Geo-Match для отправки уведомлений с номера, находящегося в стране подписчика, и Sticky Sender, чтобы гарантировать, что это уведомление всегда приходит с одного и того же номера Twilio.
Перейдите в свой аккаунт Twilio и создайте сервис обмена сообщениями (messaging service) на панели управления. Вы сможете добавить любые заранее купленные номера телефонов в ваш сервис или купить новые. Купите несколько номеров телефонов в разных странах и добавьте их в ваш сервис обмена сообщениями.
Функции Geo-Match и Sticky Sender включены по умолчанию при создании нового сервиса обмена сообщениями.
Изменить наш код для отправки через сервис обмена сообщениями вместо конкретного номера телефона на самом деле довольно легко. Вернитесь к `iss.py`
и обновите функцию `notify_subscriber`
:
Вам также нужно будет обновить код в функции `add_to_queue`
, где отправляется уведомление о подписке:
SID вашего сервиса обмена сообщениями также можно найти на панели управления аккаунта:
Как видите, как только у вас настроено несколько номеров телефонов, использование новых функций Twilio Copilot сводится к изменению всего одной строки кода.
**Возвращение на Землю**
Вы только что смогли убедиться, насколько легко внедрять новые функции, поставляемые с Twilio Copilot. Все, что мы сделали — создали сервис обмена сообщениями и изменили одну строку кода для отправки через него, вместо того чтобы реализовывать целую систему самостоятельно. Благодаря Copilot, масштабируя системы доставки SMS, мы можем испытать радость от наличия друга на переднем сиденье с системой навигации.
Теперь любой может зарегистрироваться, чтобы получать уведомления каждый раз, когда МКС пролетает над ним. Один классный хакер из Университета Темпл построил нечто подобное на хакатоне, но в его версии еще были и вечеринки с пиццей.
Не стесняйтесь обращаться, если у вас есть вопросы или если вы хотите похвастаться тем, как вы использовали функции Copilot в вашем приложении Twilio.
— Email: sagnew@twilio.com
— Twitter: @Sagnewshreds
— Github: Sagnew
— Twitch (стриминг кода в реальном времени): Sagnewshreds