Skip to content

Gensokyo API 介绍

标准 OneBot V11 API

以下 API 符合 OneBot V11 标准

Action文件场景行为
send_msgsend_msg.go私聊 (C2C) / q群 (Group Chat) / q頻 (QQ Guild)按 echo/msgType 缓存和 ID 映射分流到对应发送处理器。
send_msg_asyncsend_msg_async.gosend_msg注册到 HandleSendMsg,处理逻辑同 send_msg
send_group_msgsend_group_msg.goq群 (Group Chat)发送消息,支持 Gensokyo 的消息解析和 ID 转换。
send_group_msg_asyncsend_group_msg_async.goq群 (Group Chat)注册到 HandleSendGroupMsg,处理逻辑同 send_group_msg
send_group_msg_rawsend_group_msg_raw.goq群 (Group Chat)发送消息,保留更多原始参数,少做预处理。
send_private_msgsend_private_msg.go私聊 (C2C)发送 C2C 私聊消息。
send_private_msg_asyncsend_private_msg_async.go私聊 (C2C)注册到 HandleSendPrivateMsg,处理逻辑同 send_private_msg
delete_msgdelete_msg.go私聊 (C2C) / q群 (Group Chat) / q頻 (QQ Guild)按消息所属场景调用对应撤回接口。
get_login_infoget_login_info.go-获取当前机器人登录信息。
get_friend_listget_friend_list.go私聊 (C2C)获取好友列表。
get_group_listget_group_list.goq群 (Group Chat)获取列表。
get_group_infoget_group_info.goq群 (Group Chat) / q頻 (QQ Guild)按 ID 映射返回目标信息。
get_group_member_infoget_group_member_info.goq群 (Group Chat)获取成员信息。
get_group_member_listget_group_member_list.goq群 (Group Chat)获取成员列表。
get_statusget_status.go-获取运行状态。
get_version_infoget_version_info.go-获取版本信息。
get_online_clientsget_online_clients.go-获取在线客户端。
send_group_forward_msgsend_group_forward_msg.goq群 (Group Chat)发送合并转发消息。
set_group_banset_group_ban.goq群 (Group Chat)单人禁言。
set_group_whole_banset_group_whole_ban.goq群 (Group Chat)全员禁言。
.handle_quick_operationhandle_quick_operation.go-OneBot 快速操作。
.handle_quick_operation_asynchandle_quick_operation_async.go-OneBot 快速操作的 async action 名称。
mark_msg_as_readmark_msg_as_read.go-标记消息已读。

delete_msg 差异说明: QQ 官方 API 的撤回需要 message_id 及对应的 user_id/group_id/channel_id/guild_id 来定位消息所属场景。

参数类型说明
message_idint32消息 ID
user_idint64/string私聊 (C2C) 时需要
group_idint64/stringq群 (Group Chat) 时需要
channel_idint64/stringq頻 (QQ Guild) 子频道消息时需要
guild_idint64/stringq頻 (QQ Guild) 私信时需要

q頻 (QQ Guild) 扩展 API

Action文件场景行为
send_guild_channel_msgsend_guild_channel_msg.goq頻 (QQ Guild)向指定子频道发送消息。
send_guild_channel_forumsend_guild_channel_forum.goq頻 (QQ Guild)向论坛/帖子入口发送内容。
send_guild_private_msgsend_guild_private_msg.goq頻 (QQ Guild)已废弃,使用 send_private_msg
get_guild_listget_guild_list.goq頻 (QQ Guild)获取列表。
get_guild_channel_listget_guild_channel_list.goq頻 (QQ Guild)获取子频道列表。
get_guild_service_profileget_guild_service_profile.goq頻 (QQ Guild)获取服务信息。

Gensokyo 扩展 API

Action文件场景行为
get_avatarget_avatar.go-按虚拟用户 ID 反查 OpenID 并返回头像直链。
get_robot_share_linkget_robot_share_link.go-获取机器人资料页分享链接。
put_interactionput_interaction.goq群 (Group Chat) / q頻 (QQ Guild)回复按钮交互结果。
send_private_msg_wakeupsend_private_msg_wakeup.go私聊 (C2C)发送 is_wakeup=true 的 C2C 召回消息。
send_private_msg_ssesend_private_msg_sse.go私聊 (C2C)SSE 私聊消息。
get_group_banset_group_ban.goq群 (Group Chat)兼容入口,处理逻辑等同 set_group_ban
get_group_whole_banset_group_whole_ban.goq群 (Group Chat)兼容入口,处理逻辑等同 set_group_whole_ban
send_to_groupsend_group_msg.goq群 (Group Chat)send_group_msg 别名。
delete_group_msgdelete_group_msg.goq群 (Group Chat)撤回群内指定用户或 Bot 自身的消息;支持自动查找最后一条消息。

消息事件扩展字段

to_me 字段

Gensokyo 在 q群 消息事件中增加了 to_me 字段,标识消息是否 @ 了机器人。

json
{
    "group_id": 123456,
    "message": [...],
    "to_me": true,   // 本版新增
    "user_id": 789012,
    ...
}

取值逻辑:

  • GROUP_AT_MESSAGE_CREATE(@消息事件)→ to_me: true 始终为 true
  • GROUP_MESSAGE_CREATE(普通 q群 消息事件)→ 检测 Mentions 中是否有 IsYou=true,有为 true,否则为 false

nonebot2 获取方式:

python
from nonebot import on_message
from nonebot.adapters.onebot.v11 import GroupMessageEvent

@on_message().handle()
async def handler(event: GroupMessageEvent):
    # 直接通过 event.to_me 获取
    if event.to_me:
        await event.finish("你@我了")

或者通过 raw event 获取:

python
event.json()  # 查看完整字段

非自身 @ 处理

GROUP_MESSAGE_CREATE(普通 q群 消息)中,若内容包含对其他用户/机器人的 @,Gensokyo 会自动将原始 <@OpenID> 替换为标准的 [CQ:at,qq=虚拟ID] 格式,并建立 OpenID 与虚拟 ID 的映射。

这是一种 双向转换

入站(QQ API → 后端):
  QQ API:   <@B1FE88...> 贴贴
  后端收到: [CQ:at,qq=713011248] 贴贴

出站(后端 → QQ API):
  后端发送 [CQ:at,qq=713011248] 贴贴
  QQ API:   <@!B1FE88...> 贴贴

规则:

  • 入站 @bot 从 content 中剥离(to_me = true
  • 入站 @其他人 转为 [CQ:at,qq=虚拟ID]
  • 出站 [CQ:at,qq=数字] 转为 <qqbot-at-user id="OpenID" />(仅 Markdown 消息,普通文本不转换)
  • q群 纯文本出站消息中 @ 可能不渲染(QQ API 限制)

Markdown 中的 @ 能力

在 Markdown 卡片(msg_type=2)内容中嵌入 [CQ:at,qq=数字],Gensokyo 会自动将其转换为 QQ API 的 <qqbot-at-user> 标签。

nonebot2 示例:

python
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Bot, Event, Message

@on_command("md_at").handle()
async def _(bot: Bot, event: Event):
    md_content = f"你好 [CQ:at,qq={event.user_id}],欢迎使用!"
    md_seg = {"type":"markdown","data":{"data":md_content}}
    await bot.send(event, Message(md_seg))

Sender.Nickname 自动填充

Gensokyo 在群消息和私聊消息中,当 card_nick 配置为空时,会自动从 QQ API 返回的 data.Author.Username 中提取用户名填充到 event.sender.nickname

json
{
    "sender": {
        "nickname": "NIKO",   // 自动从 Author.Username 获取
        "user_id": 123456789,
        ...
    }
}

优先顺序:card_nick 配置 > Author.Username > 空

Sender.Role 身份标识

群消息中 sender.role 字段会优先使用 QQ API 返回的 member_role,不再仅依赖 master_id 配置。

json
{
    "sender": {
        "user_id": 10000001,
        "role": "owner",
        "nickname": "群主"
    }
}

取值:

  • owner → 群主
  • admin → 管理员
  • member → 普通群员

API 未返回时回退到 master_id 配置判断,保持兼容。详见本版新增功能

基于 MIT 协议开源发行