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

В данном руководстве мы напишем простой скрипт Python для отправки сообщений через WhatsApp. Делать мы это будем с помощью пакета Twilio. Чтобы запускать скрипт каждый день в определённое время, поместим наш код в облако AWS (Amazon Web Services).

Теперь можно начинать!

Одно из решений — использовать пакет Selenium на Python и веб-версию WhatsApp, а не Twilio, так как в нем по окончании периода бесплатного использования надо оформлять платную подписку. Однако WhatsApp время от времени запрашивает сканирование QR-кода через мобильное устройство, поэтому автоматизация была бы невозможна.

Сделаем ее в три этапа:

Этап 1: начальная установка Twilio

Twilio — Communication APIs for SMS, Voice, Video and Authentication
Twilio was made for creators like you. We build our APIs to be simple to use, powerful in production, and endlessly…www.twilio.com

Создаём бесплатный профиль на 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 и извлеките его содержимое.

содержимое zip-архива

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

  • whatsapp_messaging.py
  • aws_lambda_deploy.zip
whatsapp_файл с кодом для передачи сообщений
  • Строка 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.

Читайте также:


Перевод статьи Kartik Nighania: I Wrote a Script to WhatsApp My Parents Every Morning in Just 20 Lines of Python Code

Предыдущая статьяКак создать библиотеку компонентов для совместного использования
Следующая статья30 полезных сниппетов на Python, которые можно освоить за 30 секунд