Imbot 26.500.0: REST-боты получают событие отправки формы, Bot.update перестал стирать непереданные поля
В imbot 26.500.0 ботам v2 пришло событие OnImBotV2FormSubmit, imbot.v2.Bot.update больше не затирает поля профиля, которые вы не передали, а к действию «Отправить сообщение от чат-бота» можно прикрепить кнопки.
Новое
Ловите отправку формы в боте
Модуль зарегистрировал REST-событие OnImBotV2FormSubmit. Его генерирует im 26.1000.0 и новее, когда пользователь отправляет форму из сообщения бота, а imbot отдаёт его в REST. Бот в режиме WEBHOOK подписывается на события v2 при регистрации, и событие придёт на тот же WEBHOOK_URL, что и OnImBotV2MessageAdd. В список подписки OnImBotV2FormSubmit попал только в im 26.1000.0, поэтому если бот зарегистрирован раньше и событие не приходит, вызовите imbot.v2.Bot.update с текущим webhookUrl. Этот вызов пересоздаёт подписку на все события v2. Боты в режиме FETCH забирают событие через imbot.v2.Event.get, тип ONIMBOTV2FORMSUBMIT.
В payload приходит блок bot с полями id, code и auth бота, а кроме него:
actionId,blockId,buttonIdс идентификаторами действия, блока и кнопки формы;valuesс введёнными значениями;message,chatиuser: сообщение с формой, чат и отправитель;languageиadditionalMessages. ВadditionalMessagesлежит исходное сообщение, если сообщение с формой было ответом на него.
Имя события приходит в верхнем регистре, так что обработчику на WEBHOOK_URL достаточно ветки для ONIMBOTV2FORMSUBMIT:
<?php declare(strict_types=1);
use Bitrix\Main\Config\Option;
use Bitrix\Main\Context;
function handleFormSubmit(array $data): void
{
$actionId = (string)($data['actionId'] ?? '');
$values = (array)($data['values'] ?? []);
// по $actionId решаем, куда отдать $values; сами значения в лог не пишем
}
$request = Context::getCurrent()->getRequest();
$auth = (array)($request->getPost('auth') ?? []);
$expected = Option::get('vendor.bot', 'application_token');
if ($expected === '' || !hash_equals($expected, (string)($auth['application_token'] ?? ''))) {
return;
}
match ((string)$request->getPost('event')) {
'ONIMBOTV2FORMSUBMIT' => handleFormSubmit((array)($request->getPost('data') ?? [])),
default => null,
};
Остальные события v2 приходят на тот же адрес, и их ветки добавляются в этот же match. auth[application_token] сверяйте с токеном своего приложения, у бота с собственным botToken это строка custom + botToken.
Бизнес-процессы: кнопки в сообщении бота и время срабатывания триггера
У действия «Отправить сообщение от чат-бота» (CBPImBotMessageActivity) появилось свойство buttons. Каждая запись описывает кнопку полями COMMAND, COMMAND_PARAMS, TEXT и CONTEXT, из них собирается клавиатура \Bitrix\Im\Bot\Keyboard. Кнопка без COMMAND или TEXT пропускается, CONTEXT по умолчанию ALL. Если не собралось ни одной кнопки, клавиатура не прикрепляется, и сообщение уходит как раньше.
В диалоге настройки действия этого свойства нет. По комментарию в коде, его заполняет шаблон, который строит генератор ИИ-агента. Если открыть такой шаблон в дизайнере и сохранить вручную, кнопки не пропадут.
Триггер «Получено сообщение в чат-бот» возвращает новое поле EventDateTime (тип DATETIME) со временем срабатывания.
Что сломается
null в Bot.update больше не очищает поле
imbot.v2.Bot.update раньше подставлял пустую строку вместо каждого непереданного поля из name, lastName, color, workPosition и gender. Пустые имя и цвет im пропускает, а остальное доходило до профиля. Запрос, который менял только аватар или только имя, стирал фамилию и пол, а должность сбрасывал на «Чат-бот». Теперь в обновление попадают только переданные ключи, и такой запрос меняет одну должность:
{
"botId": 1234,
"fields": {
"properties": {
"workPosition": "Помощник отдела кадров"
}
}
}
При этом null теперь тоже считается непереданным значением. Если интеграция очищала фамилию или пол через null, поле останется прежним. Передавайте пустую строку, например "lastName": "". Пустая workPosition, как и раньше, превращается в «Чат-бот», а имя и цвет пустой строкой не очистить. imbot.v2.Bot.register работает по-старому и заполняет отсутствующие поля пустыми значениями.