消息
- 各平台的消息类型及字段均不同,微信是 XML,其他是 JSON,同时其中的字段也存在差异
- 消息回复时调用的方式也不同,有些是直接回复,有些需要调用 API,且调用时参数各异
- 需要一个统一的消息模型便于多平台消息的汇总、处理以及统一的指令格式调用
属性说明
- num
- 消息唯一序号
- platform
- 消息来源平台,包括 LR5921,LR232,WECHAT,BILI
- evnet
- 触发事件,包括处理、发送
- 消息进入 msg_process 的处理逻辑,判断是调用指令匹配、发送函数还是其他的内容
- 保留扩展可能,如游戏、匹配
- kind
- 消息种类,包含接收、添加、删除等接收类型,以及发送、消息获取等发送类型,详见下方
- seq
- 消息原始 ID,用于事件回复(LR232,WECHAT)、消息获取(LR5921)等
- 其中 LR232 是字母数字混合,其他的为纯数字
- 可为空(某些事件没有消息序号)
- content
- 消息内容,初始化时统一转换成消息段列表,详见下方
- 可为空(某些事件没有消息内容)
- user
- 消息发送者,私聊中为好友,群聊中为群成员
- 其中 LR232 和 WECHAT 是字母数字组合,其他的为纯数字
- 可为空(某些发送事件不需要 user 属性)
- group
- 消息发送群
- LR232 为字母数字组合,LR5921 是纯数字
- 可为空(私聊没有 group 属性)
消息处理流程
- 后端接收到原始数据
- 在 xx_receive 中格式化并创建消息
- 消息创建后自动投入消息池、消息队列
- 在消息队列中根据触发事件判断
- 处理:根据消息种类、用户、群组、内容等判断对应指令
- 在 logic.command 中执行对应指令
- 进行 logic.data 中的数据操作(修改数据库、保存文件等)
- 生成新的消息(一般为发送事件的消息)
- 在 logic.command 中执行对应指令
- 发送:调用消息发送函数
- 调用对应的 xx_dispatch 函数
- 处理:根据消息种类、用户、群组、内容等判断对应指令
消息格式
msg.kind
消息接收格式
| 消息类型/平台 | 参数说明 | LR5921 私聊 | LR232 私聊 | BILI | LR5921 群聊 | LR232 群聊 | |
|---|---|---|---|---|---|---|---|
| 接收 | 无 | √ | √ | √ | √ | √ | √ |
| 添加 | 无 | √ | √ | √ | √ | √ | 不处理 |
| 删除 | 无 | x | 不处理 | 不处理 | x | 不处理 | 不处理 |
| 撤回 | xx 撤回了 xx 的消息 | √ | √ | √ | x | √ | x |
| 戳戳 | xx x了x xx 的xx | √ | x | x | x | √ | x |
| 回应 | [表情:xx] | x | x | x | x | √ | x |
| 设精 | xx 给 xx 的消息设置了精华 | x | x | x | x | √ | x |
消息发送格式
其中 /n 代表'可为空',即 xx=None
| 函数/平台 | 参数说明 | LR5921 私聊 | LR232 私聊 | BILI | LR5921 群聊 | LR232 群聊 | |
|---|---|---|---|---|---|---|---|
| 发送 | dispatch(content(其他/n),kind,user,group,num,seq,order) | √ | √ | √ | √ | √ | √ |
| 添加发送 | dispatch(content(其他/n),kind,user,group,num,seq,order) | x | √ | x | x | x | √ |
| 消息获取 | msg_get(seq,num/n, user/n) | √ | x | √ | x | √ | x |
| 文件上传 | file_upload(file,type/n,url/n,record/n) | x | √ | √ | √ | x | √ |
| 文件下载 | file_download(file,path) | √ | x | x | √ | √ | x |
| 撤回 | withdraw(seq,user/n,kind/n) | √ | √ | √ | x | √ | √ |
| 签名 | signature(sign) | √ | x | x | √ | x | x |
| 昵称 | nickname(num,user) | √ | x | x | √ | x | x |
- 其中 LR232 发送可把 event 设置为
发送1,2等等,可自动传入 order
单个:
-
BILI
- 直播开启 live_start(num)
- 直播标题 live_title(title,file/n),可使用
标题|封面路径或标题 - 直播公告 live_notice(notice)
- 直播关闭 live_stop()
- 粉丝获取 fan_get()
- 用户视频 user_video(num,mid)
- 用户合集 user_colletion(num,mid,collection,sort) 使用
合集号|true/false - 搜索 search(num,keyword,type/n) 使用
搜索项|bili_user或搜索项 - 视频下载 bv_download(num,bv)
- cid cid(av/n,bv/n) 使用
av|av号或bv|bv号
-
LR5921
- 状态 status(state/n, battery_status/n, emoji/n, word/n),可使用
自定义|表情|文字或者状态|电量 - 成员 member(num,group)
- 签到 sign_in(group)
- 回应 echo(seq,emoji)
- 精华 essence(id,content/n)
- 头衔 title(user,group,title)
- 状态 status(state/n, battery_status/n, emoji/n, word/n),可使用
消息字段
- 消息字段 content 格式为 json 列表
- 使用 onebot-11 的消息段类型
- 表格中加粗的为匹配字段
接收类型
| 类型/数据类型 | 格式 | text | id | result | summary | file | url | other | |
|---|---|---|---|---|---|---|---|---|---|
| text | 文本 | 文本 | |||||||
| face | [表情:xx] | 表情 | 显示时转文字 | ||||||
| at | [at:xx] | ||||||||
| rps | [猜拳:xx] | 1,2,3 | 显示时1:布2:剪刀3:石头 | ||||||
| dice | [骰子:xx] | 点数 | |||||||
| reply | [回复:xx] | content:消息列表 | |||||||
| forward | [转发:xx] | content.message:消息列表 | |||||||
| poke | [戳戳] | 种类 | type | ||||||
| image | [动画表情:xx] | 概括 | 文件名 | 下载链接 | key,emoji_id,emoji_package_id(LR5921) | ||||
| image | [动画表情:xx] | 概括 | (LR232) | ||||||
| image | [动画表情:动画表情] | 概括 | 文件名 | 下载链接 | file_size,width,height (LR232) | ||||
| image | [动画表情:xx] | 概括 | 文件名 | 下载链接 | sub_type,file_size(LR5921) | ||||
| image | [动画表情:xx] | 概括 | raw(WECHAT) | ||||||
| image | [动画表情:xx] | 概括 | (BILI) | ||||||
| image | [图片:xx] | 概括 | 文件名 | 下载链接 | sub_type,file_size(LR5921) | ||||
| image | [图片:xx] | 文件名 | 下载链接 | file_size,width,height(LR232) | |||||
| image | [图片:xx] | 文件名 | 下载链接 | original,size,width,height(BILI) | |||||
| image | [图片:xx] | 文件名 | 下载链接 | (WECHAT) | |||||
| record | [语音:xx] | 文件名 | 下载链接 | path,file_size(LR5921) | |||||
| record | [语音:xx] | 文件名 | 下载链接 | file_size,width,height(LR232) | |||||
| record | [语音:xx] | 文件名 | (WECHAT) | ||||||
| video | [视频:xx] | 文件名 | 下载链接 | file_size(LR5921) | |||||
| video | [视频:xx] | 文件名 | (WECHAT) | ||||||
| file | [文件:xx] | 文件名 | file_id,file_size(LR5921) | ||||||
| file | [文件:xx] | 文件名 | url,size,width,height(LR232) | ||||||
| json | [卡片:xx] | data(prompt) |
- 注:表情分为普通的 ascii 表情,各平台均显示在文本中;以及带 id 的 QQ 表情,解析为"表情";其他的,包括 QQ 的商城表情、自定义表情,微信的 emoji 表情,B 站的各类表情包,全部解析为"动画表情"
发送类型
| 类型/数据类型 | 格式 | text | id | result | summary | file | url | other | |
|---|---|---|---|---|---|---|---|---|---|
| text | 文本 | 文本 | |||||||
| face | [表情:xx] | 表情 | 表情列表中的表情中文 | ||||||
| at | [at:xx] | ||||||||
| rps | [猜拳:xx] | 布,剪刀,石头 | |||||||
| dice | [骰子:xx] | 点数 | |||||||
| reply | [回复:xx] | 消息 id | |||||||
| forward | [转发:xx] | 消息 id | |||||||
| node | [节点:xx] | user_id, nickname, content(LR5921) | |||||||
| poke | [戳戳] | 种类 | type(LR5921) | ||||||
| mface | [动画表情:xx] | 概括 | name(LR5921) | ||||||
| image | [动画表情:xx] | 概括 | 文件名 | (LR5921) | |||||
| image | [动画表情:xx] | 概括 | (BILI) | ||||||
| image | [图片:xx] | 文件名 | (LR5921/232/BILI/WECHAT) | ||||||
| record | [语音:xx] | 文件名 | |||||||
| video | [视频:xx] | 文件名 | (LR5921/232) | ||||||
| video | [视频:xx] | 文件名 | title.description(WECHAT) | ||||||
| file | [文件:xx] | 文件路径 | (LR5921) | ||||||
| file | [文件:xx] | 文件路径 | name(LR5921) | ||||||
| json | [卡片:xx] | data(prompt) |
- 注:发送时只要消息内容遵循格式,自动转换
- 动画表情中可以使用 [动画表情:概括|名称] 的形式发送,系统会根据表情配置自动把名称解析成对应的字段并以 mface 格式发送
- 动画表情也可以使用 [动画表情:概括|文件] 的形式发送,不在表情配置时会自动以 image 带文件形式发送
- 视频在 wechat 可以用[视频:文件|标题|描述]的形式发送
- 文件可以用[文件:路径]或者[文件:路径|名称]的形式发送,会自动解析
- 卡片在 wechat 可以用[卡片:介绍|标题|描述|音乐链接]的形式发送,或者[卡片:介绍|标题|描述|链接|封面链接]的形式发送,链接必须可访问
- 节点为:[节点:id|用户名|内容],内容为消息格式,可以为除转发外所有消息格式,同时可以是多种消息格式合并,如 文本[表情:xx],[节点:][节点:] 等等