Как создать бота для whatsapp на python
Внимание: чтобы бот работал, телефон должен быть всегда подключен к интернету и не должен использоваться для Whatsapp Web. Удобнее всего заводить отдельное устройство для этих целей.
Сборка и тестирование бота
Для тестировани бота вам потребуется библиотека Flask инсталлируйте её с помощью
К сожалению, WebHook не позволяет указывать в качестве сслыки ip, поэтому для тестирования бота вам потребуется эмулировать запросы к WebHook. Для этого можно перейти по ссылке https://app.chat-api.com/testing, перейти во вкладку "Проверка WebHook" и нажать на кнопку "Начать тестирование".
Копируем этот JSON и запускаем наш локальный сервер FLASK с помощью отладчика в редакторе кода или через команду
Чтобы эмулировать запрос к серверу нам необходимо послать POST запрос с JSON, который мы скопировали на предыдущем этапе. Запрос отправляется на ваш localhost адрес, на котором запущен flask. Таким образом можно эмулировать действия WebHook и тестировать функционал бота.
Служит для отправки запросов к API сайта
- method определяет, какой метод chatAPI должен быть вызван.
- data содержит необходимые для пересылки данные.
Служит для ответа на команду "chatId". Отправляет в чат WA id пользователя
Служит для ответа на команду "time". Отправляет в чат WA текущее время сервера.
Служит для ответа на команду "file". Отправляет в чат WA файл, который лежит на сервере по указанному формату
Что представляет из себя data
Что представляет из себя data
Формируем запрос send_requests с параметром “sendAudio” и передаем в него* data*.
Служит для отправки гео-локации в чат WA def geo(self, chatID):
Что представляет из себя data
Формируем запрос send_requests с параметром “sendLocation” и передаем в него* data*.
Служит для создания конференции, состоящей из бота и пользователя
Что представляет из себя data
Формируем запрос send_requests с параметром “group” и передаем в него* data*.
Данная функция будет вызываться каждый раз, когда будем получать данные в наш webhook.
А далее просто разбираем какая команда пришла и вызываем соответствующие функции
Для обработки входящих запросов к нашему серверу используем данную функцию
Расскажем, как написать простого ватсап бота на Python, используя API WhatsApp.
Внимание: чтобы бот работал, телефон должен быть всегда подключен к интернету и не должен использоваться для Whatsapp Web
Подготовительная работа
В самом начале, сразу свяжем whatsapp с нашим скриптом, чтобы по мере написания кода - проверять его работу. Для этого переходим в личный кабинет и получаем там QR-код. Далее открываем WhatsApp на мобильном телефоне, заходим в Настройки -> WhatsApp Web -> Сканируем QR-код.
Пишем инициализацию класса бота
Создадим файл “wabot.py” и в нем опишем класс для нашего бота. Нам потребуется импортировать данные библиотеки:
Библиотека json отвечает за обработку формата Json. Requests – Нужен нам для того, чтобы обращаться к API сайта.
Далее создадим класс WABot
Вам требуется подставить свои данные APIUrl и token, их мы будем использовать для формирования запроса к API.
Пишем функционал бота
Отправка запросов
Для работы нам потребуется отправлять запросы к API. Напишем функцию, которая будет формировать запросы и отправлять их, исходя из наших параметров.
send_requests - принимает два параметра: method и data.
method определяет, какой метод ChatAPI должен быть вызван.
data содержит необходимые для пересылки данные.
Подробнее о всех методах можно почитать в документации. Data – это словарь данных из которых мы сформируем json и передадим методом Post на сервер. (Т.к. для нашего функционала бота требуются лишь Post методы, только ими мы и будем пользоваться)
На данном этапе мы формируем строку запроса к API.
Далее обязательно нужно указать header Contet-Type и пометить его Application/Json, так как мы будем всегда передавать наши данные форматом json.
Теперь формируем полноценный запрос с помощью requests.post и передаем на сервер api наши данные. Json.dump(data) – серриализует наш словарь data в формат json.
Возвращает функции ответ сервера в формате json.
send_message - принимает два параметра: chatId и text.
Далее передаем наши данные в метод, который мы написали в предыдущем этапе
Приветствие
Метод welcome будем вызывать по команде “hi” бота и при вводе несуществующей команды.
noWelcome – Булева переменная, определяющая какой текст будет отправлен в чат: приветствие или список команд. По умолчанию False.
Вывод chatId
Вывод времени
Функция me
Выводит информацию о имени собеседника по команде ‘me’
Функция file
Отправляет файл с указанным форматом в диалог
Здесь мы сформировали словарь, который содержит в качестве ключей необходимые нам форматы, а в качестве значений имена файлов, которые лежат на сервере и ждут отправки:
Далее проверяем существует ли в нашем словаре формат, который передал пользователь
Если существует – то формируем запрос на отправку файла, где:
Filename – имя файла
Caption – текст, который будет отправлен вместе с файлом
Формируем запрос send_requests с параметром “sendFile” и передаем в него наши данные.
Функция ptt
Формируем словарь наших данных, где:
audio – прямая ссылка на файл формата ogg
Отправляем запрос к api методом “sendAudio”
Функция geo
lat – заранее заданные координаты
lng – заранее заданные координаты
address – ваш адрес или любая необходимая вам строка.
После формирования словаря, отправляем запрос к API методом “sendLocation”
Функция group
Создает группу, в которой будете вы и бот
Данное тело содержит в себе информацию о номере пользователя, но с дополнительными символами. Вызовем функцию replace и удалим их, оставив лишь номер телефона:
groupName – имя конференции после её создания
phones – телефоны необходимых участников конференции, можно передавать массив из нескольких телефонов
Отправляем запрос методом ‘group’
Обрабатываем запросы пользователей
Весь функционал нашего демо-бота мы описали, теперь требуется организовать логику работы бота, чтобы он мог реагировать на команды и взаимодействовать с пользователем. Для этого опишем еще одну функцию
Данную функцию будем вызывать каждый раз, когда будем получать данные в наш webhook.
Разберем её по порядку:
Если же данной проверки не будет бот может уйти в бесконечную рекурсию.
После сравнения просто вызываем функционал, который мы описали на предыдущих этапах с параметром id.
Вам необходимо только подставить свой токен из личного кабинета и номер инстанса.
Сервер Flask
Для обработки запросов будем использовать сервер Flask. Создадим файл app.py, импортируем все необходимые библиотеки.
Инициализируем переменную app, которая будет являться классом Flask.
И пропишем для неё путь app.route(‘/’, methods = [‘POST’]). Данный декоратор означает, что наша функция home будет вызываться каждый раз, когда к нашему серверу flask будут обращаться посредством post запроса по главному пути.
Делаем проверку того, что к серверу обратились с помощью метода POST. Создаем экземпляр нашего бота и передаем в него json данные.
requests.json – позволяет получить json файлы из тела запроса, который был передан к нашему серверу.
И теперь просто вызываем у нашего объекта метод bot.processing(), который отвечает за обработку запросов.
Whatsapp бот на Python
Подготовка к написанию бота
Изначально требуется связать Ватсап с имеющимся скриптом, чтобы во время написания кода поверить работу. Последовательность действий включает в себя:
- Переход в личный кабинет разработчика на сервере.
- Выполняется сканирование QR-кода.
- Далее запускается WhatsApp на переносном устройстве.
- Осуществляется переход в раздел внесения настроек.
- Выбирается WhatsApp Web и повторно сканируется QR-код.
Чтобы сервер автоматически начал вызывать скрипт во время новых мессенджеров, требуется указывать WebHook URL.
Инициализация класса бота
Процедура требует создания файла «wabot.py», после чего осуществляется описание класса для разрабатываемого бота. Программист не должен забывать импортировать сведения библиотеки.
Обратите внимание, библиотека json предусматривает обработку одноименного формата. Используется с целью обращения к АРI сайта. В нем выполняется описание класса конструктора, который возьмет на себя прием json с исчерпывающей информацией о входящих мессенджах. Чтобы понимать, какой вид будет у принимающего json , необходимо:
- Перейти в раздел проведения тестирований.
- Инициировать анализ сформированных запросов.
- Протестировать Webhook.
Разработка функционала бота на Python
Разработка функционала для чат бот Whatsapp несложная. При этом нужно знать особенности и соблюдать четкую последовательность действий.
Отправка запросов
С целью эффективного функционирования, формирование запросов к API является неотъемлемой частью. При создании опции, требуется пользоваться значениями:
- send_requests – выполняет прием нескольких значений: method и data;
- method позволяет узнать, какой именно вариант ChatAPI обязателен к вызову;
- data отображает необходимую информацию для отправки.
Обратите внимание, data является словарем, из которого осуществляется формирование json с последующей передачей с помощью Post на сервер. На рассматриваемом этапе требуется соблюдение следующей последовательности действий:
- Создание строки запроса к API.
- После этого указывается header Contet-Type.
- Осуществляется замена Application/Json. Это обусловлено тем, что бот регулярно выполняет передачу персональной информации с соответствующим форматом.
- Далее осуществляется формирование полноценного запроса, используя для этого requests.post.
- Выполняется передача requests.post на используемый сервер api.
Обратите внимание, возвращение опции ответа от сервера в сформированном формате json.
Для создания опции отправки мессенджера, требуется использовать несколько параметров:
- send_message – инициирует принятие нескольких значений;
- chatId – Id чата, в котором в дальнейшем возникает необходимость отправлять мессенджеры;
- text – содержание уведомления.
Дальнейшая последовательность действий включает в себя:
- Создание словаря data, включающее в себя chatid с целью принятия текстовых уведомлений.
- На следующем этапе предстоит перенести информацию в разработанный скрипт, который был разработан ранее.
- На завершающем этапе, чтобы инициировать отправку оповещений в Chat Api, следует применять вариант sendMessage. По этой причине требуется передавать в опции в качестве значения data. НЕ стоит забывать возвращать ответ сервера.
Во время создания скрипта рекомендуется проявлять максимальную ответственность, иначе возрастают риски возникновения ошибок.
Приветствие
Использование функции предусматривает использование команды «hi» бота с последующим вводом несуществующего запроса, в частности:
- chatId – Id чата, куда планируется отправлять уведомление;
- noWelcome – переменная Булева, с помощью которой можно четко определить дальнейшее содержание месседжа в чат.
В завершении предстоит создать строку с уведомлением, отталкиваясь от переменной с последующей передачей опции send_message в качестве содержания месседжа.
Вывод chatId
Чтобы активировать опцию, требуется указать def show_chat_id. Для возврата вводится return self.send_message.
Вывод времени
Рассматриваемая функция создается по четкой последовательности действий, в частности:
def time(self, chatId):
Обратите внимание, внесение изменений не требуется.
Функция me
Особенностью считается вывод сведений от имени конкретного пользователя по сформированной команде. Активируется следующим образом:
def me(self, chatId, name):
return self.send_message(chatId, name)
Команда стандартная, изменению не подлежит.
Функция file
Особенностью опция является отправка файла в утвержденном формате непосредственно в диалог:
В результате формируется словарь, который включает в себя все необходимые ключи в требуемом формате. Дальнейшая последовательность подразумевает поверки на предмет наличия определенного формата, в котором была передана информация собеседником. В случае его наличия формируется заявка на передачу данных:
- chatId – Id чата, в который выполняется передача информации;
- Body – используемый канал передачи оповещения;
- Filename – имя формата;
- Caption – содержание передаваемого уведомления.
Наличие ошибки в команде, влечет невозможность активации функции.
Функция ptt
Формирование голосового уведомления с последующей передачей интересующему собеседнику, осуществляется следующим образом:
- Указание диалога, в котором требуется передать информацию.
- Ввод ссылки на размещенный аудиоформат.
- Формирование запроса к api. При этом используется вариант команды sendAudio.
При желании можно выполнить тестирование.
Функция geo
Отправка данных пользователем с помощью разработанного скрипта выполняется по сформированной команде. Инструкция включает в себя:
- Ввод интересующего диалога, в котором отправляется месседж.
- Ввод указанных координат.
- Отображение персонального адреса по умолчанию.
По завершении формирования словаря, достаточно инициировать запрос к API, используя при этом определенный способ sendLocation.
Функция group
Предусматривает формирование сообщества с личным присутствием и бота. Команда отображает сведения о том, кто именно инициировал отправку месседжа. Рассматриваемое тело отображается информацию относительно номера мобильного телефона пользователя, только с дополнительным содержанием символов. Во время формирования команды, используются следующие сведения:
Для составления и активации запроса, используется одноименная команда функции.
Обработка запросов пользователей
Имеющиеся функциональные возможности разрабатываемого бота были описаны выше. НА завершающем этапе пользователям предстоит обеспечить безошибочную и одновременно стабильную работу интеллекта. Благодаря комплексному подходу появляется шанс организовать четкое взаимодействие с потенциальными клиентами/потребителями. Поэтому требуется активировать дополнительную опцию.
Обратите внимание, функция активируется регулярно при необходимости получить исчерпывающую информацию в webhook. Последовательность действий подразумевает:
- Разработчику требуется вернуться к раннее сформированной команде, включающей в себя словари оповещений, которые были получены в результате общения с собеседниками. Выполнение проверки предоставляет возможность отсеивать сведения, которые не были указаны в уведомлениях. Это обусловлено тем, что в скрипте есть возможность получения запроса от пользователей без месседжей.
- На практике пользователь может получить несколько уведомлений в одном сформированном запросе, поэтому скрипт должен уметь их отличать. Поэтому требуется инициировать перебор словарей, в составе которых может находиться dict_messages.
- После непосредственного вхождения в активированный цикл, требуется объявить переменную «текст». Под ней скрывается исчерпывающий перечень слот, который могут входить в уведомление. Поэтому требуется повторно инициировать обращение к библиотеке, чтобы в полной мере изучить содержание оповещения.
- На следующем этапе выполняется проверка на предмет получения от реальных пользователей, а не спама. Поэтому возникает необходимость воспользоваться функциями false и true.Обратите внимание, при отсутствии проверки есть вероятность выхода не бесконечность с вытекающими негативными последствиями.
- В результате разработчик автоматически получает ссылку на расположение сообщества и непосредственной библиотеки данных. Чтобы избежать ошибочных проверок, достаточно использовать функцию сравнения данных. Обратите внимание, по завершении процедуры проверки, достаточно инициировать вызов опции, которая ранее была рассмотрена с функцией ввода адреса местоположения группы.
Наверняка, Вы уже подумывали о том, как автоматизировать свой WhatsApp ботом, например, для отправка ровно в полночь напоминания о днях рождения друзей или напоминания о своих повседневных задачах.
Вот схема нашего сегодняшнего урока:
Итак, без лишних слов, прямо сейчас погружаемся!
Что нам нужно?
Вам понадобятся следующие компоненты:
- Python 3.6 или новее.
- Смартфон с действующим номером телефона и установленным WhatsApp.
- Аккаунт Twilio. Если вы новичок в Twilio, создайте бесплатную учетную запись сейчас . Вы можете ознакомиться с функциями и ограничениями бесплатной учетной записи Twilio .
В туториале будем использовать следующие пакеты (версии) python:
1. Получение данных и сохранение их в Google Таблицах
Шаг 1. Настройте песочницу Twilio WhatsApp
Для использования Twilio для WhatsApp Twilio предоставляет песочницу WhatsApp , где вы можете легко разработать и протестировать свое приложение. Чтобы подключить смартфон к песочнице, перейдите в консоль Twilio , выберите Programmable SMS и нажмите WhatsApp . На странице песочницы WhatsApp будет показан номер тестовой среды, назначенный вашей учетной записи, и код присоединения.
Затем мы определяем ответ функции.Основная логика приложения для связи с Twilio API для WhatsApp находится внутри этой функции.
После этого, расширим наш предыдущий код до приведенного ниже:
«Да/Нет» в ответ на «Вы хотите установить напоминание?»
- set_reminder_date(msg) . Для сохранения даты напоминания в таблицах Google с помощью пакета Python gspread, который будет объяснен в следующем разделе.
- set_reminder_body(msg) , Для сохранения напоминания в таблицах Google с помощью пакета Python gspread, о котором в следующем разделе.
Чтобы начать работу с пакетом gspread в своем коде Python, установите его с помощью команды pip install gspread . Начнем с создания нового файла gsheet_func.py и добавим наши функции gspread, которые позже будут импортированы в наш app.py. Кроме того, перед использованием таблиц Google в нашем коде нам потребуется аутентифицировать нашу учетную запись. Вы можете аутентифицировать свою учетную запись Google, выполнив следующие действия:
Полный код gsheet_func.py приведен ниже:
В приведенном выше коде начинаем с импорта пакета gspread. Позже используем import ServiceAccountCredentials from oauth2client.service_account в файл python для доступа к ресурсам, защищенным OAuth 2.0. Приведенный ниже код используется для аутентификации и предоставления нам доступа к нашим таблицам Google.
Позднее мы используем функции gspread, чтобы открыть, open() , желаемый лист по имени ( Sheet1 в нашем случае) электронной таблицы Google ( reminders в нашем случае) и получить значения строки и столбца с помощью соответствующих функций. Далее, мы создали две функции save_reminder_date(date) и save_reminder_body(msg) , чтобы сохранить собранные данные в последнюю пустую строку на нашем листе. Эти функции вызываются в нашем файле app.py.
2. Запланируйте напоминания
Создайте пустой каталог и назовите его Scheduler. После чего, в конечном итоге, будем иметь структуру, указанную ниже:
Шаг 1. Создайте вспомогательную функцию Twilio
Создайте файл Python с именем twilio_func.py, чтобы включить вспомогательную функцию Twilio, используя приведенный ниже код. Подробнее об этом коде можно узнать здесь .
Чтобы получить все наши дела утром для лучшего планирования дня, мы установили время на 9:00 утра. Мы можем расширить вариант использования, чтобы получать напоминания в определенное время дня, просто внося небольшие изменения в код. Мы также будем использовать пакет Python datetime для работы с датой и временем. Модуль datetime предоставляет классы для управления датой и временем.
Предупреждение: по умолчанию Heroku ответит на звонки на текущее время по UTC.
Итак, чтобы позже развернуть наше приложение на Heroku и синхронизировать все, мы меняем время с индийского часового пояса («‘Asia/Kolkata») на всемирное координированное время, используя пакет pytz .
Полный код для планировщика, использующего APSchedulerand datetime, приведен ниже:
Согласно нашей логике, объясненной выше, нам нужно получить текущую дату, используя пакет datetime, используя date.today() . Чтобы избежать противоречий, конвертируем дату в определенный формат (« %d/%m/%y »). Позже мы инициализируем переменную utc_dt значениями даты и времени в часовом поясе UTC, используя функции библиотеки pytz. Используем команду scheduler = BlockingScheduler() для настройки планировщика и команду scheduler.start() для его запуска.
3. Развертывание приложения Flask на Heroku
Предостережение: убедитесь, что файл назывался именно «Procfile».
Для папки Scheduler напишите следующую строку кода:
По сути, это было причиной для создания двух папок, поскольку оба наши приложения развернуты на Heroku по-разному.
Итак, теперь мы готовы создать приложения Heroku для обеих наших папок. Следуйте инструкциям ниже.
Заключение
Читайте также: