This commit is contained in:
mzdluo123 2020-07-09 12:36:51 +08:00
parent 83ee69ccc6
commit fab0378078
No known key found for this signature in database
GPG Key ID: 9F7BC2C154107A1D
6 changed files with 99 additions and 9 deletions

View File

@ -11,7 +11,6 @@
package net.mamoe.mirai.qqandroid
import io.ktor.client.HttpClient
import io.ktor.client.request.*
import io.ktor.client.request.forms.MultiPartFormDataContent
import io.ktor.client.request.forms.formData
@ -42,10 +41,10 @@ import net.mamoe.mirai.qqandroid.message.*
import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
import net.mamoe.mirai.qqandroid.network.highway.HighwayHelper
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Cmd0x388
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.ImMsgBody
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.LongMsg
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.*
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.voice.PttStore
import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList
import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils
import net.mamoe.mirai.qqandroid.utils.encodeToString
@ -57,6 +56,7 @@ import kotlin.coroutines.CoroutineContext
import kotlin.jvm.JvmField
import kotlin.jvm.JvmSynthetic
import kotlin.math.absoluteValue
import kotlin.math.log
import kotlin.random.Random
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.FriendInfo as JceFriendInfo
@ -561,7 +561,7 @@ internal abstract class QQAndroidBotBase constructor(
@MiraiExperimentalAPI
override suspend fun _lowLevelGetAnnouncement(groupId: Long, fid: String): GroupAnnouncement {
val data = network.async {
HttpClient().post<String> {
MiraiPlatformUtils.Http.post<String> {
url("https://web.qun.qq.com/cgi-bin/announce/get_feed")
body = MultiPartFormDataContent(formData {
append("qid", groupId)
@ -588,7 +588,7 @@ internal abstract class QQAndroidBotBase constructor(
@MiraiExperimentalAPI
override suspend fun _lowLevelGetGroupActiveData(groupId: Long, page: Int): GroupActiveData {
val data = network.async {
HttpClient().get<String> {
MiraiPlatformUtils.Http.get<String> {
url("https://qqweb.qq.com/c/activedata/get_mygroup_data")
parameter("bkn", bkn)
parameter("gc", groupId)
@ -793,6 +793,21 @@ internal abstract class QQAndroidBotBase constructor(
}
}
@ExperimentalStdlibApi
@MiraiExperimentalAPI
@LowLevelAPI
override suspend fun _lowLevelQueryGroupVoiceDownloadUrl(
md5: ByteArray,
groupId: Long,
dstUin: Long
): String {
network.run {
val response: PttStore.GroupPttDown.Response.DownLoadInfo =
PttStore.GroupPttDown(client, groupId, dstUin,md5).sendAndExpect()
return "http://${response.strDomain}${response.downPara.encodeToString()}"
}
}
@Suppress("DEPRECATION", "OverridingDeprecatedMember")
override suspend fun queryImageUrl(image: Image): String = when (image) {
is ConstOriginUrlAware -> image.originUrl

View File

@ -141,6 +141,7 @@ internal object KnownPacketFactories {
FriendList.GetTroopMemberList,
ImgStore.GroupPicUp,
PttStore.GroupPttUp,
PttStore.GroupPttDown,
LongConn.OffPicUp,
LongConn.OffPicDown,
TroopManagement.EditSpecialTitle,

View File

@ -53,7 +53,7 @@ internal object OnlinePushPbPushGroupMsg : IncomingPacketFactory<Packet?>("Onlin
// 00 00 02 E4 0A D5 05 0A 4F 08 A2 FF 8C F0 03 10 DD F1 92 B7 07 18 52 20 00 28 BC 3D 30 8C 82 AB F1 05 38 D2 80 E0 8C 80 80 80 80 02 4A 21 08 E7 C1 AD B8 02 10 01 18 BA 05 22 09 48 69 6D 31 38 38 6D 6F 65 30 06 38 02 42 05 4D 69 72 61 69 50 01 58 01 60 00 88 01 08 12 06 08 01 10 00 18 00 1A F9 04 0A F6 04 0A 26 08 00 10 87 82 AB F1 05 18 B7 B4 BF 30 20 00 28 0C 30 00 38 86 01 40 22 4A 0C E5 BE AE E8 BD AF E9 9B 85 E9 BB 91 12 E6 03 42 E3 03 12 2A 7B 34 45 31 38 35 38 32 32 2D 30 45 37 42 2D 46 38 30 46 2D 43 35 42 31 2D 33 34 34 38 38 33 37 34 44 33 39 43 7D 2E 6A 70 67 22 00 2A 04 03 00 00 00 32 60 15 36 20 39 36 6B 45 31 41 38 35 32 32 39 64 63 36 39 38 34 37 39 37 37 62 20 20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7B 34 45 31 38 35 38 32 32 2D 30 45 37 42 2D 46 38 30 46 2D 43 35 42 31 2D 33 34 34 38 38 33 37 34 44 33 39 43 7D 2E 6A 70 67 31 32 31 32 41 38 C6 BB 8A A9 08 40 FB AE 9E C2 09 48 50 50 41 5A 00 60 01 6A 10 4E 18 58 22 0E 7B F8 0F C5 B1 34 48 83 74 D3 9C 72 59 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 31 39 38 3F 74 65 72 6D 3D 32 82 01 57 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 30 3F 74 65 72 6D 3D 32 B0 01 4D B8 01 2E C8 01 FF 05 D8 01 4D E0 01 2E FA 01 59 2F 67 63 68 61 74 70 69 63 5F 6E 65 77 2F 31 30 34 30 34 30 30 32 39 30 2F 36 35 35 30 35 37 31 32 37 2D 32 32 33 33 36 33 38 33 34 32 2D 34 45 31 38 35 38 32 32 30 45 37 42 46 38 30 46 43 35 42 31 33 34 34 38 38 33 37 34 44 33 39 43 2F 34 30 30 3F 74 65 72 6D 3D 32 80 02 4D 88 02 2E 12 45 AA 02 42 50 03 60 00 68 00 9A 01 39 08 09 20 BF 50 80 01 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 04 08 02 08 01 90 04 80 80 80 10 B8 04 00 C0 04 00 12 06 4A 04 08 00 40 01 12 14 82 01 11 0A 09 48 69 6D 31 38 38 6D 6F 65 18 06 20 08 28 03 10 8A CA 9D A1 07 1A 00
if (!bot.firstLoginSucceed) return null
val pbPushMsg = readProtoBuf(MsgOnlinePush.PbPushMsg.serializer())
//bot.logger.debug(pbPushMsg._miraiContentToString())
// bot.logger.debug(pbPushMsg._miraiContentToString())
if (pbPushMsg.msg.msgHead.fromUin == bot.id) {
return SendGroupMessageReceipt(

View File

@ -1,6 +1,7 @@
package net.mamoe.mirai.qqandroid.network.protocol.packet.chat.voice
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.qqandroid.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.qqandroid.QQAndroidBot
import net.mamoe.mirai.qqandroid.network.Packet
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
@ -27,7 +28,7 @@ internal class PttStore {
val uploadIpList: List<Int>,
val uploadPortList: List<Int>,
val fileKey: ByteArray
) : Response() {
) : GroupPttUp.Response() {
override fun toString(): String {
return "RequireUpload(fileId=$fileId, uKey=${uKey.contentToString()})"
}
@ -93,4 +94,67 @@ internal class PttStore {
}
object GroupPttDown : OutgoingPacketFactory<GroupPttDown.Response>("PttStore.GroupPttDown") {
sealed class Response() : Packet {
class DownLoadInfo(
val downDomain: ByteArray,
val downPara:ByteArray,
val strDomain:String,
val uint32DownIp:List<Int>,
val uint32DownPort:List<Int>
) : GroupPttDown.Response() {
override fun toString(): String {
return "GroupPttDown(downPara=${downPara.encodeToString()},strDomain=$strDomain})"
}
}
}
@ExperimentalStdlibApi
operator fun invoke(
client: QQAndroidClient,
groupCode: Long,
dstUin:Long,
md5: ByteArray
): OutgoingPacket = buildOutgoingUniPacket(client) {
writeProtoBuf(
Cmd0x388.ReqBody.serializer(), Cmd0x388.ReqBody(
netType = 3, // wifi
subcmd = 4,
msgGetpttUrlReq = listOf(
Cmd0x388.GetPttUrlReq(
groupCode = groupCode,
fileMd5 = md5,
dstUin = dstUin,
buType = 4,
innerIp = 0,
buildVer = "6.5.5.663".encodeToByteArray(),
codec = 0,
reqTerm = 5,
reqPlatformType = 9
)
)
)
)
}
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response {
val resp0 = readProtoBuf(Cmd0x388.RspBody.serializer())
resp0.msgGetpttUrlRsp ?: error("cannot find `msgGetpttUrlRsp` from `Cmd0x388.RspBody`")
val resp = resp0.msgGetpttUrlRsp.first()
if (!resp.failMsg.contentEquals(EMPTY_BYTE_ARRAY)){
throw IllegalStateException(resp.failMsg.encodeToString())
}
return Response.DownLoadInfo(
downDomain = resp.downDomain,
downPara = resp.downPara,
uint32DownIp = resp.uint32DownIp!!,
uint32DownPort = resp.uint32DownPort!!,
strDomain = resp.strDomain
)
}
}
}

View File

@ -16,6 +16,7 @@ import net.mamoe.mirai.data.*
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent
import net.mamoe.mirai.message.data.Voice
import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.WeakRef
@ -159,4 +160,13 @@ interface LowLevelBotAPIAccessor {
blackList: Boolean,
message: String = ""
)
/**
* 查询语音的下载连接
*
* */
@LowLevelAPI
@MiraiExperimentalAPI
suspend fun _lowLevelQueryGroupVoiceDownloadUrl(md5: ByteArray, groupId: Long, dstUin: Long): String
}

View File

@ -35,13 +35,13 @@ class Voice(
get() = "Voice"
}
val url: String
val url: String?
get() = if (_url.startsWith("http")) _url
else "http://grouptalk.c2c.qq.com$_url"
else null
private var _stringValue: String? = null
get() = field ?: kotlin.run {
field = "[mirai:voice:$fileName,url:$url]"
field = "[mirai:voice:$fileName]"
field
}