Создать первого бота
- Откройте «Настройки → Боты → Создать бота». Хост может запрещать создание ботов.
- Задайте логин из
a-z0-9_, 2–32 символа. Сохраните токен: он показывается один раз. - В настройках сообщества добавьте бота и выдайте только необходимые права. Для управления требуется
MANAGE_BOTS. - Запустите программу бота на своей машине или сервере. Наличие аккаунта бота само по себе не запускает его код.
- Укажите адрес API именно того хоста, который выдал токен.
Боты работают в каналах сообществ, куда добавлены. Личные сообщения и паблики через Bot API недоступны.
Авторизация и секреты
Authorization: Bearer <BOT_TOKEN>Для действий бота нужен его токен. Создание и редактирование бота, добавление в сообщество и выдача прав выполняются с токеном аккаунта владельца или администратора. Не смешивайте эти полномочия.
Храните токены в переменных окружения, не в браузерном коде и не в Git. В базе хоста хранится хеш токена. При утечке отзовите старый токен и создайте новый. Gateway передаёт токен в query string, поэтому настройте очистку URL в журналах reverse proxy и мониторинга. Используйте HTTPS/WSS.
Минимальный работающий пример
Нужен Node.js 22+ со встроенными fetch и WebSocket. Скачать ping-bot.mjs. Пример регистрирует /ping, отвечает в канале и повторно подключается после разрыва связи.
$env:SIBREL_API_URL = "https://api.example.org"
$env:SIBREL_BOT_TOKEN = "ваш-токен"
node ./ping-bot.mjsREST API бота
| Метод и путь | Назначение |
|---|---|
| GET /api/bots/me | Профиль, состояние подключения, команды и сообщества. |
| GET /api/bots/guilds | Сообщества бота. |
| GET /api/bots/guilds/:guildId/channels | Доступные каналы. |
| GET /api/bots/channels/:channelId/messages?limit=20&before=:id | История; максимум 100 сообщений за запрос. |
| POST /api/bots/messages | Сообщение: channel_id и content / embeds / components; необязательный reply_to_id. |
| PATCH /api/bots/messages/:id | Редактирование своего сообщения. |
| DELETE /api/bots/messages/:id | Мягкое удаление. mode=hard требует соответствующих прав. |
| POST /api/bots/channels/:id/typing | Индикатор печати, ответ 204. |
| GET /api/bots/commands | Список объявленных команд. |
| PUT /api/bots/commands | Полная замена глобального списка команд. |
| PUT /api/bots/guilds/:guildId/commands | Полная замена списка команд для сообщества. |
| POST /api/bots/voice/join | Вход: {channel_id}. |
| POST /api/bots/voice/leave | Выход: {channel_id}, ответ 204. |
POST /api/bots/messages
{
"channel_id": 42,
"content": "Привет от бота!",
"reply_to_id": 123
}Успех отправки: 201 { message }. Без тела запроса не ставьте Content-Type: application/json: пустой JSON-запрос может вернуть 400.
Управление ботом и правами
| Авторизация аккаунтом | Действие |
|---|---|
| GET /api/bots; POST /api/bots | Список своих ботов; создание с username и необязательными полями профиля. |
| PATCH /api/bots/:id; DELETE /api/bots/:id | Изменение профиля; удаление бота вместе с его сообщениями. |
| GET /api/bots/:id/tokens; POST /api/bots/:id/tokens | Метаданные токенов; выпуск нового {name}. |
| DELETE /api/bots/:id/tokens/:tokenId | Отзыв токена. |
| POST /api/guilds/:guildId/bots | Добавление {bot_id}. |
| DELETE /api/guilds/:guildId/bots/:botId | Удаление из сообщества. |
| GET /api/guilds/:guildId/bots/:botId/permissions | Текущая маска и доступные права. |
| PUT /api/guilds/:guildId/bots/:botId/permissions | Сохранение {permissions: "114688"}; bigint передаётся строкой. |
У бота отдельная маска прав на каждом сообществе, а не обычные роли участника. Просмотр каналов — 16384, отправка сообщений — 32768, голос — 65536. Сумма этих трёх прав — 114688. Доступ администратора боту не выдаётся.
Слеш-команды
PUT /api/bots/commands
{ "commands": [
{ "name": "ping", "description": "Проверить ответ бота", "options": [] },
{ "name": "echo", "description": "Повторить текст", "options": [
{ "name": "text", "description": "Ваш текст", "type": "string", "required": true }
] }
] }Имя: 1–32 символа, a-z0-9_-. До 100 команд, до 10 параметров у команды; типы string, number, boolean, user, channel, role, до 25 вариантов choices. Описание команды — до 200 символов.
PUT заменяет весь список, поэтому отправляйте полный набор. В message:create распознанный вызов содержит command: {bot_id, name, options, args}. Проверяйте bot_id, чтобы не отвечать на команды другого бота. Отключённая или неизвестная команда приходит обычным текстом.
Выбор участника, канала и роли
Параметры типов user, channel и role человек не печатает руками — он выбирает их из списка с поиском. Боту уходит токен упоминания, а не название, поэтому переименование канала, роли или участника не ломает уже отправленный вызов.
| Тип | Что предлагается | Что уходит боту |
|---|---|---|
| user | Участники сообщества, где вызвана команда | <@id> |
| channel | Текстовые и голосовые каналы этого сообщества | <#id> |
| role | Роли этого сообщества | <@&id> |
- Поиск идёт по названию, а у участника — ещё по нику и логину.
- Служебные слова тоже работают: «голос» находит голосовые каналы, «роль» — роли, «текст» — текстовые.
- Совпадения с начала названия идут выше остальных.
- Показывается до восьми вариантов; если нужного не видно, уточните запрос.
- Enter выбирает первый вариант, стрелки двигают выделение, Esc очищает поиск, Backspace возвращает к обычному вводу.
В поле command.options приходит токен ({ "user": "<@42>" }), а в command.args — то же значение позиционным аргументом. Голый id бот тоже может принять, но в тексте ответа токен читается как обычное упоминание, а просто число — нет.
Gateway и события
wss://api.example.org/api/bots/gateway?token=<BOT_TOKEN>
{ "type": "ready", "bot_id": 7, "guilds": [1, 2] }
{ "type": "ping" }
{ "type": "pong" }События: message:create, message:update, message:delete, reaction:add, reaction:remove, interaction. Содержимое событий действий находится в data; ready передаёт bot_id и guilds в корне.
Очередь соединения ограничена 256 сообщениями. При переполнении приходят message:drop; старые события могут быть потеряны. Добавьте переподключение с задержкой, контроль pong и восстановление нужного состояния через REST. Не обещайте однократное получение каждого события.
Голос
После POST /api/bots/voice/join ответ содержит channel_id, identity и livekit. При настроенном LiveKit используйте возвращённые token и livekitUrl с совместимым клиентским SDK. При livekit: null бот только присутствует в списке, но не передаёт звук. Сам REST-запрос не начинает воспроизведение аудио.
Ошибки и эксплуатация
| Ситуация | Что делать |
|---|---|
| 400 | Проверить типы, длину полей, JSON и формат компонентов. |
| 401 | Проверить хост и токен; при отзыве остановить повторные попытки до замены токена. |
| 403 | Проверить членство и отдельные права бота на канале/сообществе. |
| 404 | Проверить адрес API и локальный идентификатор ресурса. |
| 429 | Учитывать Retry-After, если он передан, и увеличивать задержку. |
| Разрыв связи / 5xx | Переподключаться с ограниченной задержкой. Не повторять отправку вслепую: возможны дубликаты. |
Скрывайте секреты в логах, ограничивайте доступ к окружению, не отвечайте на сообщения самого бота. Согласуйте сбор данных с администратором и пользователями, определите срок хранения и способ удаления.
Голосовые каналы для ботов
Бот с отдельным правом CREATE_VOICE_CHANNELS может создавать голосовые каналы через POST /api/bots/guilds/:guildId/channels. Доступны запрос состояний через GET /api/bots/guilds/:guildId/voice-states, запрос перемещения через POST /api/bots/guilds/:guildId/voice/move и удаление пустого канала через DELETE /api/bots/channels/:channelId. Права и ограничения проверяются хостом; наличие токена само по себе не даёт эти полномочия.