简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

Поддерживаемые возможности платформы


Обновление парадигмы v5 (4.2.0)


Описание функциональных возможностей платформы — универсальный адаптер-мост 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)

{"status": "ok", "account": "default"}

2. Прием событий (POST)

Тело запроса

{
  "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:

Тело запроса

{
  "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, не передача двоичных данных

Примечания

  1. Односторонняя отправка: Если outgoing_url оставлен пустым, аккаунт будет принимать только входящие события, попытка отправки сообщения вернет ошибку
  2. Безопасность секрета: secret хранится в конфигурации в зашифрованном виде (metadata secret), рекомендуется использовать HTTPS при передаче
  3. Уникальность пути: callback_path для нескольких аккаунтов должен быть уникальным, чтобы избежать конфликтов маршрутов
  4. Идемпотентность: Адаптер не гарантирует уникальность входящих событий, внешняя система должна самостоятельно обрабатывать повторные запросы
  5. Таймаут: Исходящие запросы используют встроенный клиент ErisPulse и наследуют глобальные настройки таймаута