MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    latestMemberList接口数据有误,最后发言时间实为加群时间且缺失该数据,且未将刷新的数据更新至Mirai内部缓存

    BUG反馈
    1
    3
    24
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • W
      WGzeyu 最后由 WGzeyu 编辑

      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"
      		}
      	}
      

      网络日志

      2025-06-14 21:52:49 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:50 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:50 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:51 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      2025-06-14 21:52:51 V/Net [QQ号]: Send: friendlist.GetTroopMemberListReq(friendlist.GetTroopMemberListReq)
      2025-06-14 21:52:51 V/Net [QQ号]: Recv: friendlist.GetTroopMemberListReq
      
      WGzeyu created this issue in mamoe/mirai

      open latestMemberList接口数据有误,最后发言时间实为加群时间且缺失该数据,且未将刷新的数据更新至Mirai内部缓存 #2883

      1 条回复 最后回复 回复 引用 0
      • W
        WGzeyu 最后由 编辑

        目前是把业务逻辑中定期刷新成员列表的部分改成了先调用latestMemberList,忽略返回的数据不做处理(但愿能刷新Mirai那边的缓存),等待其完成后调用原本使用的memberList接口来刷新业务逻辑中的成员列表缓存,希望能用吧。

        1 条回复 最后回复 回复 引用 0
        • W
          WGzeyu 最后由 编辑

          在群员列表已因退群出现虚高后触发先前的逻辑(先调用latestMemberList后调用memberList)后,人数依然为虚高人数,并不是实际人数,有可能是latestMemberList在刷新群员列表时未更新mirai内部缓存。
          看来还是得改,目前打算把半异步改同步,做个Adapter依照latestMemberList数据填入memberList的时间传回原逻辑。

          1 条回复 最后回复 回复 引用 0
          • 1 / 1
          • First post
            Last post
          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact