外观
早柚协议稍难
字数统计:1.2k 字
阅读时长:4 分钟
GenshinUID-core(下简称 GsCore)使用 WebSocket 与各 Bot 平台的插件(下简称插件)进行通信。
WebSocket 消息均使用 text 类型的 UTF-8 编码的 JSON,数据包结构请参阅下一节。
建立连接
插件通过连接 GsCore 的 /ws/{bot_id} 路由建立连接。其中 bot_id 应替换为 Bot 平台的名称,如 NoneBot2。
消息类型 Message
消息由 type 和 data 两部分组成
type 标识此消息的类型,目前有如下类型:
text纯文本消息markdownMD消息buttons按钮消息image图片image_size图片大小file文件at提及reply回复record音频node合并转发
此外,还有一种特殊的 log_{level} 类型,此类型仅存在于 MessageSend 包中,插件收到此消息,应按照 level 输出 data 中的内容
data 为任意类型,上方列出的类型对应的 data 如下:
text为文本内容markdown同样为文本内容(内容带MD格式)buttons是一个列表,里面可能的值为Button[]或为Button- 如果值均为
Button,则按照预先设定行列发送(例如Nonebot2-qq为默认两个按钮一行) - 如果值均为
List[Button],则要按照列表为一行形式自定义发送- 例如buttons=[[Button1,Button2], [Button3,Button4,Button5,Button6]],则需要1和2为一行,3456为一行,两行的按钮
- 如果值均为
image为一个map,内容如下type(url|file|b64) 该图片的content类型:url/本地文件/base64content(string) 该图片内容 -->
image- 在
MessageReceive中,一般为 url - 在
MessageSend中,为 base64(以base64://开头)- 如果以
link://开头,则为url - 适配器需要处理两种形式的image,防止出现core侧开启
发送图片自动转链接时无法正确发送图片
- 如果以
- 在
file为string,内容为{文件名}|{文件base64}node为Message[](不允许嵌套node)- 强烈不建议使用
node类型,因为合并转发仅QQ有该发送方式 - 而在大多数平台上,只能遍历node中的消息分步发送
- 强烈不建议使用
reply为消息 idat为被提及人的 id
上报消息
Bot 平台接收到消息时,插件应向 core 发送 MessageReceive 包进行上报。
MessageReceive 包内容如下:
bot_id(string) 聊天平台的 id,请与路由的bot_id进行区分bot_self_id(string) 机器人 id,对应聊天平台的机器人 idmsg_id(string) 消息 id,对应聊天平台的消息 iduser_type(group/direct/channel/sub_channel) 当前消息所属类型:群/私聊/频道/子频道group_id(string)- 当
user_type为group时,此字段为群号(建议群、频道、房间全部使用group) - 当
user_type为channel时,此字段为频道号(废弃) - 当
user_type为sub_channel时,此字段为子频道号(废弃) - 对于某些需要两个id确认发送目标的,建议使用
-连接- 例如米游社大别野,上报时,group_id建议为
villa_id + "-" + room_id - 然后在发送侧处理分割即可
- 例如米游社大别野,上报时,group_id建议为
- 当
user_id(string) 用户 iduser_pm(integer) 用户权限,越小越高content(Message[]) 消息正文sender(Dictionary) 发送者的一些信息(于2023/11/6加入)- 里面的字段根据平台来看不固定,但是会尽可能的提供
nickname和avatar字段,示例如下 - {'age': 0, 'area': '', 'card': '季落', 'level': '', 'nickname': '季落ξ( ✿>◡❛)✨', 'role': 'owner', 'sex': 'unknown', 'title': '', 'user_id': 3-------46, 'avater': 'http://q1.qlogo.cn/g?b=qq&nk=123456789&s=640'},
- 里面的字段根据平台来看不固定,但是会尽可能的提供
对 user_pm 的建议
user_pm 建议 >=1;
对于聊天平台身份与 Bot 框架的权限有联系的(如各聊天平台的 SDK),建议遵循下面的聊天平台身份与
user_pm的映射关系:- 对于
group:- 群主为
2 - 群管理员为
3 - 普通群员为
6 - 如果存在更低的身份,则使用更低的
user_pm
- 群主为
- 对于
channel和sub_channel:- 频道主为
2 - 当前频道的频道主为
3 - 频道管理员为
4 - 当前频道的管理员为
5 - 普通成员为
6 - 如果存在更低的身份,则使用更低的
user_pm
- 频道主为
- 对于
direct,非超级用户始终为6 - 超级用户始终为
1
- 对于
对于无直接联系的(如 Koishi.js),由高到低安排
user_pm,但有以下两条规定- 最高权限使用
1 - 普通权限使用
6
- 最高权限使用
发送消息
当插件接收到 core 发送的 MessageSend 包时,需通过 Bot 平台提供的接口,向聊天平台发送消息。
bot_id(string) 聊天平台的 id,请与路由的bot_id进行区分bot_self_id(string) 机器人 id,对应聊天平台的机器人 idmsg_id(string) 消息 id,对应聊天平台的消息 idtarget_type(string/null) 当前消息所属类型:群/私聊/频道/子频道target_id(string/null) 目标 idcontent(Message[]) 消息正文
content 中第 1 个元素为 log 类型的消息,则仅输出 log 即可