Commit cdc92ae1 authored by Him188's avatar Him188

Update CaptchaPacket

parent 652ecc3f
...@@ -122,6 +122,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo ...@@ -122,6 +122,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
configuration: BotConfiguration, configuration: BotConfiguration,
cause: Throwable? = null cause: Throwable? = null
): LoginResult { ): LoginResult {
logger.info("BotAccount: ${qqAccount.toLong()}")
logger.info("Initializing BotNetworkHandler") logger.info("Initializing BotNetworkHandler")
try { try {
if (::network.isInitialized) { if (::network.isInitialized) {
......
...@@ -374,7 +374,7 @@ internal class TIMBotNetworkHandler internal constructor(coroutineContext: Corou ...@@ -374,7 +374,7 @@ internal class TIMBotNetworkHandler internal constructor(coroutineContext: Corou
is TouchPacket.TouchResponse.Redirection -> { is TouchPacket.TouchResponse.Redirection -> {
socket.close() socket.close()
bot.logger.info("Redirecting to ${packet.serverIP}") bot.logger.info("Redirecting to ${packet.serverIP}")
socket = BotSocketAdapter(packet.serverIP!!) socket = BotSocketAdapter(packet.serverIP)
loginResult.complete(socket.resendTouch()) loginResult.complete(socket.resendTouch())
} }
...@@ -406,10 +406,8 @@ internal class TIMBotNetworkHandler internal constructor(coroutineContext: Corou ...@@ -406,10 +406,8 @@ internal class TIMBotNetworkHandler internal constructor(coroutineContext: Corou
this.token00BA = packet.token00BA this.token00BA = packet.token00BA
this.captchaCache = packet.captchaPart1 this.captchaCache = packet.captchaPart1
if (packet.unknownBoolean) { this.captchaSectionId = 1
this.captchaSectionId = 1 socket.sendPacket(CaptchaPacket.RequestTransmission(bot.qqAccount, this.token0825, this.captchaSectionId++, packet.token00BA))
socket.sendPacket(CaptchaPacket.RequestTransmission(bot.qqAccount, this.token0825, this.captchaSectionId++, packet.token00BA))
}
} }
is CaptchaPacket.CaptchaResponse.Transmission -> { is CaptchaPacket.CaptchaResponse.Transmission -> {
......
...@@ -22,7 +22,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>( ...@@ -22,7 +22,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>(
token0825: ByteArray, token0825: ByteArray,
captchaSequence: Int, captchaSequence: Int,
token00BA: ByteArray token00BA: ByteArray
): OutgoingPacket = buildOutgoingPacket { ): OutgoingPacket = buildOutgoingPacket(name = "CaptchaPacket.RequestTransmission") {
writeQQ(bot) writeQQ(bot)
writeFully(TIMProtocol.fixVer) writeFully(TIMProtocol.fixVer)
writeFully(TIMProtocol.key00BA) writeFully(TIMProtocol.key00BA)
...@@ -48,7 +48,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>( ...@@ -48,7 +48,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>(
fun Refresh( fun Refresh(
bot: UInt, bot: UInt,
token0825: ByteArray token0825: ByteArray
): OutgoingPacket = buildOutgoingPacket { ): OutgoingPacket = buildOutgoingPacket(name = "CaptchaPacket.Refresh") {
writeQQ(bot) writeQQ(bot)
writeFully(TIMProtocol.fixVer) writeFully(TIMProtocol.fixVer)
writeFully(TIMProtocol.key00BA) writeFully(TIMProtocol.key00BA)
...@@ -72,7 +72,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>( ...@@ -72,7 +72,7 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>(
token0825: ByteArray, token0825: ByteArray,
captcha: String, captcha: String,
captchaToken: IoBuffer captchaToken: IoBuffer
): OutgoingPacket = buildOutgoingPacket { ): OutgoingPacket = buildOutgoingPacket(name = "CaptchaPacket.Submit") {
require(captcha.length == 4) { "captcha.length must == 4" } require(captcha.length == 4) { "captcha.length must == 4" }
writeQQ(bot) writeQQ(bot)
writeFully(TIMProtocol.fixVer) writeFully(TIMProtocol.fixVer)
...@@ -123,18 +123,37 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>( ...@@ -123,18 +123,37 @@ object CaptchaPacket : PacketFactory<CaptchaPacket.CaptchaResponse, CaptchaKey>(
0x13u -> { 0x13u -> {
CaptchaResponse.Transmission().apply { CaptchaResponse.Transmission().apply {
with(debugPrint("验证码包")) { with(debugPrint("验证码包")) {
discardExact(9) /*
captchaToken = readIoBuffer(56) * 00 05 01 00 00 01 23
* 00 40 A0 E9 2F 12 1D 2E B1 15 26 89 EB C3 F0 9A 0C 03 00 03 A0 F2 74 57 58 57 E9 7A 2B C7 52 5D BC D8 7B D5 A4 7C AD 33 85 85 39 88 D2 CE AD 68 36 2E F0 AE 19 E8 25 3A F7 3A AD BE 19 A9 E7 C4 B5 4C
val length = readShort() * 02 BC 28 01 38 40 C6 4E 85 A6 32 24 0C 3C B3 19 46 5D AD 56 AC 3D 3A E1 ED AD 8C 60 05 47 37 10 DC AD E5 72 F9 F9 18 B8 0C 13 10 D2 4E C9 3C 02 BE 57 E4 02 E0 6C 6C 6E E9 3C 57 28 66 BD 0C D3 FF CC 5A 47 B4 F1 7C 87 85 24 B0 60 44 20 1C 1E AD 95 7B CB 45 AF 43 95 10 0F 1D 0B 33 CB 09 7E BE F8 35 B0 D4 5C AB 9E 5A BE 34 E8 B9 2E 65 C7 DA F5 E1 EB 71 43 31 A1 2E 40 4D 84 22 EF 8F CD 05 13 33 E5 CF E3 AA 09 C7 71 15 30 A4 83 A7 36 84 90 4D 4C A7 67 66 4B A5 D7 C5 FB 5E D7 26 ED 9C 92 AD 7C 8F 09 36 A3 60 84 16 07 45 B4 6E EA CD 05 EC C7 0B BA A2 BE 71 24 E6 49 C1 FC 05 3E 26 C9 E6 F7 EA B3 25 8D BA 1F 15 3D DC BC FD CE A6 79 FF 8B 28 B6 12 78 F3 8F EB A6 A9 B6 A5 5F 65 58 CC CD FC F6 BC A6 46 21 68 70 64 82 C7 8F 79 1A C0 B3 48 B6 CD C8 7C 7E 90 61 43 F7 A6 D7 B1 39 F1 72 C7 78 7E 37 49 50 6A B6 9F 5B 8D A9 C0 B0 BB F0 EF 9D CD 6E F7 E7 5A 3C BA E1 02 2E A0 2D 00 04 07 25 B3 B2 34 FA CD 6E C3 A4 ED 87 88 59 D8 63 0C 1D 27 D1 04 4D B5 5B 6E 43 07 17 79 FA EB C2 A3 11 77 72 9D C5 55 90 80 EF 01 47 1A 10 02 E7 02 F6 8A 76 E9 E5 C1 A0 F6 E4 B4 65 36 7F 41 36 37 E8 CE 99 7F 49 66 2A 61 7D A8 D2 57 D9 18 E9 FA 85 CB 3A 1E 7A DE 8C 07 F5 2A CA 33 25 D4 E0 86 08 75 50 B6 1C EE 99 BA 56 F8 4F E9 EF CD E6 27 EE 81 D9 CC 5E 7F 4A 33 54 CB F9 A5 92 DE 76 0B F4 57 29 65 77 BC BD 3D CC E5 1C C4 2E 2E 02 0E 41 A0 09 29 ED DB F2 53 6B 19 6A ED EC FA D5 0B 76 E6 87 CC 99 9E 80 75 28 A6 92 6D 63 DB BF D7 09 B1 DA DD EC CB D6 7F 5E 60 14 83 C7 B8 19 85 97 37 BA 64 0C AA B7 E9 D5 E0 C2 0F 7A 86 DA 56 96 D1 07 FD DA F0 F1 83 9E 8B 49 F3 DF 3C 2F FD 35 33 55 D2 D4 FA D0 3B 52 BE CD 22 60 22 9E 4C 03 EA 1A 3A 23 46 29 C0 A2 12 51 BC 81 EF E6 FF E8 E9 19 8D 66 F4 F4 A5 FE CD 33 8F 77 67 DC 38 F9 E4 1F D4 63 0D CF 24 AA F5 E1 89 7D F3 79 3D B6 47 02 E9 F8 C9 D0 5A DF 84 00 08 B6 E2 95 3F 3D B3 4E 83 CE EC 91 52 ED 61 63 74 7B 6E CC CC EE A3 5D 3F 7B 91 2E EA F7 3C 0C 3A 4C BC 08 86 A0 6A 63 D0 2D 30 EF 28 BC B3 85 57 85 C1 39 D8 AC FC ED 64 C7 C4 A9 EA F2 5A C5 7F 96 9B 1B CF 97 1E 16 8B EB E4 D7 23 7B 7B D9 E4 09 C9 32 BD 35 B6 AF FE 92 C5 78 BF E1 1A D8 A1 0A 09 5E DE 22 8A F7 7A 9F 4E A2 FD 7E
captchaSectionN = readIoBuffer(length) * 01 //第几个包
* 01 //是否还有更多
discardExact(1) * 00 28 39 24 31 73 77 6E 55 E7 99 4D 9E 56 AF 6D 38 77 10 60 3B 68 45 41 35 70 1D B4 FE 7E CE 78 65 5A D7 C8 95 AF F2 6B 6D C8
val byte = readByte().toInt() * 00 10 CC A9 FA 63 A8 34 C7 3C E6 F7 2E 15 B7 EF 3E 07
transmissionCompleted = byte == 0 */
discardExact(7)
discardExact(remaining - 56 - 2) captchaToken = readIoBuffer(readUShort().toInt()) // 56
token00BA = readBytes(40)
/*
*00 05 01 00 00 01 23
* 00 40 0B 84 40 B1 59 9C FE B8 EC E4 E8 36 2B 4B 03 C7 9F 5D FA A3 7B 43 BD 50 19 55 EA 4C A8 DE 49 FF 5F 45 89 7F 2E B2 6D C9 D6 B7 08 3B 60 31 74 4C FA DA 5F 5F A6 80 ED A1 19 48 F9 C9 4A 6A AD F6
* 00 48 39 46 4F 92 0F 70 C5 55 81 3E 0B E7 96 18 4F 31 93 FE 1B D6 A9 50 97 97 E0 83 76 03 6C 50 80 2B 65 13 63 44 A3 9E 0B D9 C0 10 60 70 5B A1 53 2C FD 3B 84 DF A6 E6 F6 1F 71 B5 A6 54 00 00 00 00 49 45 4E 44 AE 42 60 82
* 04 //第几个包
* 00 //是否还有更多
* 00 28 3C 40 BD A5 8B F9 63 97 7E 62 34 E3 F9 49 49 9E 21 01 3C 64 21 AE 8D 87 21 9F 44 4A 0C 6F 85 32 B4 13 4C 59 66 E7 EE 17
* 00 10 AF 66 92 E2 B4 39 6B 9A BA 29 EF AA 8D 98 79 55
*/
captchaSectionN = readIoBuffer(readUShort().toInt()) // <=700
discardExact(1) // 第几个包
transmissionCompleted = readByte().toInt() == 0
token00BA = readBytes(readUShort().toInt())
println(token00BA.toUHexString())
// 剩余
// 00 10 AF 66 92 E2 B4 39 6B 9A BA 29 EF AA 8D 98 79 55
} }
} }
} }
......
...@@ -79,6 +79,11 @@ inline class LoginResult(val id: Byte) { ...@@ -79,6 +79,11 @@ inline class LoginResult(val id: Byte) {
@JvmStatic @JvmStatic
val CAPTCHA = LoginResult(10) val CAPTCHA = LoginResult(10)
/**
* 该号码长期未登录, 为了保证账号安全, 已被系统设置成保护状态, 请用手机 TIM 最新版本登录, 登录成功后即可自动解除保护模式
*/ // TIM的错误代码为 00020
val PROTECTED = LoginResult(11)
@JvmStatic @JvmStatic
val values: List<LoginResult> by lazy { val values: List<LoginResult> by lazy {
listOf( listOf(
...@@ -91,7 +96,9 @@ inline class LoginResult(val id: Byte) { ...@@ -91,7 +96,9 @@ inline class LoginResult(val id: Byte) {
TAKEN_BACK, TAKEN_BACK,
INTERNAL_ERROR, INTERNAL_ERROR,
TIMEOUT, TIMEOUT,
NETWORK_UNAVAILABLE NETWORK_UNAVAILABLE,
CAPTCHA,
PROTECTED
) )
} }
} }
......
...@@ -49,13 +49,13 @@ object TouchPacket : PacketFactory<TouchPacket.TouchResponse, TouchKey>(TouchKey ...@@ -49,13 +49,13 @@ object TouchPacket : PacketFactory<TouchPacket.TouchResponse, TouchKey>(TouchKey
class OK( class OK(
var loginTime: Int, var loginTime: Int,
val loginIP: String, val loginIP: String,
val token0825: ByteArray val token0825: ByteArray // 56
) : TouchResponse() { ) : TouchResponse() {
override fun toString(): String = "TouchResponse.OK" override fun toString(): String = "TouchResponse.OK"
} }
class Redirection( class Redirection(
val serverIP: String? = null val serverIP: String
) : TouchResponse() { ) : TouchResponse() {
override fun toString(): String = "TouchResponse.Redirection" override fun toString(): String = "TouchResponse.Redirection"
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment