ErisPulse ErisPulse
Открыть интерактивную версию →
Разделы страницы
Статическое зеркало — интерактивная версия является основной Открыть интерактивную версию →

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

BilibiliAdapter — это адаптер личных сообщений Bilibili, основанный на bilibili-api-python. Поддерживает двойную авторизацию по Cookie и сканированию QR-кода, а также обмен личными сообщениями на основе событий.


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

  • Версия соответствующего модуля: 0.1.0
  • Поддержка: ErisPulse

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

  • Краткое описание платформы: Бот для личных сообщений Bilibili (без официального API для личных ботов, использует веб-интерфейс личных сообщений через эмуляцию входа)
  • Название адаптера: BilibiliAdapter
  • Поддержка нескольких аккаунтов: Поддерживается (каждый аккаунт — отдельный личный аккаунт Bilibili, независимый слушатель сессии)
  • Способ подключения: Слушание сессии на основе событий (bilibili-api Session)
  • Способ аутентификации: Cookie (SESSDATA / bili_jct / buvid3 / dedeuserid) или вход через сканирование QR-кода
  • Поддержка цепочки модификаторов: Поддерживается .Reply() и другие цепочные методы модификаторов
  • Совместимость с OneBot12: Поддерживает стандартные сегменты сообщений (text / image)

Инструкция по настройке

[BilibiliAdapter.accounts.default]
login_mode = "cookie"          # cookie=ввод凭据 / qrcode=вход через сканирование QR-кода (рекомендуется)
sessdata = "YOUR_SESSDATA"     # cookie-режим обязательно
bili_jct = "YOUR_BILI_JCT"     # cookie-режим обязательно
buvid3 = "YOUR_BUVID3"         # необязательно, снижает вероятность риска
dedeuserid = "YOUR_UID"        # необязательно, UID аккаунта
bot_id = ""                    # оставить пустым для автоматического получения после входа
enabled = true

Описание параметров (для каждого аккаунта):

  • login_mode: Способ входа. cookie — ввод凭据; qrcode — вход через сканирование QR-кода (рекомендуется).凭据 для обоих режимов в конечном итоге попадают в поля sessdata/bili_jct и т.д.
  • sessdata / bili_jct: Cookie-凭据 для сессии (обязательно для режима cookie; отображаются как пароль в панели)
  • buvid3: Cookie-凭据 для идентификации устройства (необязательно), при наличии значительно снижает вероятность риска
  • dedeuserid: UID аккаунта (необязательно), также служит источником по умолчанию для bot_id
  • bot_id: UID аккаунта, оставить пустым для автоматического получения через get_self_info после входа

Процесс входа через сканирование QR-кода: login_mode = "qrcode" после сохранения, в Dashboard → Компоненты → Настройка аккаунта выберите «Вход через сканирование Bilibili» → Сканируйте QR-код в мобильном приложении Bilibili → Подтвердите на телефоне → Адаптер опрашивает статус входа (scan → confirm → done),凭据 автоматически записываются в конфигурацию аккаунта и вступают в силу.

Адаптер также регистрирует эндпоинты POST /bilibili/qr/start (получение QR-кода, возвращает URL изображения + токен сессии) и POST /bilibili/qr/poll (опрос статуса входа). Третьи стороны могут напрямую подключаться к этим эндпоинтам. Запросы опроса должны содержать poll_token, возвращенный start, для предотвращения несанкционированного опроса.

Отправка сообщений

Все методы отправки возвращают задачу (Task), ожидание которой дает стандартный ответ (см. «Формат ответа»).

Основная отправка

from ErisPulse import sdk
bili = sdk.adapter.get("bilibili")

# Личное текстовое сообщение (target — UID получателя)
await bili.Send.To("user", "123456789").Text("Hello Bilibili!")

# Личное сообщение с изображением (URL или локальный путь, преобразуется в изображение для личных сообщений Bilibili)
await bili.Send.To("user", "123456789").Image("https://example.com/pic.jpg")
await bili.Send.To("user", "123456789").Image("./local.png")

Цепочка модификаторов

# Ответ на указанное сообщение (msg_key из message_id полученного сообщения)
await bili.Send.To("user", "123456789").Reply("msg_key").Text("Получено!")

Отправка стандартных сегментов OneBot12

message = [
    {"type": "text", "data": {"text": "Первая строка"}},
    {"type": "image", "data": {"file": "https://example.com/img.jpg"}},
]
await bili.Send.To("user", "123456789").Raw_ob12(message)

Отправка с использованием нескольких аккаунтов

await bili.Send.Using("account2").To("user", "123456789").Text("От второго аккаунта")

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

Сегмент Поддерживается Описание
text Поддерживается Сегменты объединяются и отправляются через send_msg (TEXT)
image Поддерживается file — URL или локальный путь, отправляется через send_msg (PICTURE)
reply Частично поддерживается Модификатор принимает, в личных сообщениях Bilibili нет отображения цитат, используется только для контекста отправки
mention / face / voice / video / file и др. Не поддерживается Возвращает retcode=10002 и перечисляет полученные типы сегментов

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

from ErisPulse import sdk
bili = sdk.adapter.get("bilibili")

# Информация о себе (ник/аватар/UID)
result = await bili.Api.get_self_info()

# Открытая информация о пользователе (любой пользователь, ник/аватар)
result = await bili.Api.get_user_info("123456789")

# Получение истории сообщений указанной сессии (begin_seqno для прокрутки)
result = await bili.Api.get_session_msgs("123456789", begin_seqno=0)

# Статус и версия
result = await bili.Api.get_status()
result = await bili.Api.get_version()

# Множественные аккаунты
result = await bili.Api.Using("account2").get_self_info()

Поддерживаемые стандартные действия

Метод Описание Источник данных
get_self_info() Информация о себе (mid/name/face) Web API (пространство информации)
get_user_info(user_id) Открытая информация о пользователе (ник/аватар) Web API (карточка информации пользователя)
get_session_msgs(talker_id, begin_seqno) История сообщений сессии Web API личных сообщений (session_msgs)
get_status() Статус работы адаптера Локальный
get_version() Версия адаптера Локальный

Не поддерживаемые стандартные действия

Следующие стандартные действия отсутствуют в личных сообщениях Bilibili, вызов возвращает retcode=10002:

  • get_friend_list / get_group_list / get_group_member_info
  • delete_message (в личных сообщениях Bilibili только отправитель может отозвать собственное сообщение)
  • set_group_name / leave_group и другие действия управления группами

Общий вход в действия

# send_message: отправка комбинированных текстовых и изображений сегментов (эквивалентно Send цепочке)
result = await bili.call_api(
    "send_message",
    _account_id="default",
    target_id="123456789",
    message=[{"type": "text", "data": {"text": "hi"}}],
)

Формат ответа

Все методы отправки и API следуют стандартизированной схеме ответа адаптера ErisPulse:

{
    "status": "ok",              # ok / failed
    "retcode": 0,                # 0 — успех; 10002 — не поддерживается; 10003 — параметры/цель неверны; 34000 — ошибка API Bilibili
    "data": {...},               # Данные ответа (оригинальный ответ send_msg)
    "self": {"platform": "bilibili", "user_id": "..."},
    "message_id": "123456",      # msg_key Bilibili
    "message": "",               # Сообщение об ошибке
    "bilibili_raw": {...}        # Оригинальный ответ
}

Типы событий

Необходимо использовать platform == "bilibili" для проверки и использования функций данной платформы.

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

Событие личных сообщений Bilibili Событие адаптера Описание
TEXT (текстовое сообщение) message (сегмент text) Обычное личное сообщение
PICTURE (изображение) message (сегмент image) content.pictures → сегмент image (URL)
WITHDRAW (отмена) Только логирование Пользователь отозвал сообщение

Пример полей события

{
  "id": "uuid",
  "time": 1793277000,
  "type": "message",
  "detail_type": "private",
  "platform": "bilibili",
  "self": {"platform": "bilibili", "user_id": "10000", "user_name": "Bot昵称", "account_id": "default"},
  "user_id": "123456789",                  # UID получателя (sender_uid)
  "user_nickname": "小王",                  # content.sender_name (возможно отсутствует)
  "message": [{"type": "text", "data": {"text": "Привет"}}],
  "alt_message": "Привет",
  "bilibili_raw": {...},                   # Оригинальные данные личного сообщения Bilibili
  "bilibili_raw_type": "text"              # text / picture
}

Описание дополнительных полей

  • Все специфические поля имеют префикс bilibili_ (bilibili_raw / bilibili_raw_type)
  • Полученные изображения представлены как сегмент image, data.file — URL изображения Bilibili
  • user_nickname получается из поля sender_name сообщения, в некоторых типах сообщений может отсутствовать

Примечания

  1. Bilibili не предоставляет официальный API для личных ботов: данный адаптер использует веб-интерфейс личных сообщений через эмуляцию входа, что является неофициальным методом, и интерфейс может измениться с обновлениями Bilibili
  2. Риск: частая/массовая отправка личных сообщений легко вызывает риск (временная блокировка функции личных сообщений аккаунта). Обязательно настройте ограничение частоты в модуле; наличие buvid3 снижает вероятность
  3. Истечение срока действия凭据: после истечения срока действия凭据 адаптер будет записывать ошибки в журнал, необходимо повторно войти через сканирование QR-кода или обновить凭据;凭据 отображаются как пароль в панели
  4. Ограничения личных сообщений: поддерживается только личные сообщения в формате один на один; группы подписчиков пока не поддерживаются
  5. Соблюдение правил: не используйте для рассылки спама, маркетинга и других нарушений, соблюдайте правила сообщества Bilibili