Минимально рабочий бот для Bitrix24 Chat bots v2.0 на Python:
- вручную регистрирует бота через
imbot.v2.Bot.register, - получает события через
imbot.v2.Event.get(polling), - отвечает эхом в формате
Ответ на {текст}, - автоматически регистрирует slash-команду
/менюпри старте, - демонстрирует контекстный flow по ордерам:
Главное меню -> Посмотреть ордера -> Меню выбранного ордера, - использует входящий webhook (
/rest/{user_id}/{token}/...) +botToken, - работает синхронно (без async).
- Python 3.11+
uvrequestspython-dotenv
- Ссылка на документацию к API https://apidocs.bitrix24.ru/api-reference/chat-bots/chat-bots-v2/index.html
- В РФ для создания входящего вебхука неоходимо оформлять отдельную подписку на маркетплейсы. В РБ это бесплатно.
- Заполни переменные в
.env(блокиBITRIX_*, смотри секцию ниже). - Установи зависимости:
uv sync- Заполни регистрационные поля и выполни ручную регистрацию бота:
uv run bitrix-register-bot- Возьми
botIdиз результата регистрации и заполниBITRIX_BOT_ID. - Если нужно удалить бота, выполни:
uv run bitrix-unregister-botКоманда удаления использует BITRIX_BOT_ID и BITRIX_BOT_TOKEN из .env.
2. Запусти polling-бота:
uv run bitrix-bot- В Bitrix24 открой
Разработчикам -> Другое -> Входящий вебхук. - Создай вебхук и включи права на модуль чатов/ботов (
imbot/im, если доступны отдельно). - Скопируй URL вида:
https://<portal>.bitrix24.ru/rest/<user_id>/<webhook_token>/ - Из URL заполни в
.env:
BITRIX_DOMAIN=<portal>.bitrix24.ruBITRIX_WEBHOOK_USER_ID=<user_id>BITRIX_WEBHOOK_TOKEN=<webhook_token>
BITRIX_BOT_TOKENзадай заранее (любой секретный токен), он используется вimbot.v2методах.- Для внутреннего режима сотрудников в
.envоставьBITRIX_BOT_TYPE=personal.
src/bitrix_bot/config.py— загрузка и валидация конфигурацииsrc/bitrix_bot/client.py— sync REST-клиент Bitrix APIsrc/bitrix_bot/poller.py— polling-цикл с дедупликацией событийsrc/bitrix_bot/handlers.py— обработка входящих message-событийsrc/bitrix_bot/keyboard.py— генерация payload клавиатурыscripts/register_bot.py— ручная регистрацияimbot.v2.Bot.register(eventMode=fetch,type=personal)scripts/unregister_bot.py— ручное удалениеimbot.v2.Bot.unregister
BITRIX_DOMAIN— домен портала (напримерcompany.bitrix24.ru)BITRIX_WEBHOOK_USER_ID— user id из URL входящего webhookBITRIX_WEBHOOK_TOKEN— секретный токен из URL входящего webhookBITRIX_BOT_TOKEN— токен бота дляimbot.v2вызововBITRIX_BOT_ID— ID зарегистрированного бота для runtime
Обязательно для работы runtime:
BITRIX_DOMAIN— домен портала, безhttps://BITRIX_WEBHOOK_USER_ID— user id из URL вебхукаBITRIX_WEBHOOK_TOKEN— webhook token из URLBITRIX_BOT_TOKEN— секрет бота (используется вimbot.v2payload)BITRIX_BOT_ID— ID зарегистрированного бота (получаешь послеuv run bitrix-register-bot)
Обязательно для регистрации:
BITRIX_BOT_CODEBITRIX_BOT_NAMEBITRIX_BOT_TYPE=personalBITRIX_BOT_WORK_POSITION
Опционально (можно оставить по умолчанию):
BITRIX_EVENT_TYPES— список типов событий через запятую, рекомендуемо:message,commandBITRIX_EVENT_TYPE— fallback для одного типа (по умолчаниюmessage)BITRIX_POLLING_TIMEOUTBITRIX_POLLING_LIMITBITRIX_POLLING_SLEEP_SECONDSBITRIX_NOTIFY_ON_START— отправлять сервисное сообщение о старте (true/false)BITRIX_STARTUP_NOTIFY_DIALOG_ID—dialogIdдля стартового уведомленияBITRIX_STARTUP_MESSAGE— текст стартового уведомленияBITRIX_SKIP_BACKLOG_ON_START— игнорировать накопленные до запуска события (true/false)
- Тексты ответов и подписи кнопок захардкожены в
src/bitrix_bot/config.py. - Бот в fetch-режиме слушает события
messageиcommand. /меню,меню,Меню: бот отправляет главное меню с кнопкойПосмотреть ордера.Посмотреть ордера: бот отправляет список тестовых номеров ордеров в виде клавиатуры.- Выбор номера ордера: бот сохраняет
selected_order_idв контексте текущегоdialogIdи отправляет меню выбранного ордера. - В меню ордера доступны действия:
Статус ордера,Состав,Сумма,Назад к ордерам,Назад в главное меню. - Кнопки
Статус ордера/Состав/Суммаобрабатываются только при активном контексте выбранного ордера. - Если контекст ордера отсутствует, бот возвращает пользователя к выбору ордера.
- Любое другое сообщение:
Ответ на {текст входящего сообщения}.
- Запусти бота:
uv run bitrix-bot- Отправь
менюили/менюи проверь, что пришло главное меню. - Нажми
Посмотреть ордераи проверь, что пришла клавиатура с тестовыми ордерами. - Нажми один номер ордера и проверь, что пришло меню по выбранному ордеру.
- Нажми
Статус ордера,Состав,Суммаи проверь, что ответы содержат номер выбранного ордера. - Нажми
Назад к ордерамиНазад в главное меню, проверь корректные переходы.
- При запуске бот может отправить служебное сообщение «бот запущен и готов к работе».
- Чтобы не реагировать на старые события из очереди, включен warm-up по
nextOffset(BITRIX_SKIP_BACKLOG_ON_START=true). - После warm-up обрабатываются только новые события.
imbot.v2.Bot.register:fields{code,botToken,type,eventMode,properties}imbot.v2.Bot.unregister:botId,botTokenimbot.v2.Event.get:botId,botToken,limit,offset,timeoutimbot.v2.Chat.Message.send:botId,botToken,dialogId,fields{message,keyboard}imbot.v2.Chat.Message.get:botId,botToken,messageIdimbot.v2.File.upload:botId,botToken,dialogId,fields{name,content,message}
Slash-команда /меню регистрируется автоматически на старте (imbot.v2.Command.register).
- Реализован sync polling без async-кода.
- На
429применяется экспоненциальный backoff. - Формат входящих событий у Bitrix может отличаться по полям/регистру, поэтому в обработчике есть безопасные fallback-ключи.
- Бот регистрируется в
type=personal, то есть предназначен для внутреннего использования сотрудниками портала.
Если в логах появляются ошибки ACCESS_DENIED, WRONG_AUTH_TYPE, insufficient_scope или похожие:
- это признак, что текущая комбинация
incoming-only + imbot.v2.*не поддержана на портале; - минимальный fallback: перейти на
imbot.*методы и добавитьCLIENT_ID(application context), сохранив остальную логику обработчиков.
Типовые ошибки imbot.v2.Bot.unregister:
BOT_TOKEN_NOT_SPECIFIED— не переданbotTokenBOT_ID_REQUIRED— не переданbotIdBOT_NOT_FOUND— бот не найденBOT_OWNERSHIP_ERROR— бот зарегистрирован другим приложением