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

Документация по функциям платформы OneBot11

OneBot11Adapter — это адаптер, построенный на основе протокола OneBot V11.


Информация о документации

Основная информация

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

Адаптер был обновлен до соответствия парадигме v5 (постепенное обновление, совместимость API):

Существующие возможности (поддержка с 4.2.0): поддержка нескольких аккаунтов, стандартное сопоставление действий Api DSL (get_self_info→get_login_info и т.д.), Request DSL (одобрение/отклонение запросов от друзей/групп: event.approve() / event.reject()), EventMixin, i18n.


Стандартные действия API (DSL API)

Адаптер автоматически сопоставляет стандартные имена действий OneBot12 с именами действий OB11, что позволяет модулям использовать единый интерфейс для всех платформ:

Стандартное действие OB12 Действие OB11 Описание
get_self_info get_login_info Поля стандартизированы: user_id/user_name/user_displayname
get_user_info get_stranger_info Поля стандартизированы
delete_message delete_msg Отправка сообщения
leave_group set_group_leave Выход из группы
get_friend_list get_friend_list Имя действия совпадает, вызов прозрачно передается
get_group_info get_group_info Имя действия совпадает, вызов прозрачно передается
upload_file upload_group_file / upload_private_file Дополнительные необязательные параметры group_id/user_id, filetype автоматически определяет тип и перенаправляет на upload_group_file

Базовое использование

from ErisPulse import sdk
onebot = sdk.adapter.get("onebot11")

# Получение информации о боте
result = await onebot.Api.get_self_info()
print(result["data"]["user_id"], result["data"]["user_name"])

# Отправка сообщения
await onebot.Api.delete_message(message_id=123456)

# Загрузка файла в группу (filetype автоматически определяет тип и перенаправляет на upload_group_file)
result = await onebot.Api.upload_file(group_id=123456, file="/path/to/file.zip")

# Указание аккаунта (множественные аккаунты)
result = await onebot.Api.Using("main").get_self_info()

# Несопоставленные действия OB11 вызываются через call() (универсальный метод для расширений, таких как NapCat/Lagrange)
result = await onebot.Api.call("send_poke", group_id=123, user_id=456)

Поддерживаемые типы отправки сообщений

Все методы отправки реализованы с использованием цепочечного синтаксиса, например:

from ErisPulse.Core import adapter
onebot = adapter.get("onebot11")

# Отправка с использованием аккаунта по умолчанию
await onebot.Send.To("group", group_id).Text("Hello World!")

# Отправка с указанием конкретного аккаунта
await onebot.Send.Using("main").To("group", group_id).Text("Сообщение от основного аккаунта")

# Цепочка модификаторов: @пользователь + ответ
await onebot.Send.To("group", group_id).At(123456).Reply(msg_id).Text("Ответ на сообщение")

# @всех участников
await onebot.Send.To("group", group_id).AtAll().Text("Анонс")

Основные методы отправки

Методы управления группой

Методы, требующие указания группы через To("group", group_id), позволяют выполнять операции в контексте группы:

Методы запросов

Методы для работы с друзьями

Методы цепочечных модификаторов (можно комбинировать)

Методы цепочечных модификаторов возвращают self, позволяя использовать цепочечный вызов. Должны вызываться перед окончательным методом отправки:

Примеры цепочечных вызовов

# Базовая отправка
await onebot.Send.To("group", 123456).Text("Hello")

# @одного пользователя
await onebot.Send.To("group", 123456).At(789012).Text("Привет")

# @нескольких пользователей
await onebot.Send.To("group", 123456).At(111).At(222).At(333).Text("Всем привет")

# Отправка сообщения в формате OneBot12
ob12_msg = [{"type": "text", "data": {"text": "Hello"}}]
await onebot.Send.To("group", 123456).Raw_ob12(ob12_msg)

# Лайк
await onebot.Send.Like(123456, times=10)

# Запрет участнику отправлять сообщения
await onebot.Send.To("group", 123456).Ban(789012, duration=3600)

# Разблокировка
await onebot.Send.To("group", 123456).Ban(789012, duration=0)

# Исключение участника
await onebot.Send.To("group", 123456).Kick(789012)

# Назначение администратора
await onebot.Send.To("group", 123456).SetAdmin(789012)

# Изменение названия группы
await onebot.Send.To("group", 123456).SetGroupName("Новое название группы")

# Получение информации о группе
result = await onebot.Send.To("group", 123456).GetGroupInfo()

# Операция с указанием аккаунта
await onebot.Send.Using("main").To("group", 123456).Ban(789012)

Обработка не поддерживаемых типов

Если вызывается неопределённый метод отправки, адаптер возвращает текстовое уведомление:

# Вызов несуществующего метода
await onebot.Send.To("group", 123456).SomeUnsupportedMethod(arg1, arg2)
# Фактически отправляется: "[Неподдерживаемый тип отправки] Имя метода: SomeUnsupportedMethod, Параметры: [...]"

Операции с запросами (DSL для запросов)

Адаптер предоставляет DSL для обработки запросов от друзей и запросов в группы (вступление/приглашение), включая операции подтверждения и отклонения.

Удобные методы Event

События запросов поддерживают удобные методы event.approve() и event.reject(), которые автоматически вызывают DSL для запросов:

from ErisPulse.Core.Event import request

@request.on_friend_request()
async def handle_friend_request(event):
    comment = event.get("comment", "")

    if comment == "passphrase":
        await event.approve()
    else:
        await event.reject()

@request.on_group_request()
async def handle_group_request(event):
    group_id = event.get("group_id")
    await event.approve()

Ручной вызов DSL для запросов

# Подтверждение запроса
await onebot.Request("flag_string").accept()

# Отклонение запроса
await onebot.Request("flag_string").reject()

# Операции с указанием аккаунта
await onebot.Request("flag_string").Using("main").accept()

Полный пример

from ErisPulse.Core.Event import request

@request.on_friend_request()
async def handle_friend_request(event):
    comment = event.get("comment", "")

    # Способ 1: Использование удобных методов Event
    if comment == "passphrase":
        await event.approve()
    else:
        await event.reject()

    # Способ 2: Использование DSL для запросов
    flag = event.get("flag")
    if comment == "passphrase":
        await onebot.Request(flag).accept()
    else:
        await onebot.Request(flag).reject()

Возвращаемые значения операций с запросами

{
    "status": "ok",
    "retcode": 0,
    "data": {...},
    "message_id": "",
    "message": ""
}

Сопоставление типов событий

Стандартное сопоставление OB12

Тип OB11 Сопоставленный detail_type Описание
message_type: private private Личное сообщение
message_type: group group Групповое сообщение
request_type: friend friend Запрос на добавление в друзья
request_type: group group Запрос в группу
meta_event_type: heartbeat heartbeat Пульс
notice_type: group_upload group_file_upload Загрузка файла в группу
notice_type: group_admin group_admin_change Изменение администратора группы
notice_type: group_increase group_member_increase Увеличение числа участников группы
notice_type: group_decrease group_member_decrease Уменьшение числа участников группы
notice_type: group_ban group_ban Запрет на отправку сообщений в группе
notice_type: friend_add friend_increase Добавление друга
notice_type: friend_delete friend_decrease Удаление друга
notice_type: group_recall / friend_recall message_recall Отмена отправки сообщения

Платформо-специфичные события (префикс onebot11_)

OB11 исходный тип Сопоставленный detail_type Описание
meta_event_type: lifecycle onebot11_lifecycle Жизненный цикл реализации OneBot
notify + sub_type: honor onebot11_honor Изменение чести в группе
notify + sub_type: poke onebot11_poke Удар по человеку
notify + sub_type: lucky_king onebot11_lucky_king Король удачи в группе
Неизвестный тип CQ-кода Сообщение с типом onebot11_{type} Неизвестный CQ-код

Примеры событий

// Запрос на добавление друга
{
  "type": "request",
  "detail_type": "friend",
  "user_id": "789012",
  "comment": "Пожалуйста, добавьте в друзья",
  "request_id": "flag_abc123",
  "flag": "flag_abc123"
}

// Пульс
{
  "type": "meta_event",
  "detail_type": "heartbeat",
  "interval": 5000,
  "status": {...}
}

// Жизненный цикл (платформо-специфичный)
{
  "type": "meta_event",
  "detail_type": "onebot11_lifecycle",
  "sub_type": "enable"
}

// Удар по человеку (платформо-специфичный)
{
  "type": "notice",
  "detail_type": "onebot11_poke",
  "group_id": "123456",
  "user_id": "789012",
  "target_id": "345678"
}

// Король удачи в группе (платформо-специфичный)
{
  "type": "notice",
  "detail_type": "onebot11_lucky_king",
  "group_id": "123456",
  "user_id": "789012",
  "target_id": "345678"
}

// Изменение чести (платформо-специфичный)
{
  "type": "notice",
  "detail_type": "onebot11_honor",
  "group_id": "123456",
  "user_id": "789012",
  "honor_type": "talkative"
}

// Расширенный CQ-код
{
  "type": "message",
  "message": [
    {"type": "onebot11_shake", "data": {}}
  ]
}

Описание расширенных полей

Методы расширения событий

Адаптер OneBot11 зарегистрировал следующие специфичные для платформы методы для объектов событий, которые можно напрямую вызывать в обработчиках событий:

from ErisPulse.Core.Event import message

@message.on_message()
async def handle_message(event):
    raw_self_id = event.get_raw_self_id()
    sender_info = event.get_sender_info()
    sender_role = event.get_sender_role()

Список методов

Метод Тип возвращаемого значения Описание
get_raw_event() dict Получить полные исходные данные события OneBot11
get_raw_self_id() str Получить исходный self_id (номер QQ бота)
get_sender_info() dict Получить полную информацию о отправителе (включая nickname, role, level и т.д.)
get_sender_role() str Получить роль отправителя в группе (owner/admin/member)
get_sender_level() int Получить уровень отправителя
get_sender_title() str Получить титул отправителя в группе
is_system_message() bool Определить, является ли сообщение системным (sub_type == "system")

Примеры использования

from ErisPulse.Core.Event import message, command

@message.on_group_message()
async def handle_group(event):
    role = event.get_sender_role()
    if role == "admin" or role == "owner":
        await event.reply("Администратор, здравствуйте!")

    title = event.get_sender_title()
    if title:
        await event.reply(f"Ваш титул: {title}")

@command("whoami")
async def whoami(event):
    info = event.get_sender_info()
    nickname = info.get("nickname", "неизвестно")
    level = event.get_sender_level()
    await event.reply(f"Никнейм: {nickname}, уровень: {level}")

Параметры конфигурации

Адаптер OneBot11 использует архитектуру с несколькими аккаунтами, каждый аккаунт имеет свою отдельную конфигурацию. Ключ конфигурации — OneBotAdapter.

Поля конфигурации аккаунта

Поле Тип Обязательное Значение по умолчанию Описание
bot_id str Да "" QQ-номер бота, используется для идентификации аккаунта
mode str Нет "server" Режим работы: "server" (активный режим ожидания) или "client" (активное подключение)
url str Нет "ws://127.0.0.1:3001" Адрес WebSocket для режима Client
token str Нет "" Токен аутентификации (токен для подключения в режиме Client / токен проверки в режиме Server)
server_path str Нет "/" Путь WebSocket для режима Server
enabled bool Нет true Включён ли этот аккаунт
name str Нет "" Заметка к аккаунту

Встроенные значения по умолчанию

Пример конфигурации

[OneBotAdapter.accounts.main]
bot_id = "123456789"
mode = "server"
server_path = "/onebot-main"
token = "main_token"
enabled = true

[OneBotAdapter.accounts.backup]
bot_id = "987654321"
mode = "client"
url = "ws://127.0.0.1:3002"
token = "backup_token"
enabled = true

[OneBotAdapter.accounts.test]
bot_id = "111222333"
mode = "client"
url = "ws://127.0.0.1:3003"
enabled = false

Конфигурация по умолчанию

Если не настроены никакие аккаунты, адаптер автоматически создаст следующую конфигурацию:

[OneBotAdapter.accounts.default]
bot_id = ""
mode = "server"
server_path = "/"
enabled = true

Возвращаемые значения методов отправки

Все методы отправки возвращают объект Task, который можно напрямую ожидать для получения результата отправки. Результат возвращается в соответствии со стандартизированным форматом ErisPulse-адаптера:

{
    "status": "ok",
    "retcode": 0,
    "data": {...},
    "message_id": "123456",
    "message": "",
    "onebot11_raw": {...}
}

Синтаксис отправки с несколькими аккаунтами

# Метод выбора аккаунта
await onebot.Send.Using("main").To("group", 123456).Text("Сообщение от основного аккаунта")
await onebot.Send.Using("backup").To("group", 123456).Image("http://example.com/image.jpg")

# Выбор аккаунта по bot_id
await onebot.Send.Using("123456789").To("group", 123456).Text("Выбор по номеру QQ")

# Вызов API
await onebot.call_api("send_msg", account_id="main", group_id=123456, message="Hello")

Приоритет разрешения аккаунта

Приоритет разрешения параметра account_id в call_api и Using():

  1. Точное совпадение имени аккаунта
  2. Совпадение по полю bot_id
  3. Совпадение по любому строковому полю аккаунта
  4. Возврат к первому включенному аккаунту

Асинхронная обработка

Адаптер OneBot11 использует асинхронную неблокирующую модель, что обеспечивает:

  1. Отправка сообщений не блокирует цикл обработки событий
  2. Множественные операции отправки могут выполняться одновременно
  3. API-ответы могут обрабатываться вовремя
  4. Соединение WebSocket остается активным
  5. Параллельная обработка нескольких аккаунтов, каждый аккаунт работает независимо

Обработка ошибок

Адаптер предоставляет комплексную систему обработки ошибок:

  1. Автоматическое повторное подключение при сетевых сбоях (поддерживается независимое повторное подключение для каждого аккаунта с интервалом 30 секунд)
  2. Обработка тайм-аутов вызова API (фиксированный тайм-аут 30 секунд)
  3. Автоматическая повторная попытка подключения при сбоях с заданным интервалом

Расширенная обработка событий

В режиме нескольких аккаунтов все события автоматически сопровождаются информацией об аккаунте:

{
    "type": "message",
    "detail_type": "private",
    "self": {"user_id": "123456789", "platform": "onebot11"},
    "platform": "onebot11",
    // ... другие поля события
}

Адаптер автоматически поддерживает отображение self_id → account_name, и event.reply() не требует ручного указания аккаунта для корректного маршрутизирования к исходному аккаунту.

Управление интерфейсом

# Получение информации обо всех аккаунтах
accounts = onebot.accounts

# Проверка статуса подключения аккаунтов
connection_status = {
    account_id: connection is not None and not connection.closed
    for account_id, connection in onebot.connections.items()
}

# Динамическое включение/отключение аккаунта (требуется перезапуск адаптера)
onebot.accounts["test"].enabled = False

Автоматическое сопоставление self_id

Адаптер автоматически устанавливает сопоставление между self_id OneBot (номером QQ) и account_name, которое используется для маршрутизации событий:

# Адаптер выполняет это автоматически
# При получении события поле self.user_id заполняется значением bot_id
# Адаптер автоматически записывает: self_id("123456789") → account_name("main")

# Поэтому event.reply() может автоматически найти правильный аккаунт для отправки сообщения
@message.on_message()
async def handler(event):
    await event.reply("Автоматически маршрутизировано к правильному аккаунту")