Полный справочник команд express-botx.
| Команда | Описание |
|---|---|
send |
Отправить сообщение и/или файл в чат |
api |
Отправить произвольный HTTP-запрос к BotX API |
enqueue |
Положить сообщение в очередь для асинхронной отправки |
serve |
Запустить HTTP-сервер (API + вебхуки) |
worker |
Читать сообщения из очереди и отправлять в BotX API |
bot ping |
Проверить авторизацию и доступность API |
bot info |
Показать информацию о боте |
bot token get |
Получить токен бота (из кеша или API) |
bot token refresh |
Принудительно обновить токен и записать в кеш |
bot token clear |
Удалить закешированный токен |
chats list |
Показать список чатов бота |
chats info |
Показать детальную информацию о чате |
user search |
Найти пользователя по email, HUID или AD-логину |
config bot add|rm|list |
Управление ботами в конфиге |
config chat add|set|import|rm|list |
Управление алиасами чатов |
config apikey add|rm|list |
Управление API-ключами сервера |
config show |
Показать путь к конфигу и сводку |
config edit |
Открыть конфиг в редакторе с валидацией |
config validate |
Проверить конфиг: синтаксис, поля, форматы, ссылки |
Доступны для большинства команд:
--host хост сервера eXpress
--bot-id ID бота (UUID)
--bot имя бота из конфига
--secret секрет бота (литерал, env:VAR или vault:path#key)
--token токен бота (альтернатива --secret)
--config путь к файлу конфигурации
--no-cache отключить кэширование токена
--format формат вывода: text или json (по умолчанию: text)
--all / -A итерировать все боты из конфига (bot ping/info/token, chats list, config chat import)
-v / -vv / -vvv уровень подробности логирования
Отправляет сообщение в чат через BotX API.
# Текст как аргумент
express-botx send "Сборка #42 прошла успешно"
# Из файла
express-botx send --body-from report.txt
# Из stdin
echo "Deploy OK" | express-botx send
# С файлом-вложением
express-botx send --file report.pdf "Отчёт за март"
# С mentions (BotX wire-формат)
express-botx send --mentions '[{"mention_id":"aaa-bbb","mention_type":"user","mention_data":{"user_huid":"xxx","name":"Иван"}}]' \
"@{mention:aaa-bbb} Привет!"
# С inline mentions (автоматический парсинг)
express-botx send "Привет, @mention[email:user@company.ru]!"
express-botx send "Задача для @mention[email:user@company.ru;Иван%20Петров]"
express-botx send "@mention[all] Внимание!"
express-botx send "Проверь @mention[huid:f16cdc5f-6366-5552-9ecd-c36290ab3d11;Иван]"
# Inline mentions + raw mentions одновременно
express-botx send --mentions '[{"mention_id":"aaa-bbb","mention_type":"user","mention_data":{"user_huid":"xxx","name":"Иван"}}]' \
"@{mention:aaa-bbb} и @mention[email:other@company.ru] — готово"
# Отключить парсинг inline mentions
express-botx send --no-parse "Текст с @mention[email:...] останется как есть"
# Файл из stdin
cat image.png | express-botx send --file - --file-name image.png
# Все параметры через флаги (без конфига)
express-botx send --host express.company.ru --bot-id UUID --secret KEY --chat-id UUID "Hello"При успехе утилита завершается молча (exit 0). Ошибки выводятся в stderr (exit 1).
--chat-id UUID или алиас целевого чата (опционально при наличии default)
--body-from прочитать сообщение из файла
--file путь к файлу-вложению (или - для stdin)
--file-name имя файла (обязательно при --file -)
--status статус уведомления: ok или error (по умолчанию: ok)
--silent без push-уведомления получателю
--stealth стелс-режим (сообщение видно только боту)
--force-dnd доставить даже при DND
--no-notify не отправлять уведомление вообще
--metadata произвольный JSON для notification.metadata
--mentions JSON-массив mentions в wire-формате BotX API
--no-parse отключить парсинг inline @mention[...] в тексте
Поле --mentions принимает JSON-массив в формате BotX API. Текст сообщения должен уже содержать
соответствующие placeholder'ы (@{mention:...}, @@{mention:...}, ##{mention:...}).
Если JSON невалиден или не является массивом, команда завершится с ошибкой.
По умолчанию parser включён и ищет в тексте сообщения токены @mention[...].
Поддерживаемый синтаксис:
@mention[email:<email>]— mention по email (выполняется lookup пользователя);@mention[email:<email>;<display_name>]— с явным display name (URL-encoded);@mention[huid:<uuid>]— mention по HUID (без lookup);@mention[huid:<uuid>;<display_name>]— с явным display name;@mention[all]— broadcast mention на весь чат.
Parser заменяет найденные токены на BotX placeholder'ы (@{mention:<id>}) и добавляет
соответствующие записи в массив mentions. Если указаны и --mentions, и inline токены,
массивы объединяются: raw mentions остаются без изменений, parsed mentions дописываются в конец.
При ошибке парсинга или lookup токен остаётся в тексте как есть, сообщение всё равно отправляется.
Флаг --no-parse отключает парсинг: токены @mention[...] остаются в тексте без изменений.
Отправляет произвольный HTTP-запрос к eXpress BotX API с автоматической аутентификацией. Поддерживает JSON-тело через -f/-F, raw body через --input, multipart-загрузку через --input @file, фильтрацию ответа через jq-выражения (-q).
# GET-запрос
express-botx api /api/v3/botx/chats/list
# GET с query-параметрами
express-botx api '/api/v3/botx/chats/info?group_chat_id=<UUID>'
# POST с JSON-телом из полей
express-botx api -X POST /api/v3/botx/chats/create -f name=test -f chat_type=group_chat
# POST с JSON-телом из файла (raw mode)
express-botx api -X POST /api/v4/botx/notifications/direct \
--input payload.json -H 'Content-Type: application/json'
# POST raw body с кастомным Content-Type
express-botx api -X POST /api/v3/botx/smartapps/event \
--input event.xml -H 'Content-Type: application/xml'
# Загрузить файл (multipart)
express-botx api -X POST /api/v3/botx/files/upload \
--input @photo.jpg \
-f group_chat_id=<UUID> -f file_name=photo.jpg -f mime_type=image/jpeg
# Скачать файл
express-botx api '/api/v3/botx/files/download?group_chat_id=<UUID>&file_id=<UUID>' > photo.jpg
# Фильтрация через jq
express-botx api /api/v3/botx/chats/list -q '.result[].name'
# Показать заголовки ответа
express-botx api -i /api/v3/botx/chats/listПри HTTP 2xx — exit 0. При non-2xx — тело ответа выводится в stdout, exit 1. Ошибки валидации и auth выводятся в stderr (exit 1, stdout пустой).
-X, --method HTTP-метод (авто: POST при -f/-F/--input, иначе GET)
-f, --field строковое поле для JSON-тела (key=value, повторяемый)
-F типизированное поле: true/false → bool, числа → number, @file → содержимое
-H, --header дополнительный HTTP-заголовок (key:value, повторяемый)
--input файл с телом запроса (- для stdin, @file для multipart)
--part-name имя multipart-part для бинарного файла (по умолчанию: content)
-q, --jq jq-выражение для фильтрации JSON-ответа
-i, --include показать HTTP-статус и заголовки ответа
--timeout таймаут запроса (перезаписывает значение из конфига)
--silent подавить вывод тела ответа
| Режим | Флаги | Content-Type |
|---|---|---|
| JSON | -f/-F |
application/json (авто) |
| Raw | --input file |
не выставляется — задать через -H |
| Multipart | --input @file [+ -f] |
multipart/form-data (авто) |
-f/-F и --input (без @) взаимоисключающие. -F запрещён в multipart-режиме.
Кладёт сообщение в очередь (RabbitMQ / Kafka) вместо прямой отправки в BotX API. Требует сборки с соответствующим build tag.
# Direct mode — по UUID бота и чата
express-botx enqueue --bot-id BOT-UUID --chat-id CHAT-UUID "Hello"
# Catalog mode — по алиасам из local catalog cache
express-botx enqueue --routing-mode catalog --bot alerts --chat-id deploy "Deploy OK"
# Mixed mode (default) — UUID если указаны, иначе алиасы
express-botx enqueue --chat-id deploy "Hello"
# Из файла / stdin (аналогично send)
express-botx enqueue --body-from report.txt
echo "OK" | express-botx enqueue --bot-id UUID --chat-id UUID
# С файлом-вложением
express-botx enqueue --file report.pdf --bot-id UUID --chat-id UUID "Отчёт"
# С mentions (BotX wire-формат)
express-botx enqueue --mentions '[{"mention_id":"aaa-bbb","mention_type":"user","mention_data":{"user_huid":"xxx","name":"Иван"}}]' \
--bot-id UUID --chat-id UUID "@{mention:aaa-bbb} Привет!"
# С inline mentions
express-botx enqueue --bot-id UUID --chat-id UUID "Привет, @mention[email:user@company.ru]!"
# Отключить парсинг inline mentions
express-botx enqueue --no-parse --bot-id UUID --chat-id UUID "Текст с @mention[email:...] как есть"При успехе выводит request_id (text) или {"ok":true,"queued":true,"request_id":"..."} (json).
--routing-mode direct | catalog | mixed (по умолчанию: mixed)
--bot-id UUID бота (direct routing)
--bot алиас бота из catalog (catalog/mixed)
--chat-id UUID или алиас чата
--body-from прочитать сообщение из файла
--file путь к файлу-вложению (или - для stdin)
--file-name имя файла (обязательно при --file -)
--status статус уведомления: ok или error (по умолчанию: ok)
--silent без push-уведомления
--stealth стелс-режим
--force-dnd доставить при DND
--no-notify без уведомления
--metadata JSON для notification.metadata
--mentions JSON-массив mentions в wire-формате BotX API
--no-parse отключить парсинг inline @mention[...] в тексте
Поле --mentions принимает JSON-массив в формате BotX API. Текст сообщения должен уже содержать
соответствующие placeholder'ы (@{mention:...}, @@{mention:...}, ##{mention:...}).
Если JSON невалиден или не является массивом, команда завершится с ошибкой.
Inline mentions (@mention[...]) поддерживаются аналогично команде send. Парсинг включён
по умолчанию, отключается через --no-parse. В очередь публикуются уже нормализованные
message и merged mentions.
| Режим | Описание |
|---|---|
direct |
Producer получает --bot-id и --chat-id (UUID) и публикует без проверки. Не нужен catalog. |
catalog |
Алиасы (--bot, --chat-id по имени) резолвятся через локальный snapshot каталога. |
mixed |
Если указаны UUID — работает как direct. Если алиасы — через catalog. Рекомендуемый default. |
Запускает HTTP-сервер с эндпоинтами для отправки сообщений и приёма вебхуков.
express-botx serve --config config.yaml
express-botx serve --config config.yaml --listen :9090
express-botx serve --config config.yaml --api-key env:MY_API_KEY| Метод | Путь | Описание |
|---|---|---|
GET |
/healthz |
Проверка здоровья |
POST |
{basePath}/send |
Отправка сообщения (JSON / multipart) |
POST |
{basePath}/alertmanager |
Приём вебхуков от Alertmanager |
POST |
{basePath}/grafana |
Приём вебхуков от Grafana |
Все POST-эндпоинты требуют авторизации: Authorization: Bearer <key> или X-API-Key: <key>.
Переводит HTTP /send в асинхронный режим: вместо прямой отправки публикует задание в очередь и возвращает 202 Accepted.
express-botx serve --enqueue --config config.yamlОтвет в async-режиме:
{"ok": true, "queued": true, "request_id": "0d6d7f87-0a2f-4c5b-b0d4-4d0b705a77e2"}HTTP payload расширяется полями routing_mode и bot_id для direct routing:
{"routing_mode": "direct", "bot_id": "bot-uuid", "chat_id": "chat-uuid", "message": "deploy ok"}Эндпоинт /send принимает application/json и multipart/form-data. Основные поля:
| Поле | Тип | Описание |
|---|---|---|
chat_id |
string | UUID или алиас чата (обязательно) |
message |
string | Текст сообщения |
file |
object | Вложение: {"name": "...", "data": "base64..."} |
status |
string | ok или error (по умолчанию: ok) |
metadata |
JSON | Произвольный JSON для notification.metadata |
mentions |
JSON array | Массив mentions в wire-формате BotX API |
opts |
object | Опции доставки: silent, stealth, force_dnd, no_notify |
Пример с mentions через HTTP API:
curl -X POST http://localhost:8080/api/v1/send \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "CHAT-UUID",
"message": "@{mention:aaa-bbb} Deploy completed",
"mentions": [{"mention_id":"aaa-bbb","mention_type":"user","mention_data":{"user_huid":"xxx","name":"Иван"}}]
}'Поле mentions принимает JSON-массив в формате BotX API. Текст сообщения должен уже содержать
соответствующие placeholder'ы (@{mention:...}, @@{mention:...}, ##{mention:...}).
При multipart-запросе mentions передаётся как строковое JSON-поле формы.
По умолчанию parser включён для HTTP-запросов. Токены @mention[...] в поле message
автоматически парсятся и нормализуются в BotX wire-format. Синтаксис аналогичен CLI (см. send).
Пример с inline mention:
curl -X POST http://localhost:8080/api/v1/send \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "CHAT-UUID",
"message": "Привет, @mention[email:user@company.ru]!"
}'Отключение парсинга через query parameter ?no_parse=true:
curl -X POST 'http://localhost:8080/api/v1/send?no_parse=true' \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "CHAT-UUID",
"message": "Текст с @mention[email:...] останется как есть"
}'При ошибке парсинга или lookup сообщение всё равно отправляется (HTTP 200), токен остаётся в тексте.
Читает сообщения из очереди, отправляет в BotX API, публикует результаты в reply queue.
# Запуск worker'а
express-botx worker --config config.yaml
# С health check HTTP-сервером
express-botx worker --config config.yaml --health-listen :8081
# Без публикации каталога
express-botx worker --config config.yaml --no-catalog-publishПо умолчанию worker публикует routing catalog в отдельную queue/topic, чтобы producer'ы могли резолвить алиасы.
--health-listen адрес для health check сервера (например, :8081)
--no-catalog-publish отключить публикацию каталога
При --health-listen worker поднимает HTTP-сервер:
| Метод | Путь | Описание |
|---|---|---|
GET |
/healthz |
200 если consumer подключён к брокеру, 503 иначе |
GET |
/readyz |
200 когда worker готов принимать сообщения, 503 при startup/shutdown |
Проверяет авторизацию и доступность API:
express-botx bot ping
express-botx bot ping --bot prod
# Проверить все боты из конфига
express-botx bot ping --all
express-botx bot ping -A --format jsonПри --all / -A итерирует все боты из конфига и выводит статус каждого. Текстовый формат: botname: OK 123ms или botname: FAIL reason. JSON: массив объектов с полями name, status, elapsed_ms, error. Exit code ненулевой, если хотя бы один бот недоступен. Флаг --all несовместим с --bot, --host, --bot-id, --secret, --token.
Показывает информацию о боте:
express-botx bot info
express-botx bot info --bot prod --format json
# Информация по всем ботам
express-botx bot info --all
express-botx bot info -A --format jsonПри --all / -A выводит таблицу (text) или массив (json) с информацией по каждому боту из конфига. Флаг --all несовместим с --bot, --host, --bot-id, --secret, --token.
Получает токен бота. По умолчанию возвращает закешированный токен, если он есть; иначе запрашивает новый через API и кеширует.
# Из кеша или API
express-botx bot token get --bot prod
# Всегда запросить свежий (bypass кеша), но обновить кеш
express-botx bot token get --bot prod --fresh
# Использование в скриптах
TOKEN=$(express-botx bot token get --bot prod)
# Статический токен — возвращает как есть
express-botx bot token get --bot token-bot
# Токены всех ботов
express-botx bot token get --all
express-botx bot token get -A --format jsonФлаг --fresh заставляет обойти кеш и запросить токен из API, при этом новый токен сохраняется в кеш. При --all / -A выводит токены всех ботов. Флаг --all несовместим с --bot, --host, --bot-id, --secret, --token.
Принудительно обновляет токен: всегда запрашивает новый через API и записывает в кеш. Не работает для ботов со статическим токеном.
express-botx bot token refresh --bot prod
express-botx bot token refresh --all
express-botx bot token refresh -A --format jsonУдаляет закешированный токен. Для ботов со статическим токеном или при отключённом кеше — no-op.
express-botx bot token clear --bot prod
express-botx bot token clear --allexpress-botx chats list
express-botx chats list --bot prod --format json
# Чаты всех ботов
express-botx chats list --all
express-botx chats list -A --format jsonПри --all / -A собирает чаты со всех ботов из конфига. В текстовом формате группирует по боту, в JSON добавляет поле bot_name к каждой записи. Чаты от успешных ботов выводятся даже если другие боты упали. Флаг --all несовместим с --bot, --host, --bot-id, --secret, --token.
express-botx chats info --chat-id UUID
express-botx chats info --chat-id alertsПоиск пользователя по email, HUID или AD-логину:
express-botx user search --email user@company.ru
express-botx user search --huid UUID
express-botx user search --ad-login jdoeПо умолчанию обменивает secret на token через API и сохраняет только token (secure by default):
# Secret → token (secret не сохраняется)
express-botx config bot add --name prod --host h --bot-id ID --secret SECRET
# Сохранить secret как есть
express-botx config bot add --name prod --host h --bot-id ID --secret SECRET --save-secret
# Готовый token
express-botx config bot add --name prod --host h --bot-id ID --token TOKENexpress-botx config bot list
express-botx config bot rm prodНаходит чат по имени через API и добавляет как алиас в конфиг:
# Поиск чата по имени
express-botx config chat add --name "Deploy Alerts"
# С указанием алиаса
express-botx config chat add --name "Deploy Alerts" --alias deploy
# По UUID (без обращения к API)
express-botx config chat add --chat-id UUID --alias deploy
# С привязкой к боту
express-botx config chat add --name "Deploy Alerts" --alias deploy --bot deploy-bot
# С пометкой как чат по умолчанию
express-botx config chat add --chat-id UUID --alias general --defaultПри --name выполняется поиск по подстроке (case-insensitive). Если найдено несколько чатов — выводится список для уточнения. Если --alias не указан — генерируется из имени чата ("Deploy Alerts" → deploy-alerts, "Веб-админы" → veb-adminy).
express-botx config chat set general UUID --default
express-botx config chat set general UUID --no-defaultИмпортирует все чаты бота в конфиг. По умолчанию — только group_chat.
# Базовый импорт
express-botx config chat import
# Dry run
express-botx config chat import --dry-run
# Только конференции
express-botx config chat import --only-type voex_call
# С префиксом и привязкой к боту
express-botx config chat import --bot deploy-bot --prefix team-
# Импорт чатов от всех ботов
express-botx config chat import --all
express-botx config chat import -A --dry-run --format jsonПри --all / -A импортирует чаты от каждого бота из конфига. Алиасы включают имя бота для предотвращения коллизий (например, botname-chatname). Импортированные чаты привязываются к боту-источнику через поле bot. Флаги --dry-run, --only-type, --prefix, --skip-existing, --overwrite применяются ко всем ботам. Флаг --all несовместим с --bot, --host, --bot-id, --secret, --token.
Флаги:
--all, -A импортировать чаты от всех ботов из конфига
--dry-run показать что будет импортировано, без изменений
--only-type group_chat | voex_call
--prefix префикс для алиасов
--skip-existing пропускать конфликты алиасов
--overwrite перезаписывать конфликтующие алиасы
Поведение по умолчанию безопасное: при конфликте алиасов — ошибка.
express-botx config chat list
express-botx config chat rm deploy# Сгенерировать случайный ключ
express-botx config apikey add --name monitoring
# Добавить конкретное значение
express-botx config apikey add --name monitoring --key "my-secret-key"
# Ссылка на переменную окружения
express-botx config apikey add --name grafana --key "env:GRAFANA_API_KEY"
# Ссылка на Vault
express-botx config apikey add --name ci --key "vault:secret/data/express#ci_api_key"express-botx config apikey list # значения скрыты
express-botx config apikey rm monitoringexpress-botx config showПоказывает путь к конфигу и сводку (боты, чаты, ключи).
Открывает файл конфигурации в текстовом редакторе. После сохранения валидирует YAML и применяет изменения. Работает по аналогии с kubectl edit.
# Открыть конфиг в $EDITOR (или vi по умолчанию)
express-botx config edit
# Указать конкретный файл конфига
express-botx config edit --config /path/to/config.yamlПоведение:
- Редактор определяется из переменной окружения
$EDITOR, при отсутствии —vi - Если файл не изменён — выводит "Edit cancelled, no changes made"
- После сохранения валидирует YAML-структуру и настройки ботов/чатов
- При ошибке валидации предлагает:
[r]etry editing / [d]iscard changes? (r/d)r— вернуться в редактор для исправленияd— отменить все изменения
- При успешной валидации записывает изменения и выводит "Config updated: "
Флаги:
--config путь к файлу конфигурации
Проверяет файл конфигурации без подключения к серверам: YAML-синтаксис, известные поля, обязательные поля, форматы значений, перекрёстные ссылки.
# Проверить конфиг
express-botx config validate
# Указать конкретный файл
express-botx config validate --config /path/to/config.yaml
# Вывод в JSON
express-botx config validate --format jsonПоведение:
- Выводит список проблем:
[ERROR] path: messageили[WARN] path: message - В конце — строка итогов: "N errors, M warnings"
- При наличии ошибок — exit 1, при наличии только предупреждений — exit 0
- Не резолвит секреты и не проверяет доступность серверов
Проверки:
- Неизвестные ключи в YAML (предупреждения)
- Обязательные поля:
hostиidдля ботов,secretилиtoken(но не оба) - Форматы: UUID для
idиchat_id, длительности (timeout,retry_backoff), допустимые enum-значения (cache.type,queue.driver,routing_mode) - Перекрёстные ссылки:
botв чате ссылается на существующего бота, не более одного чата по умолчанию,default_chat_idв alertmanager/grafana ссылается на существующий алиас
Флаги:
--config путь к файлу конфигурации
--format формат вывода: text или json (по умолчанию: text)