https://habr.com/ru/company/ruvds/blog/463933/- Блог компании RUVDS.com
 - Разработка веб-сайтов
 - Системы обмена сообщениями
 - Python
 
Автор материала, перевод которого мы сегодня публикуем, говорит, что современные люди, жизнь которых переполнена работой, часто забывают писать сообщения своим родным и близким. Он, глядя на то, как его родители каждое утро шлют ему в 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 в своих проектах?
