Бот для whatsapp php — Создание бота Whatsapp на PHP. Полное руководство

Расскажем, как написать простого бота на PHP, используя API WhatsApp.

Демонстрационный бот будет реагировать на команды, поступающие ему в виде обычных сообщений в WhatsApp и отвечать на них. Сейчас в нашем демо чатботе присутствует следующий функционал:

  • Вывод списка команд
  • Вывод ID текущего чата
  • Вывод текущего времени сервера, на котором работает бот.
  • Вывод вашего имени
  • Отправка файлов разных форматов (pdf, jpg, doc, mp3 и т.д.)
  • Отправка заранее записанных голосовых сообщений
  • Отправка гео-координат (локации)
  • Создание конференции (группы)

Внимание: чтобы бот работал, телефон должен быть всегда подключен к интернету и не должен использоваться для Whatsapp Web. Удобнее всего заводить отдельное устройство для этих целей.

Подготовительная работа

Авторизация Whatsapp через QR код

В самом начале, сразу свяжем whatsapp с нашим скриптом, чтобы по мере написания кода — проверять его работу. Для этого переходим в личный кабинет и получаем там QR-код. Далее открываем WhatsApp на мобильном телефоне, заходим в Настройки -> WhatsApp Web -> Сканируем QR-код.

Теперь, чтобы сервер вызывал наш скрипт при новых сообщениях, нужно указать WebHook URL. Укажите там прямую ссылку на ваш скрипт, например, https://domain.com/PHP/whatsappbot.php. Нельзя указать просто IP-адрес сервера. Можно указать порт.

Теперь давайте создадим файл whatsappbot.php и создадим в нем класс: class whatsAppBot { }

Создадим в нем переменные, в которые поместим API Url и токен. Их можно узнать в личном кабинете.

Теперь объявим функцию __construct(), которая будет вызываться автоматически при каждом запуске скрипта. Сервер ChatAPI будет обращаться к боту при поступлении новых сообщений (об этом подробнее ниже), присылая данные о новом сообщении в JSON-формате. Сразу ловим эти данные в начале функции и помещаем в переменные.

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

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

Разбираемся:

  • if(isset($decoded['messages'])) Уведомления типа «пользователь покинул чат» тоже присылаются сервером, но в них будет отсутствовать массив сообщений. Данная проверка предотвращает ошибку «Undefined index».

  • foreach($decoded['messages'] as $message) Сообщения находятся в массиве, и их может прийти несколько сообщений одновременно. Бот должен отреагировать на каждое из них.

  • $text = explode(' ',trim($message['body'])); Разбиваем тело сообщения на отдельные слова. Первое слово — команда, остальные будут параметрами команды.

  • if(!$message['fromMe']) Эта проверка нужна, чтобы бот не ушел в рекурсию. Отметка «fromMe» означает, что сообщение было послано самим ботом. Поэтому выполнение продолжаем только для входящих сообщений.

  • switch(mb_strtolower($text[0],'UTF-8')) Блок switch, который определяет, что за команда содержится в первом слове. Команду приводим в строчной регистр, чтобы бот реагировал на нее независимо от того, капсом она написана, с заглавной буквы или зАбОрЧиКоМ.

  • case 'hi': {$this->welcome($message['chatId'],false)} Собственно, выполнение соответствующей команды в зависимости от первого слова. В вызываемую функцию передаем chatId из сообщения, чтобы отправка происходила в соответствующий чат. В принципе, все следующие строки одинаковые, но обратите внимание на:

    case 'file': {$this->file($message['chatId'],$text[1])} Здесь мы передаем еще один параметр, а именно второе слово сообщения, т.к. оно является параметром команды. Об этом ниже. Также обратите внимание на:

    case 'me': {$this->me($message['chatId'],$message['senderName'])} Здесь в качестве второго параметра стоит имя собеседника, взятое также из данных сообщения. А в default мы вызываем функцию, выводящую список команд, но с параметром true, что означает получение неправильной команды.

Мы закончили писать функцию __construct(). Теперь перейдем к функциям, вызываемым по командам из вышеупомянутого блока switch. В части функций вызывается функция sendMessage(), в другой части — sendRequest(). В скрипте эти функции помещены внизу, но расскажем о них сразу:

Функция sendRequest() осуществляет непосредственно запрос на сервер ChatAPI для отправки сообщений и различного медиа. Она принимает 2 параметра — $method и $data.

  • $method определяет, какой метод chatAPI должен быть вызван.
  • $data содержит необходимые для пересылки данные.

Разберем подробнее: В $url мы формируем корректный URL-адрес, содержащий APIUrl, метод и токен. Затем проверяем входящие данные. Если это массив, преобразовываем его в JSON. Если нет — значит преобразование в JSON было уже осуществлено в вызвавшей функции. $options — задаем HTTP-заголовки. Затем через file_get_contents выполняем запрос на сформированный URL, передавая данные. Последняя строка необязательна, она просто записывает ответ сервера ChatAPI в файл для отладки и логгирования.

Функция sendMessage() — по сути просто оболочка отправки простых текстовых сообщений. Она формирует корректный массив данных и передает его в вышеупомянутую функцию sendRequest() с методом «message».

Теперь создадим управляющие функции из блока switch. Функции, посылающие простое текстовое сообщение, в большинстве своем просто вызывают sendMessage() с определенным текстом. Функции, посылающие различное медиа, формируют свои массивы данных и вызывают sendRequest() с другими методами.

Функция welcome() — вывод списка доступных команд

Если параметр $noWelcome равен false, то первая строка сообщения будет приветствием, отображаемым по команде «hi». Если true — приветствие будет заменено на сообщение неверной команде.

Функция showChatId() — вывод ID текущего чата по команде «chatid».

Функция time() — вывод текущего времени сервера по команде «time».

Функция me() — вывод имени собеседника по команде «me».

Функция file() — отправка файла по команде «file». Эта функция наиболее интересна, т.к. работает с параметром. В качестве параметра передается формат файла, который нужно отправить.

Разберем подробнее:

  • $availableFiles — это массив, в котором ключами выступают параметры функции, а значениями — имена файлов. Естественно, файлы с именами из массива должны присутствовать на сервере. В данном примере они лежат там же, где и скрипт бота, но вы можете поместить их в другую папку.
  • if(isset($availableFiles[$format])) — проверяем существование ключа массива с полученным параметром. Если он существует, то мы формируем массив данных, и передаем его в sendRequest() с методом «sendFile». В массиве данных должны быть следующие данные:
  • chatId — как обычно, ИД чата, в который посылается ответ.
  • body — прямая ссылка на файл на вашем сервере. Обратите внимание, что на сервере должен быть включен SSL!
  • filename — имя файла, можно указать любое
  • caption — сопровождающее этот файл сообщение.

Функция ptt() — отправка голосового сообщения по команде «ptt». Голосовое сообщение должно быть файлом формата .OGG на вашем сервере.

Здесь, как и в предыдущей функции, формируем массив данных: chatId — ID чата audio — прямая ссылка на файл .ogg, опять же обязателен SSL И передаем его функции sendRequest с методом «sendAudio».

Функция geo() — отправка гео-координат по команде «geo»

Все то же самое, что и в предыдущих двух функциях. Массив должен содержать следующие данные: lat и lng — координаты; address — адрес, но можно написать любую строку; chatId — само собой разумеещееся.

Функция group() — создать конференцию, в которой будете вы и бот, по команде «group».

Здесь нам требуется указать номера телефонов пользователей, которые будут добавлены в конференцию. В первой строке извлечем номер телефона пользователя из его личного ID, который имеет вид [email protected] Затем формируем массив:

  • groupName — название конференции;
  • phones — массив номеров телефонов;
  • messageText — текст первого сообщения в группе;
Подготовили мануал о том, как написать простого whatsapp бота на php

Обратите внимание, что это единственная функция, где НЕ НАДО передавать chatId. И передаем массив в sendRequest().

Теперь, когда мы закончили работать с функциями, после закрывающей класс скобки напишите строчку: new whatsAppBot();

Чтобы класс вызвался автоматически при обращении к скрипту.

Итоговый код будет выглядеть следующим образом

Вам необходимо будет только подставить свой токен из личного кабинета в переменную $token и номер инстанса Получить ключ API

Поделиться:
Нет комментариев

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

Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.