Releases: GrayHoax/php-max-bot
v0.18
Обработка входящих вложений - onAttachment()
Основная новинка релиза - метод onAttachment(), позволяющий обрабатывать входящие вложения по типу без написания условий внутри общего on('message_created').
Новое
Метод $bot->onAttachment($type, $handler)
Регистрирует обработчик для конкретного типа вложения. Хендлер получает полный массив вложения и вызывается с приоритетом выше on('message_created').
// Геолокация - поля latitude/longitude расположены прямо в вложении
$bot->onAttachment('location', function(array $attachment) {
$lat = $attachment['latitude'];
$lon = $attachment['longitude'];
return Bot::sendMessage("Координаты: $lat, $lon");
});
// Контакт - данные в payload.max_info
$bot->onAttachment('contact', function(array $attachment) {
$info = $attachment['payload']['max_info'] ?? [];
$name = trim(($info['first_name'] ?? '') . ' ' . ($info['last_name'] ?? ''));
return Bot::sendMessage("Контакт: $name");
});
// Файл - payload содержит url/token, filename и size - прямые поля
$bot->onAttachment('file', function(array $attachment) {
$filename = $attachment['filename'] ?? 'file';
$size = $attachment['size'] ?? 0;
$url = $attachment['payload']['url'] ?? null;
return Bot::sendMessage("Файл: $filename ($size байт)\n$url");
});Поддерживаемые типы и расположение данных:
| Тип | Данные в 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 |
Новый пример examples/attachments-bot.php
Полноценный бот, демонстрирующий обработку всех 8 входящих типов вложений: location, contact, image, video, audio, file, sticker, share.
Включает команды /request (выдаёт клавиатуру для запроса геолокации и контакта) и /info.
Интерактивный тест tests/attachments.php
Запускается последним в run_all.php. Отправляет в тестовый чат инструкцию что прислать, при получении каждого типа:
- выводит обработанные данные в консоль
- отправляет ответ с результатом обратно в чат
Таймаут - 120 секунд. Непоступившие типы отмечаются как ~ (пропущено), код выхода остаётся 0.
Исправления
Неверные пути к данным вложений в keyboard-bot.php и sample.php
Старый код обращался к несуществующим ключам $update['message']['location'] и $update['message']['contact_info']. Правильный путь - message.body.attachments[].
До:
$bot->on('message_created', function() {
$update = PHPMaxBot::$currentUpdate;
if (isset($update['message']['location'])) { // ключа не существует
$lat = $update['message']['location']['latitude'];
}
if (isset($update['message']['contact_info'])) { // ключа не существует
$name = $update['message']['contact_info']['full_name'];
}
});После:
$bot->onAttachment('location', function(array $attachment) {
$lat = $attachment['latitude']; // прямое поле вложения
$lon = $attachment['longitude'];
});
$bot->onAttachment('contact', function(array $attachment) {
$name = $attachment['payload']['max_info']['first_name'] ?? '';
});Перезапись обработчиков on('message_created') в keyboard-bot.php
Два последовательных вызова $bot->on('message_created', ...) перезаписывали друг друга - второй (контакт) вытеснял первый (геолокацию). Оба заменены на onAttachment().
Неверный message_id в delete_message в sample.php
До: $update['message']['id'] - ключ не существует.
После: $update['message']['body']['mid'] - правильный путь, соответствующий API и keyboard-bot.php.
Дублирующийся on('bot_started') в simple-bot.php
Два зарегистрированных обработчика bot_started - второй перезаписывал первый. Объединены в один: показывает имя пользователя и payload (параметр старта), если передан.
Неверный путь к chat_id в QUICKSTART.md
До: $update['message']['chat']['id']
После: $update['message']['recipient']['chat_id']
Изменения в тестах
tests/keyboard.php- добавлен последний шаг с инструкцией пользователю нажать кнопкуrequestContact/requestGeoLocationи проверить ответ ботаtests/attachments.php- новый интерактивный тест всех типов вложенийtests/run_all.php-attachments.phpдобавлен последнимtests/README.md- таблица типов вложений, описание поведения при таймауте
Изменённые файлы
| Файл | Изменение |
|---|---|
src/PHPMaxBot.php |
Новый метод onAttachment(), свойство $_onAttachment, блок обработки в process() |
examples/attachments-bot.php |
Новый файл - пример обработки всех типов вложений |
examples/keyboard-bot.php |
Заменены два on('message_created') на onAttachment(), исправлены пути к данным |
examples/simple-bot.php |
Устранён дублирующийся on('bot_started') |
sample.php |
onAttachment() вместо on(), исправлен message_id в delete_message |
tests/attachments.php |
Новый файл - интерактивный тест вложений |
tests/keyboard.php |
Добавлен шаг с инструкцией для ручной проверки onAttachment |
tests/run_all.php |
attachments.php добавлен последним |
README.md |
Раздел «Обработка входящих вложений» с таблицей всех типов и примерами |
QUICKSTART.md |
Раздел onAttachment, исправлен путь chat_id, добавлен attachments-bot.php в список примеров |
tests/README.md |
Таблица типов вложений, описание attachments.php |
v0.14
Новые возможности
Форматирование сообщений
Добавлена поддержка форматирования текста при отправке сообщений. Теперь можно задать формат markdown или html один раз — и он будет автоматически применяться ко всем последующим сообщениям.
$bot->setFormat('markdown'); // или 'md', 'html'
Bot::sendMessage('**Жирный текст**');
Методы: setFormat(), getFormat().
Получение данных отправителя и контакта
Добавлены два вспомогательных метода для обработки входящих обновлений:
Bot::getSender()— возвращает данные отправителя сообщения (user_id, имя и т.д.)Bot::getContact()— извлекает переданный контакт из вложения: vcard, user_id, first_name, last_name
Исправления
Устранена ошибка Array to string conversion
В webhook и longpoll режиме метод process() мог передавать массив (ответ API) в echo или sprintf, что вызывало PHP Notice на некоторых версиях PHP. Теперь результат обработчика всегда приводится к строке.
Исправлены обращения к несуществующему классу MaxBot
В пяти местах Bot.php использовался псевдоним MaxBot:: вместо корректного PHPMaxBot::, что приводило к фатальной ошибке Class "MaxBot" not found при запуске тестов.
Удалена зависимость от ext-fileinfo
Функция uploadFileToUrl() использовала mime_content_type(), требующую расширение ext-fileinfo, которое присутствует не во всех окружениях. Заменена на определение MIME-типа по расширению файла - без внешних зависимостей.
v0.12
Новые возможности
Отправка медиафайлов (10 новых методов)
Добавлены высокоуровневые методы, объединяющие получение URL загрузки, передачу файла и отправку сообщения в один вызов:
Bot::sendImageToChat($chatId, '/path/to/photo.jpg', 'Подпись');
Bot::sendVideoToUser($userId, '/path/to/video.mp4', 'Подпись');
Bot::sendAudioToChat($chatId, '/path/to/audio.mp3');
Bot::sendFileToUser($userId, '/path/to/doc.pdf');
// Универсальный вариант:
Bot::sendMediaToChat($chatId, 'video', $file, 'Подпись');Загрузка файлов (Bot::upload)
Добавлен метод Bot::upload($type, $filePath) — обёртка над двухшаговым процессом с автоматической обработкой разного поведения API по типу файла:
- image / file — токен возвращается в ответе на загрузку файла;
- video / audio — токен выдаётся заранее при запросе URL, загрузка завершает слот.
Также добавлен низкоуровневый Bot::uploadFileToUrl($url, $filePath, $mimeType).
Новые методы API
deleteChat($chatId) - Удаление чата
getVideo($token) - Информация о видео
getSubscriptions() - Список webhook-подписок
createSubscription($url, $types) - Создание webhook-подписки
deleteSubscription($url) - Удаление webhook-подписки
Keyboard: кнопка message
Добавлены методы Keyboard::message($text, $payload) и Keyboard::messageButton() — кнопка, отправляющая текстовое сообщение от имени пользователя при нажатии.
Исправления
- Исключения без Composer — Bot.php теперь явно подключает MaxBotException и ApiException через require_once, поэтому они корректно работают без автозагрузчика.
- Пустой ответ API — ответ
{"code": "empty.response.body"}(возвращается рядом методов, например editChatInfo) теперь обрабатывается как успешный пустой результат вместо исключения. - Загрузка видео — ответ сервера в формате XML (
<retval>1</retval>) при загрузке video/audio корректно обрабатывается. - addChatAdmin — исправлен формат тела запроса:
{"admins": [{"user_id": ..., "permissions": [...]}]}.
Документация
- Добавлен раздел «Отправка медиафайлов» в README с описанием трёх уровней API (высокоуровневые методы → upload() → ручной двухшаговый процесс), таблицей поведения по типам и полным примером.
- Добавлен пример examples/media-bot.php.
- Обновлён README.md: справочник по всем новым методам, актуальные примеры кода.
v0.05
Full Changelog: v0.04...v0.05
v0.04
Full Changelog: v0.03...v0.04
v0.03
Full Changelog: v0.02...v0.03
v0.02
Full Changelog: v0.01...v0.02
First framework release
v0.01 initial commit