latestMemberList接口数据有误,最后发言时间实为加群时间且缺失该数据,且未将刷新的数据更新至Mirai内部缓存
-
https://github.com/mamoe/mirai/issues/2883
Mirai版本:2.14.0-RC
mirai-api-http版本:v2.9.1
MCL Addon版本:v2.0.2
iTXTech MCL Version: 2.0.1-b5303b5
protocol: IPAD
heartbeatStrategy: STAT_HB
无签名,通过密码自动登录,无验证码一直通过WebSocket API调用,业务端有一项功能是末位淘汰,在出现 #2882 (26日开始无法接收成员退群事件) 的问题之后,由于业务逻辑中也有一份成员列表缓存,本就有定期刷新成员列表的逻辑,于是尝试将原先调用的
memberList
接口换成latestMemberList
接口,结果发现末位淘汰前的排名前列通知功能全重新通知了一遍,说明整个列表排名全部变了,检查获取到的数据发现返回数据中所有成员的lastSpeakTimestamp
都完全与joinTimestamp
相同,实为joinTimestamp
。复现
zyjson版本:2.5
调用方法:创建消息基础 (当前消息, 真) 添加获取群员列表 (当前消息, 群号, 真) ' 在这里置入获取指令 当前echo = 添加echo等待队列 (全局echo队列, 当前消息, 3, 18000, 群号) 发送WebSocket (当前连接ID, 编码_Ansi到Utf8 (当前消息.到文本 ())) 从echo队列等待echo出现 (全局echo队列, 当前echo, 100, 20000)
相关代码:
.子程序 添加获取群员列表 .参数 输入json, zyJsonValue, 参考 .参数 目标群, 长整数型 .参数 禁用缓存, 逻辑型 .如果 (禁用缓存) 输入json.置文本 (“command”, “latestMemberList”) 输入json.置长整数 (“content.memberIds[0]”, 0) 输入json.移除成员 (“content.memberIds”, 0) .否则 输入json.置文本 (“command”, “memberList”) .如果结束 输入json.置长整数 (“content.target”, 目标群)
返回数据截取(已脱敏并格式化):
{ "id": [QQ1], "memberName": "[昵称1]", "specialTitle": "", "permission": "MEMBER", "joinTimestamp": 1744682346, "lastSpeakTimestamp": 1744682346, "muteTimeRemaining": 0, "group": { "id": [群号], "name": "[群名]", "permission": "ADMINISTRATOR" } }, { "id": [QQ2], "memberName": "[昵称2]", "specialTitle": "", "permission": "MEMBER", "joinTimestamp": 1739181298, "lastSpeakTimestamp": 1739181298, "muteTimeRemaining": 0, "group": { "id": [群号], "name": "[群名]", "permission": "ADMINISTRATOR" } }, { "id": [QQ3], "memberName": "[昵称3]", "specialTitle": "", "permission": "MEMBER", "joinTimestamp": 1741005585, "lastSpeakTimestamp": 1741005585, "muteTimeRemaining": 0, "group": { "id": [群号], "name": "[群名]", "permission": "ADMINISTRATOR" } }
网络日志
[0m2025-06-14 21:52:49 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:51 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m [0m2025-06-14 21:52:51 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)[0m [0m2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq[0m
-
目前是把业务逻辑中定期刷新成员列表的部分改成了先调用
latestMemberList
,忽略返回的数据不做处理(但愿能刷新Mirai那边的缓存),等待其完成后调用原本使用的memberList
接口来刷新业务逻辑中的成员列表缓存,希望能用吧。 -
在群员列表已因退群出现虚高后触发先前的逻辑(先调用
latestMemberList
后调用memberList
)后,人数依然为虚高人数,并不是实际人数,有可能是latestMemberList
在刷新群员列表时未更新mirai内部缓存。
看来还是得改,目前打算把半异步改同步,做个Adapter依照latestMemberList
数据填入memberList
的时间传回原逻辑。