|
@@ -18,8 +18,11 @@ import io.ktor.http.content.OutgoingContent
|
|
|
import io.ktor.http.userAgent
|
|
import io.ktor.http.userAgent
|
|
|
import io.ktor.utils.io.ByteReadChannel
|
|
import io.ktor.utils.io.ByteReadChannel
|
|
|
import io.ktor.utils.io.copyAndClose
|
|
import io.ktor.utils.io.copyAndClose
|
|
|
|
|
+import kotlinx.coroutines.InternalCoroutinesApi
|
|
|
|
|
+import kotlinx.coroutines.flow.collect
|
|
|
import kotlinx.io.InputStream
|
|
import kotlinx.io.InputStream
|
|
|
import kotlinx.io.core.Input
|
|
import kotlinx.io.core.Input
|
|
|
|
|
+import kotlinx.io.core.discardExact
|
|
|
import kotlinx.io.core.readAvailable
|
|
import kotlinx.io.core.readAvailable
|
|
|
import kotlinx.io.core.use
|
|
import kotlinx.io.core.use
|
|
|
import kotlinx.io.pool.useInstance
|
|
import kotlinx.io.pool.useInstance
|
|
@@ -30,9 +33,8 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.withUse
|
|
|
import net.mamoe.mirai.utils.MiraiInternalAPI
|
|
import net.mamoe.mirai.utils.MiraiInternalAPI
|
|
|
import net.mamoe.mirai.utils.io.ByteArrayPool
|
|
import net.mamoe.mirai.utils.io.ByteArrayPool
|
|
|
import net.mamoe.mirai.utils.io.PlatformSocket
|
|
import net.mamoe.mirai.utils.io.PlatformSocket
|
|
|
-import net.mamoe.mirai.utils.io.discardExact
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
+@UseExperimental(MiraiInternalAPI::class)
|
|
|
@Suppress("SpellCheckingInspection")
|
|
@Suppress("SpellCheckingInspection")
|
|
|
internal suspend fun HttpClient.postImage(
|
|
internal suspend fun HttpClient.postImage(
|
|
|
htcmd: String,
|
|
htcmd: String,
|
|
@@ -90,6 +92,7 @@ internal suspend fun HttpClient.postImage(
|
|
|
|
|
|
|
|
@UseExperimental(MiraiInternalAPI::class)
|
|
@UseExperimental(MiraiInternalAPI::class)
|
|
|
internal object HighwayHelper {
|
|
internal object HighwayHelper {
|
|
|
|
|
+ @UseExperimental(InternalCoroutinesApi::class)
|
|
|
suspend fun uploadImage(
|
|
suspend fun uploadImage(
|
|
|
client: QQAndroidClient,
|
|
client: QQAndroidClient,
|
|
|
serverIp: String,
|
|
serverIp: String,
|
|
@@ -108,30 +111,27 @@ internal object HighwayHelper {
|
|
|
val socket = PlatformSocket()
|
|
val socket = PlatformSocket()
|
|
|
socket.connect(serverIp, serverPort)
|
|
socket.connect(serverIp, serverPort)
|
|
|
socket.use {
|
|
socket.use {
|
|
|
-
|
|
|
|
|
- // TODO: 2020/2/23 使用缓存, 或使用 HTTP 发送更好 (因为无需读取到内存)
|
|
|
|
|
- socket.send(
|
|
|
|
|
- Highway.RequestDataTrans(
|
|
|
|
|
- uin = client.uin,
|
|
|
|
|
- command = "PicUp.DataUp",
|
|
|
|
|
- sequenceId =
|
|
|
|
|
- if (commandId == 2) client.nextHighwayDataTransSequenceIdForGroup()
|
|
|
|
|
- else client.nextHighwayDataTransSequenceIdForFriend(),
|
|
|
|
|
- uKey = uKey,
|
|
|
|
|
- data = imageInput,
|
|
|
|
|
- dataSize = inputSize,
|
|
|
|
|
- md5 = md5,
|
|
|
|
|
- commandId = commandId
|
|
|
|
|
- )
|
|
|
|
|
- )
|
|
|
|
|
-
|
|
|
|
|
- //0A 3C 08 01 12 0A 31 39 39 34 37 30 31 30 32 31 1A 0C 50 69 63 55 70 2E 44 61 74 61 55 70 20 E9 A7 05 28 00 30 BD DB 8B 80 02 38 80 20 40 02 4A 0A 38 2E 32 2E 30 2E 31 32 39 36 50 84 10 12 3D 08 00 10 FD 08 18 00 20 FD 08 28 C6 01 38 00 42 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 4A 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 50 89 92 A2 FB 06 58 00 60 00 18 53 20 01 28 00 30 04 3A 00 40 E6 B7 F7 D9 80 2E 48 00 50 00
|
|
|
|
|
- socket.read().withUse {
|
|
|
|
|
- discardExact(1)
|
|
|
|
|
- val headLength = readInt()
|
|
|
|
|
- discardExact(4)
|
|
|
|
|
- val proto = readProtoBuf(CSDataHighwayHead.RspDataHighwayHead.serializer(), length = headLength)
|
|
|
|
|
- check(proto.errorCode == 0) { "image upload failed: Transfer errno=${proto.errorCode}" }
|
|
|
|
|
|
|
+ createImageDataPacketSequence(
|
|
|
|
|
+ uin = client.uin,
|
|
|
|
|
+ command = "PicUp.DataUp",
|
|
|
|
|
+ sequenceId =
|
|
|
|
|
+ if (commandId == 2) client.nextHighwayDataTransSequenceIdForGroup()
|
|
|
|
|
+ else client.nextHighwayDataTransSequenceIdForFriend(),
|
|
|
|
|
+ commandId = commandId,
|
|
|
|
|
+ uKey = uKey,
|
|
|
|
|
+ data = imageInput,
|
|
|
|
|
+ dataSize = inputSize,
|
|
|
|
|
+ md5 = md5
|
|
|
|
|
+ ).collect {
|
|
|
|
|
+ socket.send(it)
|
|
|
|
|
+ //0A 3C 08 01 12 0A 31 39 39 34 37 30 31 30 32 31 1A 0C 50 69 63 55 70 2E 44 61 74 61 55 70 20 E9 A7 05 28 00 30 BD DB 8B 80 02 38 80 20 40 02 4A 0A 38 2E 32 2E 30 2E 31 32 39 36 50 84 10 12 3D 08 00 10 FD 08 18 00 20 FD 08 28 C6 01 38 00 42 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 4A 10 D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E 50 89 92 A2 FB 06 58 00 60 00 18 53 20 01 28 00 30 04 3A 00 40 E6 B7 F7 D9 80 2E 48 00 50 00
|
|
|
|
|
+ socket.read().withUse {
|
|
|
|
|
+ discardExact(1)
|
|
|
|
|
+ val headLength = readInt()
|
|
|
|
|
+ discardExact(4)
|
|
|
|
|
+ val proto = readProtoBuf(CSDataHighwayHead.RspDataHighwayHead.serializer(), length = headLength)
|
|
|
|
|
+ check(proto.errorCode == 0) { "image upload failed: Transfer errno=${proto.errorCode}" }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|