В повседневной рутине мы часто забываем о близких. А ведь можно воспользоваться WhatsApp! То, с какой регулярностью родители шлют мне с утра пораньше сообщения — засыпая меня мудрыми цитатами и проявляя заботу о моём здоровье — не давало мне покоя, пока я не придумал, что с этим делать.

В данном руководстве мы напишем простой скрипт Python для отправки сообщений через WhatsApp. Делать мы это будем с помощью пакета Twilio. Чтобы запускать скрипт каждый день в определённое время, поместим наш код в облако AWS (Amazon Web Services).
Теперь можно начинать!
Одно из решений — использовать пакет Selenium на Python и веб-версию WhatsApp, а не Twilio, так как в нем по окончании периода бесплатного использования надо оформлять платную подписку. Однако WhatsApp время от времени запрашивает сканирование QR-кода через мобильное устройство, поэтому автоматизация была бы невозможна.
Сделаем ее в три этапа:
- Начальная установка Twilio
- Интерпретация и изменение кода
- Ставим наш пакет на лямбда-функцию AWS с триггерами
Этап 1: начальная установка Twilio
Создаём бесплатный профиль на Twilio и подтверждаем адрес электронной почты и номер телефона.

Помимо бесплатного периода, в профиле Twilio предусмотрена тестовая среда Twilio Sandbox для WhatsApp, в которой нельзя использовать свой номер: чтобы получать сообщения по WhatsApp, нужно разовое разрешение.
Все проблемы решаются с получением номера — после того как WhatsApp разрешит Twilio использовать ваш номер. Далее надо заполнить форму и немного подождать.
Как получить номер WhatsApp Twilio для использования в рабочей среде?
Все клиенты Twilio могут создавать и тестировать отправку и получение сообщений WhatsApp с помощью тестовой среды WhatsApp Sandbox.
Чтобы использовать свой номер и шаблоны сообщений в Twilio, пример использования должен быть проверен и подтверждён со стороны WhatsApp. Twilio работает с подтверждениями для клиентов напрямую с WhatsApp. На начало 2019 доступность подтверждений ограничена и клиенты продолжают тестирования.
Может кого-то это и смущает, но не нас: наше решение с бесплатным периодом отлично справляется со своей задачей. К тому же сейчас это единственный способ.
Теперь нужно подключить телефон к тестовой среде WhatsApp Sandbox и можно начинать получать сообщения.
Перейдём к бета-версии WhatsApp в разделе обучения консоли.


Сохраним в контактах наш номер WhatsApp. Можно присвоить ему любое имя. Я сохранил его как Twilio Sandbox, затем отправил на него сообщение с телефона отца, как видите выше. Это можно сделать лишь один раз.
Теперь перейдём в консоль Twilio Console, заведём там профиль SSID и получим токен аутентификации — так Twilio сможет идентифицировать нас при выполнении кода.
Этап 2: интерпретация и изменение кода
Загрузите репозиторий GitHub и извлеките его содержимое.

Внутри находится файл с нашим кодом и пакет развёртывания.
whatsapp_messaging.py
aws_lambda_deploy.zip

- Строка 1: импортирует пакет Twilio и использует его клиент
REST
для обращения к API-интерфейсу Twilio. - Строка 3: создаём здесь функцию
msg_mom_and_dad
, которая будет передана в облако AWS для выполнения каждый день в определённое время. - Строки 6–7: подставляем значения
sid
иauth_token
нашего профиля, о которых говорилось на этапе 1. - Строка 9: создаётся объект клиента Twilio с нашими идентификационными данными.
- Строка 13: создаётся словарь на Python с именем
key
и номером телефонаvalue
. Этот словарь можно пополнять, если захочется отправлять сообщения ещё кому-то. - Строка 15: цикл
for
, который запускается для всех пар значенийkey
иvalue
(сейчас у нас всего один). Вbody
вводим наше сообщение. У меня, например, простое «доброе утро», за которым следует значениеkey
. В этом коде получилось «доброе утро, папочка!». Затем прописываем номерfrom
, который мы получили для Twilio WhatsApp, и номерto
, с которого ранее нами было отправлено подтверждение для тестовой среды WhatsApp. - Строка 23: строка для проверки статуса сообщения с помощью идентификатора SID. Но это нам не пригодится.
Здесь надо поменять пять значений:
twilio_sid
auth_token
contact_directory
from_
body
(по желанию)
После изменений всё сохраняем. Далее извлекаем aws_lambda_deploy.zip
и заменяем whatsapp_messaging.py
внутри на только что созданное нами. Затем снова запаковываем. Всего-то нужно было изменить код, подставив наши идентификационные и контактные данные. И теперь у нас готов пакет развёртывания.
Этап 3: ставим наш пакет на лямбда-функцию AWS с триггерами
Итак, код готов к запуску и отправке сообщений через WhatsApp. Хотите узнать, какие ещё файлы есть в нашем пакете развёртывания? Это пакет Twilio и все остальные его зависимости. Они ещё пригодятся, потому что мы будем использовать лямбда-функцию в среде Python, а там нет пакета Twilio. Логичный вопрос: почему бы просто не выполнить pip install twilio
для его установки? Потому что здесь у нас нет сервера.

AWS Lambda — это средство внесерверной обработки данных, где фрагмент кода выполняется на основе разных событий и триггеров AWS в соответствии с пользовательскими запросами. Поэтому привлекать сервер (экземпляр сервера EC2 в AWS), работающий в режиме 24/7, ради нашей малюсенькой задачи было бы пустой тратой вычислительных ресурсов и денег. Ведь здесь наша лямбда-функция будет выполняться каждый день в течение крайне малого промежутка времени в момент активации данного триггера.
Сам по себе сервис лямбда недорогой и даёт миллион запросов в месяц бесплатно.

Войдите на https://aws.amazon.com. Затем нажмите на Services -> Compute -> Lambda -> create a function

Присвоим название нашей функции.
Выбираем предпочтительной средой Python 3.6.
Подключаться к другим сервисам в AWS не собираемся, поэтому остановимся на варианте стандартного разрешения.
Нажимаем на create function (создать функцию) и попадаем в личный кабинет.

В блоке кода функций указываем обработчику лямбда-функции, чего мы от него хотим: выполнять наш файл Python whatsapp_messaging
и функцию msg_mom_and_dad
внутри этого файла каждый раз, когда вызывается лямбда-функция. Поменяем значение обработчика, как показано выше.
В точке входа кода выбираем upload a .zip file (загрузить zip-файл), подгружаем пакет развёртывания, созданный нами на этапе 2, и сохраняем.
Наш код готов к выполнению. Теперь можно проверить, отправляет ли функция сообщение на указанный номер WhatsApp. Нажимаем на test и проверяем.
Наш заключительный шаг — настроить активацию кода на определённое время каждого дня. Для этого нажимаем add trigger -> CloudWatch Events вот в таком окне.

Здесь нам надо создать новое правило. При желании можно дать ему любое имя и описание.
В качестве типа правила установим schedule expression (выражение расписания).
Мы указали время, использовав cron()
. 30 1
означает 1:30 ночи, время в формате UTC (соответствующее моему 7 утра по индийскому стандартному времени).
Следующие два, * *
, используются для обозначения дня и месяца.
Следующие два, ? *
, — для обозначения дня недели и года. Мы устанавливаем *
и ?
для обозначения каждого дня, месяца и года. Для задания собственных параметров cron
можете использовать в качестве примера таблицу ниже. Если захотите изучить во всех подробностях, гид по cron
вам в помощь на aws_cron_docs.

По окончании убедитесь, что в квадратике Enable trigger (активировать триггер) стоит галочка. Теперь нажмите на кнопку Add (добавить).


На панели управления лямбда-функции теперь можно видеть событие CloudWatch Event, присоединённое к нашей лямбда-функции. Пролистав вниз, мы увидим событие CloudWatch, активированное для вызова нашей функции.
Вот и всё! Можете поменять название для тестовой среды Twilio Sandbox на своё собственное и даже реагировать на ответы из панели управления Twilio.

Читайте также:
- Обратные вызовы Keras за 2 минуты
- Распознавание лиц с помощью CoreML и ARKit
- Функциональные и гибкие Shell скрипты
Перевод статьи Kartik Nighania: I Wrote a Script to WhatsApp My Parents Every Morning in Just 20 Lines of Python Code