Бот для whatsapp php — Создание бота Whatsapp на PHP. Полное руководство
Расскажем, как написать простого бота на PHP, используя API WhatsApp.
Демонстрационный бот будет реагировать на команды, поступающие ему в виде обычных сообщений в WhatsApp и отвечать на них. Сейчас в нашем демо чатботе присутствует следующий функционал:
- Вывод списка команд
- Вывод ID текущего чата
- Вывод текущего времени сервера, на котором работает бот.
- Вывод вашего имени
- Отправка файлов разных форматов (pdf, jpg, doc, mp3 и т.д.)
- Отправка заранее записанных голосовых сообщений
- Отправка гео-координат (локации)
- Создание конференции (группы)
Внимание: чтобы бот работал, телефон должен быть всегда подключен к интернету и не должен использоваться для Whatsapp Web. Удобнее всего заводить отдельное устройство для этих целей.
Подготовительная работа

В самом начале, сразу свяжем 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 — текст первого сообщения в группе;

Обратите внимание, что это единственная функция, где НЕ НАДО передавать chatId. И передаем массив в sendRequest().
Теперь, когда мы закончили работать с функциями, после закрывающей класс скобки напишите строчку: new whatsAppBot();
Чтобы класс вызвался автоматически при обращении к скрипту.
Итоговый код будет выглядеть следующим образом
Вам необходимо будет только подставить свой токен из личного кабинета в переменную $token и номер инстанса Получить ключ API