Автор материала, перевод которого мы сегодня публикуем, говорит, что современные люди, жизнь которых переполнена работой, часто забывают писать сообщения своим родным и близким. Он, глядя на то, как его родители каждое утро шлют ему в WhatsApp вдохновляющие цитаты и полезные советы о здоровье, решил, что пришло время ответить им взаимностью.
В этом руководстве мы напишем простой Python-скрипт, предназначенный для отправки WhatsApp-сообщений. В ходе работы будем пользоваться Python-пакетом Twilio. Для организации ежедневного запуска скрипта в заданное время разместим код в облаке.
Одним из подходов к решению этой задачи является использование Python-пакета Selenium и веб-версии WhatsApp вместо сервиса Twilio, на который, после исчерпания возможностей бесплатного предложения, нужно оформлять платную подписку. Но так как работа с веб-версией WhatsApp требует периодического сканирования QR-кода с помощью мобильного телефона, автоматизировать отправку сообщений при таком подходе не получится.
Работа над проектом будет состоять из трёх шагов:
- Настройка Twilio.
- Изучение и модификация кода.
- Развёртывание проекта в облаке и настройка триггера.
Шаг 1. Настройка Twilio
Создадим бесплатную учётную запись на сайте Twilio, подтвердим адрес электронной почты и номер телефона.
Регистрация учётной записи Twilio
Кроме того, в рамках бесплатного предложения Twilio необходимо использовать WhatsApp-песочницу (WhatsApp Sandbox). Это означает, что вы не сможете пользоваться собственным номером телефона, и то, что вам придётся пройти через процедуру выдачи разрешения на получение WhatsApp-сообщений.
Собственным номером для работы с сообщениями можно пользоваться после того, как WhatsApp разрешит Twilio использовать ваш номер. Для того чтобы получить разрешение, нужно заполнить форму. Из материалов техподдержки Twilio можно узнать о том, что, хотя Twilio и работает напрямую с WhatsApp, на получение разрешения может понадобиться некоторое время. К тому же, там говорится об ограниченных масштабах выдачи разрешений. В результате многим приходится пользоваться WhatsApp-песочницей Twilio.
Всё это особой радости не вызывает, но то, что доступно нам в рамках бесплатного предложения Twilio, позволяет решить нашу задачу. Кроме того, получается, что WhatsApp-песочница — это пока единственный широкодоступный вариант.
Теперь нужно подключить телефон получателя сообщений к песочнице, после чего на этот телефон можно будет отправлять сообщения. Для того чтобы узнать о том, как это сделать, вам нужно перейти в раздел консоли Twilio, который посвящён WhatsApp. В частности, тут предлагается отправить WhatsApp-сообщение с указанным текстом на определённый номер.
Страница консоли Twilio с инструкциями по подключению телефона, на который можно будет отправлять сообщения
Запрос на подключение, отправленный с телефона
Сохраните выданный вам WhatsApp-номер в контактах. Ему можно назначить любое имя. Я, чтобы не усложнять себе жизнь, назвал этот контакт Twilio Sandbox, а потом отправил на него сообщение с телефона отца (это можно видеть на предыдущем рисунке). Эта процедура выполняется лишь один раз.
Теперь нужно перейти в консоль Twilio и получить SID и токен аутентификации для своей учётной записи. Эти данные помогут Twilio узнать вас при программной работе с сервисом.
Шаг 2. Изучение и модификация кода
Загрузите этот GitHub-репозиторий и распакуйте архив.
Содержимое zip-файла
Здесь вы найдёте файл с исходным кодом (whatsapp_messaging.py
) и пакет для развёртывания проекта (aws_lambda_deploy.zip
).
Вот код скрипта:
from twilio.rest import Client
def msg_mom_and_dad(event=None, context=None):
# тут нужно использовать SID и токен аутентификации, которые вы получили на Twilio
twilio_sid = 'AC84c9f1602d7fb6af4eda5b0c39a03b37'
auth_token = '4a2021b28f1aa606d9c6945d3c248ebd'
whatsapp_client = Client(twilio_sid, auth_token)
# в этот словарь можно добавлять контактные сведения тех,
# кому вы хотите отправлять сообщения
contact_directory = {'daddy':'+919624666836'}
for key, value in contact_directory.items():
msg_loved_ones = whatsapp_client.messages.create(
body = 'good morning {} !'.format(key),
from_= 'whatsapp:+14155238886',
to='whatsapp:' + value,
)
print(msg_loved_ones.sid)
Сейчас мы разберём этот код. Вот, для удобства, скриншот с пронумерованными строками.
Код файла whatsapp_messaging.py с пронумерованными строками
- Строка 1. Импорт клиента для работы с REST-API Twilio.
- Строка 3. Создание функции
msg_mom_and_dad
. Эту функцию мы передадим AWS. Она будет вызываться ежедневно в заданное время. - Строки 6-7. Здесь вам нужно заменить существующие в коде
sid
иauth_token
на собственные (об их получении мы говорили в конце предыдущего раздела). - Строка 9. Создание объекта клиента Twilio с использованием учётных данных.
- Строка 13. Создание словаря. В качестве ключа тут используется имя получателя сообщений, в качестве значения — номер его телефона. В этот словарь можно добавить и дополнительные контактные сведения.
- Строка 15. Цикл
for
, в котором осуществляется обход словаря (в нём пока имеется лишь одна запись). Вbody
нужно указать текст сообщения. Я создал простое сообщение с текстом «good morning», за которым следует значение, взятое из ключа текущего элемента словаря. В моём случае это приводит к формированию сообщения «good morning daddy !». Воfrom_
указывается тот WhatsApp-номер, который мы получили ранее. Вto
записывают номер получателя сообщения — тот, с которого ранее отправляли запрос на подключение к WhatsApp-песочнице Twilio. - Строка 23. Тут мы, в целях проверки состояния сообщения, выводим его SID. Мы этими сведениями пользоваться не будем.
Вам, чтобы воспользоваться этим кодом для отправки сообщений, нужно изменить в нём следующее:
twilio_sid
auth_token
contact_directory
from_
body (это необязательно)
После того, как вы внесёте в код изменения, сохраните файл. Затем распакуйте архив aws_lambda_deploy.zip
, замените файл whatsapp_messaging.py
на ваш файл с тем же именем, после чего снова упакуйте всё в .zip-архив. Смысл этих действий сводится к тому, чтобы внести в код ваши учётные данные и сведения о тех, кому вы хотите отправлять сообщения. Всё остальное в пакете, предназначенном для развёртывания на AWS, осталось неизменным. Теперь займёмся работой с AWS.
Шаг 3. Развёртывание проекта на AWS и настройка триггера
Код готов к запуску и к тому, чтобы отправлять WhatsApp-сообщения. Если вы интересуетесь тем, какую роль в проекте играют другие файлы из архива aws_lambda_deploy.zip
, то знайте, что среди этих файлов находятся пакет Twilio и все остальные зависимости проекта. Всё это нам нужно из-за того, что мы планируем использовать функции AWS Lambda в Python-окружении, в котором нет пакета Twilio. А почему бы нам это не исправить, просто выполнив для установки нужного пакета команду pip install twilio
? Дело в том, что тут у нас нет сервера.
Для этого мы используем AWS Lambda — это бессерверная вычислительная среда, в которой можно размещать фрагменты кода, вызов которых, в соответствии с нуждами пользователя, инициируют различные события и триггеры. Наш код планируется запускать всего раз в день, поэтому использование чего-то вроде EC2-сервера на AWS, работающего круглосуточно, окажется пустой тратой вычислительных ресурсов и денег. Наша Lambda-функция будет вызываться ежедневно в определённое время по запросу из триггера, а её выполнение будет занимать совсем немного времени.
Начало создания Lambda-функции
Войдите в свою учётную запись AWS. После этого пройдите по пути Services → Compute → Lambda → Create a function
.
Экран создания Lambda-функции
Дадим функции имя.
В качестве окружения, в котором будет выполняться функция, выберем Python 3.6. Нам не нужно подключаться к другим сервисам AWS. Поэтому нас устроит уровень разрешений, задаваемый вариантом Create a new role with basic Lambda permissions
.
После выполнения настроек достаточно нажать на кнопку Create function
. Теперь мы окажемся на главной панели управления.
Панель управления
Здесь, в разделе Function code
, нужно указать обработчик (Handler
), с помощью которого система сможет запускать наш код. В нашем случае в поле Handler
нужно записать строку whatsapp_messaging. msg_mom_and_dad
, указав имя файла с кодом и функцию, которую мы хотим вызывать.
В поле Function package
нужно загрузить наш .zip-файл, то есть — тот файл, который мы создали на предыдущем шаге.
Теперь код готов к запуску. Проверить — работает ли функция и отправляет ли она сообщения, можно, нажав на кнопку Test
.
Финальным шагом нашей работы станет настройка триггера, который будет вызывать функцию ежедневно в заданное время. Пройдите по пути Add trigger → CloudWatch Events
.
Настройка триггера
Нам нужно создать новое правило (Rule
). Ему необходимо назначить имя (Rule name
). При желании можно добавить к нему описание (Rule description
).
Укажем тип правила (Rule type
) как Schedule expression
.
Время вызова функции задаётся с помощью конструкции cron(30 1 * * ? *)
. Разберём эту конструкцию:
30 1
означает UTC-время 1:30 утра. Это — 7 утра по моему IST-времени.- Следующие два символа,
* *
, служат для указания дня месяца и месяца. - Следующие два символа,
? *
, позволяют указать день недели и год. Эта конструкция означает, что функция будет вызываться ежедневно, без ограничений по годам и месяцам.
Здесь вы можете узнать о том, как настраивать собственные задания cron.
После того, как настройка триггера завершена, проверьте — установлен ли флажок Enable trigger
, включающий триггер. Теперь осталось лишь нажать на кнопку Add
и триггер будет создан.
Сведения о триггере
Сведения о Lambda-функции
На панели управления Lambda-функции можно видеть, что к функции прикреплена сущность CloudWatch Events
, и то, что функция может вызываться по срабатыванию соответствующего триггера.
Итоги
Сообщение, отправленное Python-скриптом
Мы завершили работу над проектом. Теперь можно, в телефоне получателя сообщений, в контактах WhatsApp, поменять имя контакта Twilio Sandbox на собственное (я поменял его на Son). Наша система, кроме того, позволяет общаться с получателем сообщений из панели управления Twilio.
Уважаемые читатели! Используете ли вы Twilio в своих проектах?
Автор: ru_vds