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

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

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



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

Работа над проектом будет состоять из трёх шагов:

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

Шаг 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 в своих проектах?

Источник: https://habr.com/ru/company/ruvds/blog/463933/


Интересные статьи

Интересные статьи

Мы уже как-то рассказывали о странных историях собеседований, в которых прекрасно всё. Но откуда берутся такие собеседования? Может быть из странных вакансий? Мы собрали ...
Данная история состоит из трёх частей, т.к. я выпустил три игры:●     Beasts Battle●     Necromancer Returns●     Magicians Legacy В пр...
Всем доброго времени суток. В этой статье мы разберём подключение TFT дисплея ER-TFT101-1 (10 дюймов, RA8876 драйвер) к плате STM32F429L Discovery по 16-битному параллельному интерфейсу 8080 испо...
Введение В ходе доработки одного проекта возникала необходимость в кэширование часто запрашиваемых данных. Реализация кэширования возможна разными способами, но хотелось реализовать с минималь...
Как летит время! Уже наступил четвертый земной месяц работы на обратной стороне Луны посадочного модуля «Чанъэ-4» и ровера «Юйту-2». Аппараты пережили период крайне низкотемпературной среды в...