Хабрахабр

[Перевод] Python-скрипт на 20 строк, который каждый день желает родителям доброго утра через WhatsApp

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

В ходе работы будем пользоваться Python-пакетом Twilio. В этом руководстве мы напишем простой Python-скрипт, предназначенный для отправки WhatsApp-сообщений. Для организации ежедневного запуска скрипта в заданное время разместим код в облаке.

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

  1. Настройка Twilio.
  2. Изучение и модификация кода.
  3. Развёртывание проекта в облаке и настройка триггера.

Шаг 1. Настройка Twilio

Создадим бесплатную учётную запись на сайте Twilio, подтвердим адрес электронной почты и номер телефона.

Регистрация учётной записи Twilio

Это означает, что вы не сможете пользоваться собственным номером телефона, и то, что вам придётся пройти через процедуру выдачи разрешения на получение WhatsApp-сообщений. Кроме того, в рамках бесплатного предложения Twilio необходимо использовать WhatsApp-песочницу (WhatsApp Sandbox).

Для того чтобы получить разрешение, нужно заполнить форму. Собственным номером для работы с сообщениями можно пользоваться после того, как WhatsApp разрешит Twilio использовать ваш номер. К тому же, там говорится об ограниченных масштабах выдачи разрешений. Из материалов техподдержки Twilio можно узнать о том, что, хотя Twilio и работает напрямую с WhatsApp, на получение разрешения может понадобиться некоторое время. В результате многим приходится пользоваться WhatsApp-песочницей Twilio.

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

Для того чтобы узнать о том, как это сделать, вам нужно перейти в раздел консоли Twilio, который посвящён WhatsApp. Теперь нужно подключить телефон получателя сообщений к песочнице, после чего на этот телефон можно будет отправлять сообщения. В частности, тут предлагается отправить WhatsApp-сообщение с указанным текстом на определённый номер. 

Страница консоли Twilio с инструкциями по подключению телефона, на который можно будет отправлять сообщения

Запрос на подключение, отправленный с телефона

Ему можно назначить любое имя. Сохраните выданный вам WhatsApp-номер в контактах. Эта процедура выполняется лишь один раз. Я, чтобы не усложнять себе жизнь, назвал этот контакт Twilio Sandbox, а потом отправил на него сообщение с телефона отца (это можно видеть на предыдущем рисунке).

Эти данные помогут Twilio узнать вас при программной работе с сервисом. Теперь нужно перейти в консоль Twilio и получить SID и токен аутентификации для своей учётной записи.

Шаг 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 = 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? Дело в том, что тут у нас нет сервера.

Наш код планируется запускать всего раз в день, поэтому использование чего-то вроде EC2-сервера на AWS, работающего круглосуточно, окажется пустой тратой вычислительных ресурсов и денег. Для этого мы используем AWS Lambda — это бессерверная вычислительная среда, в которой можно размещать фрагменты кода, вызов которых, в соответствии с нуждами пользователя, инициируют различные события и триггеры. Наша Lambda-функция будет вызываться ежедневно в определённое время по запросу из триггера, а её выполнение будет занимать совсем немного времени.

Начало создания Lambda-функции

После этого пройдите по пути Services → Compute → Lambda → Create a function. Войдите в свою учётную запись AWS.

Экран создания Lambda-функции

Дадим функции имя.

6. В качестве окружения, в котором будет выполняться функция, выберем Python 3. Поэтому нас устроит уровень разрешений, задаваемый вариантом Create a new role with basic Lambda permissions. Нам не нужно подключаться к другим сервисам AWS.

Теперь мы окажемся на главной панели управления. После выполнения настроек достаточно нажать на кнопку Create function.

Панель управления

В нашем случае в поле Handler нужно записать строку whatsapp_messaging. Здесь, в разделе Function code, нужно указать обработчик (Handler), с помощью которого система сможет запускать наш код. msg_mom_and_dad, указав имя файла с кодом и функцию, которую мы хотим вызывать.

В поле Function package нужно загрузить наш .zip-файл, то есть — тот файл, который мы создали на предыдущем шаге.

Проверить — работает ли функция и отправляет ли она сообщения, можно, нажав на кнопку Test. Теперь код готов к запуску.

Пройдите по пути Add trigger → CloudWatch Events. Финальным шагом нашей работы станет настройка триггера, который будет вызывать функцию ежедневно в заданное время.

Настройка триггера

Ему необходимо назначить имя (Rule name). Нам нужно создать новое правило (Rule). При желании можно добавить к нему описание (Rule description).

Укажем тип правила (Rule type) как Schedule expression.

*). Время вызова функции задаётся с помощью конструкции cron(30 1 * * ? Разберём эту конструкцию:

  • 30 1 означает UTC-время 1:30 утра. Это — 7 утра по моему IST-времени.
  • Следующие два символа, * *, служат для указания дня месяца и месяца.
  • Следующие два символа, ? *, позволяют указать день недели и год. Эта конструкция означает, что функция будет вызываться ежедневно, без ограничений по годам и месяцам.

Здесь вы можете узнать о том, как настраивать собственные задания cron.

Теперь осталось лишь нажать на кнопку Add и триггер будет создан. После того, как настройка триггера завершена, проверьте — установлен ли флажок Enable trigger, включающий триггер.

Сведения о триггере

Сведения о Lambda-функции

На панели управления Lambda-функции можно видеть, что к функции прикреплена сущность CloudWatch Events, и то, что функция может вызываться по срабатыванию соответствующего триггера.

Итоги

Сообщение, отправленное Python-скриптом

Теперь можно, в телефоне получателя сообщений, в контактах WhatsApp, поменять имя контакта Twilio Sandbox на собственное (я поменял его на Son). Мы завершили работу над проектом. Наша система, кроме того, позволяет общаться с получателем сообщений из панели управления Twilio.

Уважаемые читатели! Используете ли вы Twilio в своих проектах?

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть