Download the PHP package grayhoax/phpmaxbot without Composer
On this page you can find all versions of the php package grayhoax/phpmaxbot. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package phpmaxbot
PHPMaxBot

PHP библиотека для создания ботов в мессенджере MAX. Поддерживает полное API MAX messenger и предоставляет удобный интерфейс для разработки ботов.
Особенности
- Простой и интуитивно понятный API
- Поддержка webhook и long polling режимов
- Полная поддержка MAX Bot API
- Встроенные помощники для создания клавиатур и кнопок
- Обработка команд, событий, callback-действий и входящих вложений
- Поддержка регулярных выражений для обработчиков
- Обработка исключений и ошибок API
- PSR-4 автозагрузка
⚠️ Важно: требования к webhook и режиму работы
С 25 мая 2026 года MAX прекращает поддержку приёма вебхуков по HTTP и самоподписных сертификатов. Все продакшн-боты должны принимать обновления по HTTPS с сертификатом от доверенного центра сертификации (Let's Encrypt, коммерческие CA и т.д.). Подписки с HTTP-URL или невалидным сертификатом перестанут работать.
Чтобы переключиться на новый URL или обновить подписку, используйте текущий метод
Bot::createSubscription()— повторный вызов с тем же URL заменит её настройки.Long Polling не подходит для production. Получение обновлений через
getUpdates(long polling) ограничено по скорости запросов и сроку хранения событий на сервере MAX. Используйте его только при локальной разработке и отладке — в продакшене переключайтесь на Webhook.
Кратко:
| Окружение | Рекомендуемый режим | Требования |
|---|---|---|
| Разработка / отладка | Long Polling (CLI) | — |
| Staging / Production | Webhook | HTTPS + доверенный сертификат |
Требования
- PHP >= 7.4
- ext-curl
- ext-json
Установка
Через Composer
Вручную
-
Клонируйте репозиторий:
- Подключите автозагрузку:
Быстрый старт
Основное использование
Создание бота
Обработка команд
Обработка событий
Обработка callback-кнопок
Обработка входящих вложений
Когда пользователь нажимает кнопку requestContact или requestGeoLocation — или отправляет медиафайл — бот получает событие message_created с вложением (attachment). Используйте onAttachment($type, $handler) для обработки конкретного типа.
Обработчик получает полный массив вложения $attachment. Расположение данных зависит от типа:
| Тип | Данные в payload |
Прямые поля вложения |
|---|---|---|
image |
photo_id, token, url |
— |
video |
url, token |
— |
audio |
url, token |
— |
file |
url, token |
filename, size |
sticker |
url, code |
width, height |
contact |
vcf_info, max_info |
— |
inline_keyboard |
buttons |
— |
share |
url |
— |
location |
нет | latitude, longitude |
Обработчики onAttachment срабатывают раньше общего on('message_created'). Для каждого типа регистрируется один обработчик.
Создание клавиатур
Типы кнопок
Отправка медиафайлов
PHPMaxBot предоставляет три уровня API для работы с файлами — от одного вызова до полного ручного контроля.
⚠️ Ограничения MAX на состав вложений
Сервер MAX накладывает жёсткое ограничение на вложения типа file:
В одном сообщении может быть только одно вложение типа
file, и рядом с ним не может быть никаких других вложений, кромеinline_keyboard.
| Состав сообщения | Результат |
|---|---|
1 × image |
✅ |
несколько image / video / audio в любом сочетании |
✅ |
1 × file |
✅ |
1 × file + inline_keyboard |
✅ |
2 × file |
❌ 400 proto.payload |
file + image (или video / audio / location / share) |
❌ 400 proto.payload |
Ответ сервера при нарушении:
Библиотека проверяет состав вложений до обращения к API и бросает MaxBotException с понятным текстом — так ошибка не превращается в «сообщение просто не пришло». Чтобы отправить смешанный набор, используйте Bot::sendAttachmentsToChat(), который сам разложит его на допустимые сообщения.
⚠️ Файл обрабатывается асинхронно
MAX принимает загрузку файла раньше, чем заканчивает его обработку. Сообщение, отправленное сразу после Bot::upload('file', ...), отклоняется:
Библиотека обрабатывает это сама: при получении attachment.not.ready отправка автоматически повторяется с линейно растущей паузой. Поведение настраивается:
Если повторы исчерпаны, бросается ApiException с кодом attachment.not.ready.
Как это работает
Загрузка файла в MAX состоит из двух шагов: сначала запрашивается URL загрузки, затем файл передаётся на этот URL. Способ получения токена вложения зависит от типа файла:
| Тип | Шаг 1 uploadFile() |
Шаг 2 uploadFileToUrl() |
Откуда токен |
|---|---|---|---|
image, file |
возвращает только url |
передаёт файл → возвращает token |
из ответа шага 2 |
video, audio |
возвращает url и token |
передаёт файл (слот завершается) | из ответа шага 1 |
Все высокоуровневые методы скрывают эту разницу — вы просто передаёте файл.
Уровень 1 — высокоуровневые методы (рекомендуется)
Один вызов: библиотека сама получает URL, загружает файл и отправляет сообщение.
Отправка в чат
Отправка пользователю
Сигнатура методов
Параметр $extra принимает те же опции, что и sendMessageToChat() / sendMessageToUser() (format, дополнительные attachments и т.д.).
Уровень 2 — получение токена, ручная отправка
Используйте этот вариант, когда нужен токен до отправки сообщения — например, чтобы вложить файл в ответ на callback.
⚠️ Частая ошибка: положить в одно сообщение и картинку, и файл. MAX ответит
400 proto.payload— библиотека перехватит это раньше и броситMaxBotException.
Пакетная отправка нескольких вложений
Когда нужно отправить сразу несколько вложений, из которых часть — файлы, используйте
sendAttachmentsToChat() / sendAttachmentsToUser(). Метод сам разложит набор на
допустимые сообщения: все не-файловые вложения уходят одним сообщением, каждый файл —
отдельным.
Элемент набора описывается ключами:
| Ключ | Обязателен | Описание |
|---|---|---|
type |
да | image, video, audio, file |
path |
да¹ | путь к локальному файлу — будет загружен автоматически |
token |
да¹ | готовый токен, если файл уже загружен через Bot::upload() |
mime |
нет | MIME-тип; по умолчанию определяется по расширению |
¹ нужно указать либо path, либо token.
Подпись ($caption) ставится на первое сообщение, а $extra['attachments']
(обычно клавиатура) — на последнее:
Сигнатуры:
Уровень 3 — полный ручной контроль
Когда нужен доступ к сырым ответам каждого шага.
image / file — токен из ответа на загрузку
video / audio — токен из первого ответа
Полный пример: бот с командами /photo и /video
Смотрите также пример examples/media-bot.php.
API методы
Сообщения
⚠️ Сообщение с вложением
fileне может содержать других вложений, кромеinline_keyboard— см. «Ограничения MAX на состав вложений».sendMessageToChat(),sendMessageToUser()иeditMessage()проверяют это до обращения к API и бросаютMaxBotException.
Чаты
Закрепленные сообщения
Бот
Видео
Подписки (Webhook)
С 25.05.2026 URL обязан быть HTTPS с сертификатом от доверенного CA. Запросы на HTTP-адреса и адреса с самоподписными сертификатами будут отклоняться.
Загрузка и отправка файлов (краткий справочник)
Полное описание — в разделе «Отправка медиафайлов». Ограничения на состав вложений — «Ограничения MAX на состав вложений».
Действия
Callback ответы
Формат сообщений
Запуск бота
PHPMaxBot::start() сам определяет режим:
- запуск через CLI (
php bot.php) → Long Polling - запуск через веб-сервер (HTTP-запрос приходит на скрипт) → Webhook
Long Polling (только для разработки)
Бот опрашивает getUpdates в цикле. Подходит для локальной отладки.
⚠️ Long Polling не подходит для production. Метод
getUpdatesограничен по скорости и сроку хранения событий — при нагрузке часть обновлений может быть пропущена. На staging и production используйте Webhook.
Webhook (production)
Требования:
- Публичный URL по HTTPS (HTTP больше не поддерживается с 25.05.2026).
- Сертификат от доверенного центра (Let's Encrypt, ZeroSSL, коммерческие CA). Самоподписные сертификаты больше не поддерживаются.
- Скрипт должен отвечать на
POST-запросы от MAX и возвращать2xx.
Минимальный webhook-скрипт (например, public/webhook.php):
Регистрация webhook (выполняется один раз — отдельным скриптом или из админки):
Готовый пример: examples/webhook-bot.php.
Обновление подписки
Чтобы сменить URL или список событий — просто вызовите createSubscription повторно с новым URL (старую при необходимости удалите через deleteSubscription):
Проверка SSL-сертификата при исходящих запросах
По умолчанию библиотека отключает CURLOPT_SSL_VERIFYPEER / CURLOPT_SSL_VERIFYHOST для исходящих запросов к API MAX (это удобно при разработке). В production обязательно включите проверку — см. раздел «Настройка параметров cURL»:
Обработка исключений
Ошибки внутри обработчиков
Исключение, вылетевшее из обработчика, перехватывается фреймворком и передаётся в лог,
а не в ответ HTTP: тело ответа на webhook MAX отбрасывает, поэтому ошибка, выведенная
туда через echo, исчезла бы бесследно — со стороны это выглядит как «бот молча ничего
не отправил».
Поведение по режимам:
| Режим | Что происходит с ошибкой обработчика |
|---|---|
| Webhook | пишется в лог, вебхуку возвращается 200 (чтобы MAX не повторял заведомо падающий запрос) |
| Long Polling | пишется в лог и в консоль; обработка остальных обновлений продолжается |
По умолчанию сообщения уходят в error_log(). Свой обработчик:
В строку лога попадают класс исключения, текст, а для ApiException — ещё и код ошибки
MAX с HTTP-статусом и контекстом:
Доступ к текущему обновлению
Типы обновлений
Доступные типы обновлений для фильтрации:
message_created- Создано новое сообщениеmessage_edited- Сообщение отредактированоmessage_removed- Сообщение удаленоmessage_callback- Нажата callback-кнопкаbot_started- Бот запущен пользователемbot_stopped- Пользователь остановил ботаbot_added- Бот добавлен в чатbot_removed- Бот удален из чатаuser_added- Пользователь добавлен в чатuser_removed- Пользователь удален из чатаchat_title_changed- Название чата измененоdialog_removed- Диалог удален пользователем
Структура обновлений: получение userId и chatId
Разные типы обновлений имеют разную структуру. Пути к идентификаторам:
| Тип обновления | userId | chatId |
|---|---|---|
message_created |
$update['message']['sender']['user_id'] |
$update['message']['recipient']['chat_id'] ¹ |
message_edited |
$update['message']['sender']['user_id'] |
$update['message']['recipient']['chat_id'] ¹ |
message_callback |
$update['callback']['sender']['user_id'] |
$update['callback']['message']['recipient']['chat_id'] ¹ |
message_removed |
$update['user_id'] |
$update['chat_id'] |
bot_started |
$update['user']['user_id'] |
$update['chat_id'] |
bot_stopped |
$update['user']['user_id'] |
$update['chat_id'] |
bot_added |
$update['user']['user_id'] |
$update['chat_id'] |
bot_removed |
$update['user']['user_id'] |
$update['chat_id'] |
user_added |
$update['user']['user_id'] |
$update['chat_id'] |
user_removed |
$update['user']['user_id'] |
$update['chat_id'] |
chat_title_changed |
$update['user']['user_id'] |
$update['chat_id'] |
dialog_removed |
$update['user']['user_id'] |
$update['chat_id'] |
¹ Поле chat_id в объекте recipient присутствует только для групповых чатов. В личном диалоге оно отсутствует — для ответа используйте sender.user_id.
Примеры:
Указать типы обновлений:
Примеры
| Файл | Что демонстрирует |
|---|---|
sample.php |
Полный пример с командами, клавиатурами и вложениями |
examples/simple-bot.php |
Команды, события, регулярные выражения |
examples/keyboard-bot.php |
Inline-клавиатуры, callback-кнопки, запрос контакта и геолокации |
examples/attachments-bot.php |
Обработка всех типов входящих вложений через onAttachment() |
examples/media-bot.php |
Отправка изображений, видео, аудио и файлов |
examples/webhook-bot.php |
Production-режим: HTTPS webhook + регистрация подписки |
Запуск любого примера:
Debug режим
Настройка параметров cURL
Библиотека позволяет задать любые параметры cURL, которые будут применяться к каждому запросу к API.
Защищённые параметры —
CURLOPT_URL,CURLOPT_RETURNTRANSFER,CURLOPT_CUSTOMREQUEST,CURLOPT_HTTPHEADER,CURLOPT_POSTFIELDS— всегда устанавливаются библиотекой и не могут быть переопределены.
SSL-параметры (CURLOPT_SSL_VERIFYHOST,CURLOPT_SSL_VERIFYPEER) по умолчанию отключены, но могут быть переопределены.
Способ 1: через второй параметр конструктора (рекомендуется)
Способ 2: через статическое свойство (можно менять в любой момент)
Примеры конфигураций
Работа через прокси:
Строгая проверка SSL (для продакшн-среды):
Ограничение таймаутов:
Лицензия
GPL-3.0
Автор
GrayHoax [email protected]
Ссылки
Поддержка
Если у вас возникли проблемы или вопросы, создайте issue на GitHub.
All versions of phpmaxbot with dependencies
ext-curl Version *
ext-json Version *