Поддерживаемые возможности платформы
- Входящие события: Внешняя система POST-запрос к callback_path → преобразуется в событие OneBot12 (прозрачный проход json/text-сегментов)
- Исходящие события: Модуль Send → POST-запрос к outgoing_url (двойной мост)
- API: Мост с информацией об идентификации и статусе выполнения (минимальный набор)
Обновление парадигмы v5 (4.2.0)
- Минимальный набор DSL API: get_self_info/get_status/get_version/get_supported_actions
- Мягкая зависимость от фреймворка: При запуске проверяется наличие ErisPulse>=2.7.1 и выводится предупреждение; в логе выводится версия
- Обновлен путь импорта до Core.Bases
Описание функциональных возможностей платформы — универсальный адаптер-мост Webhook
В этом документе подробно описаны двунаправленный протокол моста, сопоставление полей и особенности реализации Webhook-адаптера.
Обзор
Webhook-адаптер является протокольным мостом, не привязанным к какой-либо конкретной платформе. Он отправляет и получает сообщения через HTTP, позволяя любому системе, способной инициировать HTTP-запросы, подключиться к ErisPulse.
Направление входящих событий Направление исходящих событий
──────── ────────
Внешняя система Модуль ErisPulse
│ │
│ POST JSON │ Send.Text(...)
▼ ▼
┌──────────────────────────────────────────────────┐
│ WebhookAdapter │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Входящие маршруты │ │ Передача исходящих │ │
│ │ GET (проверка здоровья) │ │ client.post() │ │
│ │ POST (прием событий) │ │ → outgoing_url │ │
│ └────────┬─────────┘ └────────▲─────────┘ │
│ │ │ │
│ ▼ │ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ WebhookConverter │ │ Класс Send │ │
│ │ JSON → OneBot12 │ │ Сегменты сообщений → JSON │ │
│ └────────┬─────────┘ └────────▲─────────┘ │
└───────────┼──────────────────────┼───────────────┘
▼ │
adapter.emit(event) call_api("send_message")
│ │
▼ │
Система событий ErisPulse ◄────────┘
Модель нескольких аккаунтов
Каждый аккаунт представляет собой независимую конфигурацию моста, не влияющую друг на друга:
| Аккаунт | bot_id | callback_path | outgoing_url | secret |
|---|---|---|---|---|
default |
webhook_bot |
/webhook/default |
https://a.com/recv |
key1 |
discord |
discord_bot |
/webhook/discord |
https://b.com/send |
key2 |
При запуске каждый аккаунт регистрирует маршруты и отдельно отправляет событие connect.
Входящий протокол
1. Проверка здоровья (GET)
- Путь:
{callback_path} - Метод:
GET - Аутентификация: отсутствует
- Ответ:
{"status": "ok", "account": "default"}
2. Прием событий (POST)
- Путь:
{callback_path} - Метод:
POST - Content-Type:
application/json - Аутентификация (при наличии секрета): Заголовок
X-Webhook-Secretили параметр запроса?secret=
Тело запроса
{
"user_id": "u123",
"user_nickname": "用户名",
"group_id": "群组ID(仅群组会话)",
"detail_type": "private",
"message": [
{"type": "text", "data": {"text": "消息内容"}}
],
"raw": {}
}
| Поле | Обязательно | Описание |
|---|---|---|
user_id |
Да | Идентификатор отправителя |
user_nickname |
Нет | Имя отправителя |
group_id |
Нет | Идентификатор группы/канала (если в групповом чате) |
detail_type |
Нет | Тип чата (private/group), по умолчанию используется значение по умолчанию аккаунта |
message |
Да | Массив сегментов OneBot12 |
raw |
Нет | Исходные данные, сохраняются в webhook_raw |
Ответ
{"status": "ok"}
Ошибочные ответы с HTTP-статусом:
| Статус | Значение |
|---|---|
| 400 | Неверный JSON / body не является объектом |
| 401 | Ошибка аутентификации |
| 404 | Неизвестный аккаунт |
| 500 | Ошибка распределения события |
3. Сопоставление полей (входящий JSON → событие OneBot12)
| Входящий JSON | Поле события OneBot12 | Описание |
|---|---|---|
| — | id |
Генерируется автоматически |
| — | time |
Текущий Unix-время (секунды) |
| — | type |
Фиксированное значение message |
detail_type |
detail_type |
По умолчанию используется значение по умолчанию аккаунта |
| — | platform |
Фиксированное значение webhook |
| — | self.platform |
Фиксированное значение webhook |
| — | self.user_id |
Идентификатор аккаунта bot_id |
user_id |
user_id |
Прозрачный проход |
user_nickname |
user_nickname |
Прозрачный проход (необязательно) |
group_id |
group_id |
Прозрачный проход (необязательно) |
message |
message |
Прозрачный проход |
| Полное тело | webhook_raw |
Исходный запрос |
| Имя аккаунта | webhook_account |
Аккаунт, сгенерировавший событие |
type или message |
webhook_raw_type |
Тип исходного события |
Исходящий протокол
1. Отправка сообщений
При вызове методов модуля Send.To(...).Text(...) и т.д. адаптер отправляет POST-запрос на outgoing_url:
- Метод:
POST - Content-Type:
application/json - Заголовок аутентификации (при наличии секрета):
X-Webhook-Secret: {secret}
Тело запроса
{
"target_type": "private",
"target_id": "target_user_id",
"account": "default",
"message": [
{"type": "text", "data": {"text": "消息内容"}}
],
"timestamp": 1700000000
}
| Поле | Описание |
|---|---|
target_type |
Тип цели (из Send.To(type, id)), по умолчанию используется значение по умолчанию аккаунта |
target_id |
Идентификатор цели (из Send.To) |
account |
Имя отправляющего аккаунта |
message |
Массив сегментов OneBot12 |
timestamp |
Время отправки (секунды) |
2. Стандартизация ответа
Адаптер преобразует ответ от цели в стандартный формат ErisPulse:
{
"status": "ok",
"retcode": 0,
"data": {"message_id": "...", ...},
"message_id": "...",
"message": "",
"webhook_raw": {}
}
Из JSON-ответа цели извлекается message_id. Если message_id не возвращается, значение будет пустой строкой.
При ошибке запроса возвращается ответ с status: "failed", retcode: 33001.
Методы Send
| Метод | Описание |
|---|---|
Text(text) |
Отправка текста, преобразуется в [{"type":"text","data":{"text":text}}] |
Image(file) |
Отправка изображения, преобразуется в [{"type":"image","data":{"file":file}}] |
Raw_ob12(message) |
Отправка OneBot12-сегментов |
Json(data) |
Прозрачный проход исходного JSON, преобразуется в [{"type":"json","data":{"raw":data}}] |
Модификаторы At / AtAll / Reply предоставляются базовым классом фреймворка и объединяются в сегменты сообщения через _apply_modifiers.
Расширенные методы события (WebhookEventMixin)
| Метод | Описание |
|---|---|
get_raw_data() |
Получение исходного тела запроса (webhook_raw) |
get_detail_type() |
Получение типа чата |
get_webhook_account() |
Получение имени аккаунта, сгенерировавшего событие |
Матрица функциональных возможностей
| Функция | Поддержка |
|---|---|
| Множественные аккаунты | ✅ Каждый аккаунт работает независимо |
| Входящая аутентификация | ✅ Два режима: заголовок и параметр запроса |
| Проверка здоровья | ✅ GET возвращает статус |
| Исходящая аутентификация | ✅ Заголовок с секретом |
| События OneBot12 | ✅ Полный набор стандартных полей |
| Мета-события | ✅ connect / disconnect |
| Обнаружение маршрутов | ✅ Регистрация в пространстве имен webhook |
| WebSocket | ❌ Только HTTP |
| Загрузка медиа | ❌ Только через URL, не передача двоичных данных |
Примечания
- Односторонняя отправка: Если
outgoing_urlоставлен пустым, аккаунт будет принимать только входящие события, попытка отправки сообщения вернет ошибку - Безопасность секрета:
secretхранится в конфигурации в зашифрованном виде (metadata secret), рекомендуется использовать HTTPS при передаче - Уникальность пути:
callback_pathдля нескольких аккаунтов должен быть уникальным, чтобы избежать конфликтов маршрутов - Идемпотентность: Адаптер не гарантирует уникальность входящих событий, внешняя система должна самостоятельно обрабатывать повторные запросы
- Таймаут: Исходящие запросы используют встроенный клиент ErisPulse и наследуют глобальные настройки таймаута