«Ты совсем о нас не вспоминаешь» или 20 строчек на Python, чтобы порадовать родителей

В рабочие будни мы часто бываем так замотаны, что забываем написать нашим близким. Глядя на то, как часто мои родители первым делом с утра отправляют мне сообщения с вдохновляющими цитатами и рекомендациями касательно здоровья, я понял, что пришло время ответить на это взаимностью.

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

Итак, перейдем к делу!

Мы разделим нашу задачу на три этапа:

  • Начальная настройка Twilio
  •  Разбор кода и его изменение
  •  Загрузка скрипта на AWS
Специализация Full-stack веб-разработчик на Python
Идет набор в группу 5 900₽ в месяц

Шаг 1: Начальная настройка Twilio

Twilio – это API для коммуникаций с помощью SMS, голосовых и видеосообщений.

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

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

Однако эти проблемы можно решить получив одобрение от WhatsApp на использование вашего собственного номера телефона в Twilio. Для этого понадобится заполнить форму запроса и набраться терпения – это может занять некоторое время.

Это может несколько обескуражить, но в итоге даже при использовании бесплатной версии наше решение отлично справится со своей задачей. Кроме того, на данный момент это единственный возможный способ добиться желаемого.

Теперь нам нужно подключить телефон получателя к WhatsApp Sandbox, чтобы он или она смогли получать сообщения от нашего скрипта.

Для этого перейдите на страницу, посвященную бета-версии Twillio Sandbox для WhatsApp.

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

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

Анализ Данных: курс-тренажер по SQL
Идет набор в группу 1 600₽ в месяц

Шаг 2: Разбор кода и его изменение

Загрузите репозиторий с GitHub и распакуйте его.

Внутри zip-файла

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

  • whatsapp_messaging.py
  • aws_lambda_deploy.zip

Текст файла whatsapp_messaging

Разберем построчно весь код.

Строка 1: импортируем пакет Twilio и используем его REST-клиент для взаимодействия с Twilio API.

Строка 3: создаем функцию msg_mom_and_dad, которая будет запускаться AWS каждый день в определенное время.

Строки 6–7: указываем sid и auth_token вашей учетной записи, получение которых описано в первом шаге.

Строка 9: создаем клиент Twilio с нашими учетными данными.

Строка 13: создаем словарь Python с именем в качестве ключа и номером мобильного телефона в качестве значения. Вы можете добавить в этот словарь и другие номера, чтобы отправлять сообщения большему количеству людей.

Строки 15-21: запускаем цикл, который проходит через каждую пару из ключа и значения (сейчас у нас есть только одна). В body укажите сообщение, которое вы хотите отправить. Я остановился на простом варианте: сначала идет текст “доброе утро”, а после этого значение ключа. Так что в моем случае мы получим сообщение «доброе утро, папочка!». Затем мы указываем номер отправителя, который ранее вы получили от Twilio, и номер получателя, который вы подключили сообщением к Twillio Sandbox.

Строка 23: эта строчка проверяет статус сообщения через вывод SID. Но нам это не понадобится.

Итого, вам нужно будет сделать замену в пяти местах: 

  • twilio_sid
  • auth_token
  • contact_directory
  • from_
  • body (optional)

После того, как вы замените все, что нужно, сохраните файл. Теперь разархивируйте aws_lambda_deploy.zip и замените whatsapp_messaging.py внутри на вашу новую версию. Заархивируйте папку обратно, нам нужно было только поменять в коде учетные данные и контакты. Теперь у вас готов пакет для деплоя.


Шаг 3: Загрузка скрипта на AWS

Наш код готов к запуску и отправке сообщений. Если вам любопытно что из себя представляют остальные файлы в папке, то это пакет Twilio и файлы, необходимые для его работы. Они нам нужны потому что мы будем использовать сервис безсерверных вычислений AWS Lambda, на котором не предустановлен Twilio. Почему мы просто не используем команду “pip install twilio” для установки? Дело в том, что у нас нет сервера для этого.

AWS Lambda — это сервис, куда вы можете поместить фрагмент кода, который вы хотите запускать только на время, определенное различными триггерами, в соответствии с вашими потребностями. Для нашей маленькой задачки запуск реального сервера, который будет работать 24/7 — это бесполезная трата вычислительных ресурсов и денег. При использовании AWS Lambda наш код будет работать только в течение очень короткого времени каждый день в зависимости от указанного временного триггера.

Сервис Lambda очень доступен и разрешает делать бесплатно до миллиона запросов в месяц.

Залогиньтесь на https://aws.amazon.com. Затем выберите Services -> Compute -> Lambda -> Create a function.

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

Теперь нажмите на кнопку “create function” и вы попадете на главную панель инструментов.

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

Кликните на  “upload” и загрузите пакет для деплоя, который вы создали.

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

Наш последний шаг — это сделать так, чтобы скрипт запускался каждый день в определенное время. Для этого нажмите add trigger -> CloudWatch Events.

Нам нужно создать новое правило. Дайте ему имя и описание, удобное для вас, и укажите “schedule expression” в качестве типа правила.

Указанное время “cron(). 30 1” соответствует 1:30 по UTC (и моим 7 утра по IST). Следующие две звездочки соответствуют дню и месяцу.  Последние два символа — вопросительный знак и звездочка, — означают день недели и год. Я использую * и ? для того, чтобы выбрать каждый день, месяц и год. Вы можете создать свои настройки на основе моих и примеров указанных ниже или воспользоваться гайдом на aws_cron_docs, чтобы изучить все возможные параметры.

После того, как вы закончите изменять параметры, удостоверьтесь, что около Enable trigger стоит галочка. Ну и, наконец, нажмите кнопку, чтобы добавить ваш новый триггер.

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

Вот и все! Вам осталось поменять имя с Twilio Sandbox на свое и приступить к использованию. Теперь вы сможете вести всю переписку через Twillio: на панели управления вы увидите сообщения, которые отправили в ответ на “Доброе утро”, и сможете отреагировать на них там же.

Оригинал: I Wrote a Script to WhatsApp My Parents Every Morning in Just 20 Lines of Python Code

Перевод: Ухарова Елена

Поделиться:
Опубликовано в рубрике Python, Переводные материалыTagged ,

SkillFactory.Рассылка