OpenShamrock
OpenShamrock copied to clipboard
bug: 在 QQ 版本 9.0.70+ 下发送消息会导致 QQ 闪退
警告: 在进一步操作之前,请检查下列选项。如果您忽视此模板或者没有提供关键信息,您的 Issue 将直接被关闭。
- 确保您使用的是 最新开发版本 的 Shamrock.
- 确保您的问题尚未在 Issues 列表中提出.
- 确保您的问题不是由于您的代码错误导致的.
描述 Bug
通过支持 Onebot 协议的机器人向 OpenShamrock 发送纯文本消息请求时,消息不但发不出去,还会导致 QQ 的崩溃。
复现 Bug
日志:
[23:58:37] DEBUG 加载SO文件成功 -> /data/user/0/com.tencent.mobileqq/files/SM_LIBS/shamrock
[23:58:37] DEBUG registerHandler[100351266](cmd = init, seq = 2)
[23:58:38] DEBUG 加载SO文件成功 -> /data/user/0/com.tencent.mobileqq/files/SM_LIBS/shamrock
[23:58:38] INFO QIMEI获取: 7cb77f28cc7db118a414947a10001ab17c08
[23:58:38] WARN 未配置Token,将不进行鉴权。
[23:58:39] WARN 尝试连接WebSocketClient(url = ws://192.168.3.33:25565/ws/)
[23:58:39] INFO Start HTTP Server: http://0.0.0.0:5700/
[23:58:39] INFO WebSocketClient onOpen: 101,
[23:58:39] WARN WebSocketClientService: 初始化服务
[23:58:41] DEBUG NTKernel try to init service: com.tencent.qqnt.kernel.api.impl.KernelServiceImpl@5e5017c
[23:58:41] INFO MSF Packet Receiver running!
[23:58:41] INFO Fetch kernel service successfully: 0,297127631,true
[23:58:41] INFO Register MSG listener successfully.
[23:58:44] DEBUG NTKernel同步消息开始
[23:58:44] DEBUG NTKernel try to init service: com.tencent.qqnt.kernel.api.impl.KernelServiceImpl@5e5017c
[23:58:45] DEBUG 反后台模式注入成功!
[23:58:45] DEBUG NTKernel同步消息完成
[23:58:46] DEBUG 阻止进入后台模式!
[23:58:54] DEBUG WebSocketClient心跳: 3806635891
[23:59:09] DEBUG WebSocketClient心跳: 3806635891
[23:59:24] DEBUG WebSocketClient心跳: 3806635891
[23:59:31] INFO 群消息(group = ***(***), uin = 1984841068, id = 533426848, seq = 3108, msg = ~say hi)
[23:59:36] DEBUG 加载SO文件成功 -> /data/user/0/com.tencent.mobileqq/files/SM_LIBS/shamrock
[23:59:36] DEBUG registerHandler[100351266](cmd = init, seq = 2)
[23:59:37] DEBUG 加载SO文件成功 -> /data/user/0/com.tencent.mobileqq/files/SM_LIBS/shamrock
[23:59:37] INFO QIMEI获取: 7cb77f28cc7db118a414947a10001ab17c08
[23:59:37] WARN 未配置Token,将不进行鉴权。
[23:59:39] INFO Start HTTP Server: http://0.0.0.0:5700/
[23:59:39] WARN 尝试连接WebSocketClient(url = ws://192.168.3.33:25565/ws/)
[23:59:39] INFO WebSocketClient onOpen: 101,
[23:59:39] WARN WebSocketClientService: 初始化服务
[23:59:41] DEBUG NTKernel try to init service: com.tencent.qqnt.kernel.api.impl.KernelServiceImpl@3482f66
[23:59:41] INFO MSF Packet Receiver running!
[23:59:41] INFO Fetch kernel service successfully: 0,99412109,true
[23:59:41] INFO Register MSG listener successfully.
[23:59:43] DEBUG 阻止进入后台模式!
[23:59:43] DEBUG 反后台模式注入成功!
[23:59:43] DEBUG NTKernel同步消息开始
[23:59:44] DEBUG NTKernel同步消息完成
[23:59:44] DEBUG NTKernel try to init service: com.tencent.qqnt.kernel.api.impl.KernelServiceImpl@3482f66
[23:59:44] WARN java.lang.IllegalStateException: 不支持的消息来源类型 | generateMsgIdHash: 103
at moe.fuqiuluo.shamrock.helper.MessageHelper.generateMsgIdHash(MessageHelper.kt:351)
at moe.fuqiuluo.shamrock.remote.service.listener.AioListener.handleMsg(AioListener.kt:43)
at moe.fuqiuluo.shamrock.remote.service.listener.AioListener.access$handleMsg(AioListener.kt:27)
at moe.fuqiuluo.shamrock.remote.service.listener.AioListener$onRecvMsg$1.invokeSuspend(AioListener.kt:33)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
[23:59:45] DEBUG 阻止进入后台模式!
[23:59:54] DEBUG WebSocketClient心跳: 3806635891
[00:00:01] WARN 消息element转换错误:java.lang.NoSuchMethodError: No virtual method getGrayTipElement()Lcom/tencent/qqnt/kernel/nativeinterface/GrayTipElement; in class Lcom/tencent/qqnt/kernel/nativeinterface/MsgElement; or its super classes (declaration of 'com.tencent.qqnt.kernel.nativeinterface.MsgElement' appears in /data/app/~~jPPVeMBUfMyyvcl5gSrRZg==/com.tencent.mobileqq-9ycN0CUi2kg9vbChd4qsfg==/base.apk), elementType: 8
[00:00:08] WARN 消息element转换错误:java.lang.NoSuchMethodError: No virtual method getGrayTipElement()Lcom/tencent/qqnt/kernel/nativeinterface/GrayTipElement; in class Lcom/tencent/qqnt/kernel/nativeinterface/MsgElement; or its super classes (declaration of 'com.tencent.qqnt.kernel.nativeinterface.MsgElement' appears in /data/app/~~jPPVeMBUfMyyvcl5gSrRZg==/com.tencent.mobileqq-9ycN0CUi2kg9vbChd4qsfg==/base.apk), elementType: 8
[00:00:09] DEBUG WebSocketClient心跳: 3806635891
[00:00:16] INFO Update message info from 3105 to 3105
[00:00:24] DEBUG WebSocketClient心跳: 3806635891
这个日志看起来好像不能很清晰地反映出问题所在,但是可以知道的是,在发送了纯文本信息请求之后,在 MuMu 模拟器中打开的 QQ 界面突然关闭,并且 OpenShamrock 的框架显示为未激活状态。
发送的纯文本消息类似于这样:
图中的消息能被正常发出的原因是它使用了 go-cqhttp。机器人在接收到指令之后,先会发出一个“戳一戳”请求,然后再发送指令对应的回复。
然而在我使用同样的机器人对接我当前正在使用的 OpenShamrock 时,机器人能成功发出“戳一戳”,然而在发出文本信息的时候就发送失败然后闪退了。
系统信息
- Shamrock 版本:https://github.com/whitechi73/OpenShamrock/actions/runs/9395246691/artifacts/1573699456
- Android 版本:12(MuMu 模拟器 12)
- LSPosed 框架版本:1.9.2
- QQ 版本:9.0.71(64 位)