WhatsApp бот на Raspberry Pi для проекта автоматизации дома


В настоящее время WhatsApp является одним из самых популярных кросс-платформенных мессенджеров, используемых человечеством. По самым скромным оценкам его используют более 2 миллиардов людей во всем мире. Такая широкая популярность этого приложения приковывает к нему и повышенное внимание со стороны бизнеса. Но бизнес версия этого приложения под названием “WhatsApp Business” недостаточно хорошо подходит для автоматизации большого числа различных процессов. К примеру, для этих целей гораздо лучше подходит бот от Telegram. Ранее на нашем сайте мы уже рассматривали взаимодействие платы Raspberry Pi с ботом Telegram и управляли контактами платы с его помощью.

Внешний вид WhatsApp бота на Raspberry Pi для проекта автоматизации дома

В данной статье мы рассмотрим создание WhatsApp бота на Raspberry Pi с использованием пакета pyautogui, написанного на Python. Мы будем запускать WhatsApp web на нашей плате Raspberry Pi, с помощью которого мы будем читать сообщения из нашего чата и давать соответствующие ответы на эти сообщения. В демонстрационных целях мы запрограммировали плату Raspberry Pi на управление светодиодом из данного чата. Но при небольшой доработке (добавив реле и цепи управления) вы можете использовать данный проект для управления любыми домашними электронными устройствами в своем доме.

Также на нашем сайте вы можете посмотреть ставшим весьма популярным проект автоматизации дома на Raspberry Pi с управлением с веб-страницы и все рассмотренные нами проекты автоматизации дома.

Использование WhatsApp на Raspberry Pi

Ранее на нашем сайте мы уже рассматривали использование WhatsApp на Raspberry Pi с помощью библиотеки Yowsup. Но этот метод имеет много ограничений и страдает от различных багов. Поэтому в данной статье мы рассмотрим другой способ использования WhatsApp на Raspberry Pi.

Почему мы не будем использовать WhatsApp Business API

Я думаю, многие знают о том, что у WhatsApp есть свое собственное API для использования в различных бизнес процессах. С помощью данного API и языка python можно автоматизировать обработку сообщений WhatsApp. Примерами подобных приложений являются OYO, MakeMyTrip и т.д. Но использование этого API для такого маленького процесса как автоматизация дома, является дорогим удовольствием (лицензия на него стоит достаточно дорого).

Чтобы обойти данное ограничение мы в данном проекте будем использовать небольшой лайфхак чтобы получить доступ к содержимому WhatsApp – это позволит нам бесплатно читать и отвечать на сообщения. Для этого нам понадобится всего лишь плата Raspberry Pi и соединение с интернетом.

Selenium или pyautogui – что лучше для автоматизации WhatsApp на Raspberry Pi

Теперь, когда мы выбрали низкобюджетный способ автоматизации WhatsApp, нам необходимо решить какой инструмент лучше использовать – selenium или Pyautogui.

Selenium представляет собой инструмент для автоматизации браузера, который изначально создавался для тестирования веб-приложений. Но его также можно использовать для автоматизации практически любых процессов в сети интернет, например, чтения и постинга сообщений в социальной сети Facebook. В общем, с помощью selenium можно автоматизировать практически все, что можно делать с помощью браузера.

Альтернативой selenium для автоматизации WhatsApp являются pyautoGUI и OpenCV. Этот пакет помогает нам читать содержимое экрана и производить навигацию по экрану чтобы выполнить любое необходимое нам действие. То есть большинство вещей, которые мы можем делать на Raspberry Pi с помощью мышки и клавиатуры, можно делать с помощью пакетов pyautogui и paperclip. Далее мы более детально рассмотрим как это можно сделать.

Автор проекта (ссылка на оригинал приведена в конце статьи) тестировал возможности pyautogui и selenium для задач, решаемых в проекте, и пришел к выводу что selenium достаточно сложно использовать на Raspberry Pi из-за его веб-драйвера. Поэтому он решил использовать pyautogui. Но вы можете попробовать использовать и selenium, если хотите.

Установка пакетов на Raspberry Pi для автоматизации WhatsApp

Прежде чем идти дальше, нам необходимо установить ряд пакетов на плату Raspberry Pi. Как было указано раньше, нам будет необходима библиотека OpenCV. Вы можете установить ее с помощью Cmake или с помощью установщика pip. Автор проекта рекомендует использовать pip поскольку это намного проще и быстрее.
В данном случае для простой установки OpenCV для Python 3 на Raspberry Pi выполните следующую последовательность команд:

Далее нам необходимо установить пакеты Pyperclip и pyautogui для автоматизации наших WhatsApp сообщений. Pyautogui используется для чтения элементов на экране и для создания событий клавиатуры и мыши, а pyperclip используется для копирования и вставки информации между экраном и программой на python.

Схема проекта

Схема автоматизации дома с помощью Raspberry Pi и WhatsApp представлена на следующем рисунке.

Схема автоматизации дома с помощью Raspberry Pi и WhatsApp

Как видите, схема проекта очень проста. Нам необходимо всего лишь подключить светодиод к контакту GPIO 40 платы Raspberry Pi. Когда пользователь будет передавать WhatsApp сообщение “turn on the light” (включить свет) плата Raspberry Pi будет включать этот светодиод, а когда плата будет получать сообщение на выключение этого светодиода, она будет выключать его.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Все необходимые коды на Python для данного проекта можно скачать по следующей ссылке – Raspberry pi WhatsApp Automation Python code files.

Внутри этого скачанного каталога вы найдете код основной программы проекта на Python и пять изображений. Эти изображения будут помогать нам идентифицировать различные части (элементы) на странице WhatsApp. Убедитесь в том, что вы запускаете программу на Python на исполнение в том же самом каталоге, в котором находятся данные изображения. Также, если вы будете добавлять в этот каталог другие изображения, убедитесь в том, что они в формате .JPG, потому что плата Raspberry Pi не очень хорошо работает с другими форматами изображений.

Первым делом нам в программе необходимо подключить (импортировать) используемые библиотеки. Назначение части из них уже было рассмотрено раньше в статье. Библиотека time будет использоваться для организации временных задержек в программе, а библиотека webbrowser будет использоваться для автоматического открытия веб-браузера и запуска WhatsApp.

Далее сконфигурируем используемые контакты и откроем WhatsApp браузер. Контакт GPIO 40 будет использоваться для управления светодиодом, поэтому мы сконфигурируем его в качестве цифрового выхода. Также мы запустим веб-браузер, которым по умолчанию в Raspberry Pi является Chromium. Далее мы откроем web.whatsapp.com – с его помощью мы и будем производить нашу автоматизацию WhatsApp. Убедитесь в том, что в сервисе web.whatsapp.com вы уже сканировали QR код и поставили в нем галочку “always login”.

Затем мы подготовим шаблоны сообщений, которые мы будем передавать пользователю в чат в качестве ответов. Вы можете создать такое количество этих сообщений, какое захотите. В шаблонах этих сообщений можно использовать форматирование текста, например, *bold* будет обозначать выделение жирным шрифтом, также можно использовать смайлики с помощью команды :smiley.

Далее мы будем производить проверку успешного открытия WhatsApp в веб-браузере. Представленная ниже функция будет проверять успешно ли открылась страница чата WhatsApp в веб-браузере. Она будет использовать картинку под названием whatsapp_header.jpg (находится в скачанном вами ранее каталоге) чтобы проверить что это действительно так. Мы будем переходить к дальнейшему исполнению программы только если эта страница открылась успешно.

В коде этой функции мы будем производить поиск изображения “whatsapp_header.jpg” на нашем экране. Если мы найдем это сообщение на экране мы можем подтвердить что страница открылась успешно.

Проверка успешного открытия WhatsApp в веб-браузере

После этого мы будем производить проверку доступности чата. Аналогично, в этой функции мы будем искать на экране изображение “green_circle.jpg”. Если это изображение найдено на экране, мы будем перемещаться к этому зеленому кругу и производить клик на нем. Если пользователь использует чат в первый раз нам необходимо будет нажать на кнопку "ok" перед тем как продолжить, в ином случае мы можем просто продолжить.

Эта функция будет возвращать 1 если новый чат доступен и будет возвращать 0 если он не доступен. Она будет также открывать чат и быть готовым к чтению или передаче сообщений.

Проверка доступности чата

Далее мы будем читать последнее сообщение, переданное пользователем. Данная функция будет считывать последнее сообщение при помощи поиска изображения “smily_paperclip.jpg” на экране. После этого она будет перемещаться в текстовое поле с помощью функции py.mpveTo(). Обратите внимание на то, что значения 50 и 35 жестко запрограммированы внутри этой функции. Возможно, вам их придется немного изменить для более корректной работы программы.

Затем мы будем читать последнее сообщение при помощи тройного клика (triple-clicking) на белом прямоугольнике – при помощи этого мы будем выделять все сообщение, затем мы можем копировать все сообщение при помощи ctrl+C и затем использовать pyperclip чтобы получить это значение (прочитать это сообщение). Как вы можете видеть, представленная функция возвращает скопированную информацию при помощи pyperclip.paste().

Считывание последнего сообщения, переданного пользователем

Затем нам необходимо сформировать правильный ответ на последнее принятое сообщение. И следующая функция используется для поиска соответствующего ответа на последнее сообщение, переданное пользователем. Данная функция сравнивает это сообщение с заранее определенными ответами, которые мы ожидаем увидеть. В нашем случае мы ожидаем увидеть сообщения “CD_bot”, “turn on light” или “turn off light”. Если пользователь передал одно из этих сообщений, мы будем отвечать ему заранее подготовленным текстом. Также мы будем включать/выключать светодиод в зависимости от принятой команды.

Теперь, когда мы знаем последнее сообщение, переданное пользователем, и подготовили сообщение для ответа, нам необходимо всего лишь передать этот ответ пользователю. Для этого мы запрограммируем функцию send_message(). В качестве параметра в эту функцию будет передаваться сообщение для ответа, а она будет передавать его в окно чата с помощью метода typewrite, доступного в pyautogui. Затем мы будем использовать shift+enter чтобы перейти на новую строку и затем нажимать enter чтобы передать сообщение.

Передача ответного сообщения пользователю

Затем мы будем проверять появилось ли новое сообщение в текущем чате. Для того чтобы проверить открыт чат или нет, мы использовали поиск изображения green_circle. Если же пользователь в текущем открытом чате передает новое сообщение нам необходимо обнаружить его при помощи проверки цвета пиксела под курсором. Принятые сообщения WhatsApp всегда отображаются на белом фоне. Поэтому мы будем проверять цвет пиксела под курсором – если он белый, мы будем продолжать чтение этого сообщения как рассматривалось ранее.

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

Теперь, основываясь на материалах данной статьи, вы можете создать проект, в котором вы сможете управлять любым домашним электронным устройством или, к примеру, измерять температуру и влажность в комнате и передавать эту информацию в чат WhatsApp. Также замечательной частью описанного проекта является то, что вы можете расшарить (предоставить доступ) этого бота для своих знакомых и они тоже будут иметь к нему доступ. В этом случае им необходимо будет знать имя этого бота – в нашем случае это “CD_bot”. Также вы можете добавить этого бота в группу WhatsApp и тогда все, кто состоит в этой группе, смогут давать команды боту и получать от него на них ответы.

Тестирование работы нашего WhatsApp бота

Более подробно работу этого проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы на Python

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
721 просмотров

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

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