跳转至

OneBot v12 适配

v12还未启用

v12目前的实现还未经验证, 代码中暂时未启用

OneBot v12

Action 状态 说明
get_supported_actions 获取支持的 action。
get_latest_events 获取 adapter 内最近缓存的事件。
get_status 返回在线状态。
get_version 返回 app / 协议版本信息。
send_message 发送私聊或频道消息。
delete_message 撤回消息。
recall_message delete_message 别名。
delete_msg delete_message 兼容别名。
get_self_info 获取当前 bot 信息。
get_user_info 获取用户信息。
get_friend_list 获取好友/私聊相关列表。
get_guild_info 获取 Oopz area 信息。
get_guild_list 获取 Oopz area 列表。
set_guild_name 设置 area 名称。
get_guild_member_info 获取 area 成员信息。
get_channel_info 获取频道信息。
get_channel_list 获取频道列表。
set_channel_name 设置频道名称。
get_channel_member_info 获取频道成员信息。
get_channel_member_list 获取频道成员列表。
cleanup_message_mapping 清理旧 message mapping。

主要文件

文件 职责
adapter.py v12 action 注册、调用 Oopz service、保存消息映射、事件广播。
event.py Oopz Event 转 OneBot v12 Event。
message.py Oopz 消息段与 v12 消息段互转。
types.py v12 response、消息映射、时间解析、参数校验。
server.py v12 server 兼容导出。

self 信息

v12 使用 self 对象标识当前机器人:

{
  "platform": "oopz",
  "user_id": "OOPZ_SELF_UID"
}

对应配置:

from oopz_sdk import OneBotV12Config

onebot_v12 = OneBotV12Config(
    enabled=True,
    platform="oopz",
    self_id="OOPZ_SELF_UID",
)

如果 self_id 为空,会使用 OopzConfig.person_uid

消息事件

频道消息:

{
  "type": "message",
  "detail_type": "channel",
  "message_id": "oopz:xxxxxxxxxxxxxxxxxxxxxxxx",
  "guild_id": "OOPZ_AREA_ID",
  "channel_id": "OOPZ_CHANNEL_ID",
  "user_id": "OOPZ_USER_UID",
  "message": [
    {"type": "text", "data": {"text": "hello"}}
  ],
  "alt_message": "hello"
}

私聊消息:

{
  "type": "message",
  "detail_type": "private",
  "message_id": "oopz:xxxxxxxxxxxxxxxxxxxxxxxx",
  "user_id": "OOPZ_USER_UID",
  "message": [
    {"type": "text", "data": {"text": "hello"}}
  ],
  "alt_message": "hello"
}

发送频道消息

{
  "action": "send_message",
  "params": {
    "detail_type": "channel",
    "guild_id": "OOPZ_AREA_ID",
    "channel_id": "OOPZ_CHANNEL_ID",
    "message": [
      {"type": "text", "data": {"text": "hello"}}
    ]
  }
}

返回:

{
  "status": "ok",
  "retcode": 0,
  "data": {
    "message_id": "oopz:xxxxxxxxxxxxxxxxxxxxxxxx",
    "time": 1777629501.0,
    "original_message_id": "OOPZ_ORIGINAL_MESSAGE_ID"
  }
}

发送私聊消息

{
  "action": "send_message",
  "params": {
    "detail_type": "private",
    "user_id": "OOPZ_USER_UID",
    "message": "hello"
  }
}

回复消息

v12 reply 消息段里的 message_id 应传 OneBot adapter 返回或事件上报的内部 message_id

{
  "action": "send_message",
  "params": {
    "detail_type": "channel",
    "guild_id": "OOPZ_AREA_ID",
    "channel_id": "OOPZ_CHANNEL_ID",
    "message": [
      {"type": "reply", "data": {"message_id": "oopz:xxxxxxxxxxxxxxxxxxxxxxxx"}},
      {"type": "text", "data": {"text": "收到"}}
    ]
  }
}

adapter 会通过 SQLite 映射找回 Oopz 原始 messageId,再作为 reference_message_id 发送。

撤回消息

{
  "action": "delete_message",
  "params": {
    "message_id": "oopz:xxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

如果映射存在,adapter 会自动选择:

  • 私聊:recall_private_message
  • 频道:recall_message

如果映射不存在,也可以传 Oopz 原始 message ID 和频道上下文作为 fallback:

{
  "action": "delete_message",
  "params": {
    "message_id": "OOPZ_ORIGINAL_MESSAGE_ID",
    "guild_id": "OOPZ_AREA_ID",
    "channel_id": "OOPZ_CHANNEL_ID"
  }
}

消息段支持

v12 segment 发送到 Oopz 时的处理
text 纯文本。
mention / at 转为 Oopz mention 文本与 mention_list
mention_all / at_all 转为全体提及。
reply 读取 message_id,作为 reference_message_id
image 支持本地文件、Oopz file_key、带 URL 的图片资源。
其他类型 降级为文本占位,避免静默丢消息。

图片示例:

[
  {"type": "text", "data": {"text": "图片:"}},
  {"type": "image", "data": {"file_id": "file:///tmp/a.png"}}
]

也可以直接使用 Oopz 上传后的 file_key

[
  {"type": "image", "data": {"file_id": "OOPZ_FILE_KEY", "url": "https://..."}}
]