Skip to content

Releases: GrayHoax/php-max-bot

v0.18

06 Apr 07:19
1f013b4

Choose a tag to compare

Обработка входящих вложений - 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

06 Apr 05:45

Choose a tag to compare

Новые возможности

Форматирование сообщений

Добавлена поддержка форматирования текста при отправке сообщений. Теперь можно задать формат 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

05 Apr 12:56
71a3809

Choose a tag to compare

Новые возможности

Отправка медиафайлов (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

17 Dec 04:43

Choose a tag to compare

Full Changelog: v0.04...v0.05

v0.04

14 Dec 10:24

Choose a tag to compare

Full Changelog: v0.03...v0.04

v0.03

14 Dec 09:31

Choose a tag to compare

Full Changelog: v0.02...v0.03

v0.02

14 Dec 07:06

Choose a tag to compare

Full Changelog: v0.01...v0.02

First framework release

13 Dec 12:06

Choose a tag to compare

v0.01

initial commit