mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.37k stars 2.53k forks source link

处理 空图片 (幽灵图片) #1592

Open Deficuet opened 3 years ago

Deficuet commented 3 years ago

写了一个遍历合并转发内容并保存的功能。有时候直接接收合并转发后下载的图片是0KB,就需要返回查找该合并转发 右键群聊-查看消息记录,打开消息管理器,找到合并转发后,转发至另一个群并由bot接收,在显示了

[Http] Downloading forward message: succeed

之后就会报该错误,似乎是每有一张图片报一次。 每个包含图片的Node都显示为这样(抹掉了发送者信息。发送者信息均显示正常)

Node(senderId=<senderId>, time=1633148151, senderName=<senderName>, messageChain=[mirai:image:])

通过queryUrl()获取到的链接都长这样

http://c2cpicdw.qpic.cn/offpic_new/0//0?term=2

日志的一部分,合并转发内每有一张图片就会重复一次该部分

2021-10-02 11:57:03 W/null: java.lang.IllegalStateException: 在 Failed to compute friend imageId: resId= 时遇到了意料之中的问题. 请完整复制此日志提交给 mirai: https://github.com/mamoe/mirai/issues/new   并描述此时 Bot 是否正在从好友或群接受消息, 尽量附加该图片原文件 调试信息: NotOnlineImage#1883606170 {
            fileLen=0x0000000000000000(0)
            oldPicMd5=false
    }
java.lang.IllegalStateException: 在 Failed to compute friend imageId: resId= 时遇到了意料之中的问题. 请完整复制此日志提交给 mirai: https://github.com/mamoe/mirai/issues/new   并描述此时 Bot 是否正在从好友或群接 受消息, 尽量附加该图片原文件 调试信息: NotOnlineImage#1883606170 {
            fileLen=0x0000000000000000(0)
            oldPicMd5=false
    }
        at net.mamoe.mirai.internal.message.ContextualBugReportExceptionKt.contextualBugReportException(contextualBugReportException.kt:23)
        at net.mamoe.mirai.internal.message.ContextualBugReportExceptionKt.contextualBugReportException$default(contextualBugReportException.kt:17)
        at net.mamoe.mirai.internal.message.OnlineFriendImageImpl.<init>(imagesImpl.kt:77)
        at net.mamoe.mirai.internal.message.ReceiveMessageTransformer.transformElement(ReceiveMessageHandler.kt:149)
        at net.mamoe.mirai.internal.message.ReceiveMessageTransformer.joinToMessageChain(ReceiveMessageHandler.kt:133)
        at net.mamoe.mirai.internal.message.ReceiveMessageHandlerKt.toMessageChain(ReceiveMessageHandler.kt:88)
        at net.mamoe.mirai.internal.message.ReceiveMessageHandlerKt.toMessageChainNoSource(ReceiveMessageHandler.kt:67)
        at net.mamoe.mirai.internal.message.ReceiveMessageHandlerKt.toMessageChainNoSource$default(ReceiveMessageHandler.kt:61)
        at net.mamoe.mirai.internal.MiraiImpl.toNode$suspendImpl(MiraiImpl.kt:922)
        at net.mamoe.mirai.internal.MiraiImpl.toNode(MiraiImpl.kt)
        at net.mamoe.mirai.internal.MiraiImpl.toForwardMessageNodes$suspendImpl(MiraiImpl.kt:900)
        at net.mamoe.mirai.internal.MiraiImpl.toForwardMessageNodes$mirai_core(MiraiImpl.kt)
        at net.mamoe.mirai.internal.MiraiImpl.toForwardMessageNodes$suspendImpl(MiraiImpl.kt:910)
        at net.mamoe.mirai.internal.MiraiImpl.toForwardMessageNodes$mirai_core(MiraiImpl.kt)
        at net.mamoe.mirai.internal.MiraiImpl.downloadForwardMessage$suspendImpl(MiraiImpl.kt:893)
        at net.mamoe.mirai.internal.MiraiImpl$downloadForwardMessage$1.invokeSuspend(MiraiImpl.kt)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:191)
        at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:147)
        at io.ktor.util.pipeline.SuspendFunctionGun.access$loop(SuspendFunctionGun.kt:15)
        at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:93)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

复现

  1. 右键群聊-查看消息记录,打开消息管理器
  2. 找到一个合并转发后,转发至另一个群并由bot接收

不确定是否一定需要bot遍历合并转发的每一个Node,通过queryUrl()获取每一张图片的链接来复现

版本及相关选项选择

网络日志

补充信息

Deficuet commented 3 years ago

从消息管理器里转发给群友看,群友反映也是图片全裂。似乎是腾讯自己的问题?

Nambers commented 3 years ago

看起来像嵌套转发消息的问题 因为没找到消息管理器里面的合并转发,我用多选+合并转发一个转发信息(内包含转发信息)和一个文本信息做的,没复现错误 其中bot没执行任何回应操作

Deficuet commented 3 years ago

看起来像嵌套转发消息的问题 因为没找到消息管理器里面的合并转发,我用多选+合并转发一个转发信息(内包含转发信息)和一个文本信息做的,没复现错误 其中bot没执行任何回应操作

正常从一个群里多选后合并转发是确认不会有该报错,嵌套的也没事。目前看起来只存在于从消息管理器翻消息记录转发