diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt index 7a8aaa0..23fbc15 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt @@ -22,6 +22,7 @@ import moe.fuqiuluo.shamrock.helper.ContactHelper import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.helper.SendMsgException import moe.fuqiuluo.shamrock.tools.EMPTY_BYTE_ARRAY import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher import moe.fuqiuluo.shamrock.xposed.helper.msgService @@ -194,8 +195,10 @@ internal object MsgSvc: BaseSvc() { fromId, MessageCallback(peedId, 0) ) - return if (result.isFailure && retryCnt > 0) { - // 可能网络问题出现红色感叹号,重试 + return if (result.isFailure + && result.exceptionOrNull()?.javaClass == SendMsgException::class.java + && retryCnt > 0) { + // 发送失败,可能网络问题出现红色感叹号,重试 // 例如 rich media transfer failed delay(100) sendToAio(chatType, peedId, message, fromId, retryCnt - 1) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt index ad338a7..c40d84e 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt @@ -22,6 +22,9 @@ import com.tencent.qqnt.kernel.nativeinterface.ReplyElement import com.tencent.qqnt.kernel.nativeinterface.RichMediaFilePathInfo import com.tencent.qqnt.kernel.nativeinterface.TextElement import com.tencent.qqnt.kernel.nativeinterface.VideoElement +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import moe.fuqiuluo.qqinterface.servlet.CardSvc @@ -191,7 +194,20 @@ internal object MessageMaker { ): Result { data.checkAndThrow("data") val jsonStr = data["data"].let { - if (it is JsonObject) it.asJsonObject.toString() else it.asString + if (it is JsonObject) it.asJsonObject.toString() else { + val str = it.asStringOrNull ?: "" + // 检查字符串是否是合法json,不然qq会闪退 + try { + val element = Json.decodeFromString(str) + if (element !is JsonObject) { + return Result.failure(Exception("不合法的JSON字符串")) + } + } catch (err: Throwable) { + LogCenter.log(err.stackTraceToString(), Level.ERROR) + return Result.failure(Exception("不合法的JSON字符串")) + } + str + } } val element = MsgElement() element.elementType = MsgConstant.KELEMTYPEARKSTRUCT diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/Exceptions.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/Exceptions.kt index 97ceceb..314ba42 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/Exceptions.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/Exceptions.kt @@ -12,3 +12,4 @@ internal class LogicException(why: String) : InternalMessageMakerError(why) internal object ErrorTokenException : InternalMessageMakerError("access_token error") +internal class SendMsgException(why: String) : InternalMessageMakerError(why) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt index 75393e1..af6c379 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt @@ -86,10 +86,9 @@ internal object MessageHelper { } } if (sendRet?.first != 0) { - return Result.failure(Exception(sendRet?.second ?: "发送消息超时")) + return Result.failure(SendMsgException(sendRet?.second ?: "发送消息超时")) } return Result.success(sendResultPair) -// return sendMessageWithoutMsgId(chatType, peerId, msg, fromId, callback) } suspend fun sendMessageWithoutMsgId( diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MusicHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MusicHelper.kt index ab160cb..a8c0c56 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MusicHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MusicHelper.kt @@ -8,8 +8,10 @@ import moe.fuqiuluo.qqinterface.servlet.ark.ArkMsgSvc import moe.fuqiuluo.shamrock.tools.GlobalClient import moe.fuqiuluo.shamrock.tools.asInt import moe.fuqiuluo.shamrock.tools.asJsonArray +import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull import moe.fuqiuluo.shamrock.tools.asJsonObject import moe.fuqiuluo.shamrock.tools.asString +import moe.fuqiuluo.shamrock.tools.asStringOrNull import moe.fuqiuluo.shamrock.utils.MD5 internal object MusicHelper { @@ -53,12 +55,26 @@ internal object MusicHelper { val trackInfo = data["track_info"].asJsonObject val mid = trackInfo["mid"].asString val previewMid = trackInfo["album"].asJsonObject["mid"].asString + val singerMid = trackInfo["singer"].asJsonArrayOrNull?.let { + it[0].asJsonObject["mid"].asStringOrNull + } ?: "" val name = trackInfo["name"].asString val title = trackInfo["title"].asString val singerName = trackInfo["singer"].asJsonArray.first().asJsonObject["name"].asString + val vs = trackInfo["vs"].asJsonArrayOrNull?.let { + it[0].asStringOrNull + } ?: "" val code = MD5.getMd5Hex("${mid}q;z(&l~sdf2!nK".toByteArray()).substring(0 .. 4).uppercase() val playUrl = "http://c6.y.qq.com/rsc/fcgi-bin/fcg_pyq_play.fcg?songid=&songmid=$mid&songtype=1&fromtag=50&uin=&code=$code" - val previewUrl = "http://y.gtimg.cn/music/photo_new/T002R180x180M000$previewMid.jpg" + val previewUrl = if (vs.isNotEmpty()) { + "http://y.gtimg.cn/music/photo_new/T062R150x150M000$vs}.jpg" + } else if (previewMid.isNotEmpty()) { + "http://y.gtimg.cn/music/photo_new/T002R150x150M000$previewMid.jpg" + } else if (singerMid.isNotEmpty()){ + "http://y.gtimg.cn/music/photo_new/T001R150x150M000$singerMid.jpg" + } else { + "" + } val jumpUrl = "https://i.y.qq.com/v8/playsong.html?platform=11&appshare=android_qq&appversion=10030010&hosteuin=oKnlNenz7i-s7c**&songmid=${mid}&type=0&appsongtype=1&_wv=1&source=qq&ADTAG=qfshare" ArkMsgSvc.tryShareMusic( chatType,