Commit 33f9b223 authored by jiahua.liu's avatar jiahua.liu

And Captcha

parent d1c56633
...@@ -37,6 +37,13 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler ...@@ -37,6 +37,13 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
is Captcha -> when (response) { is Captcha -> when (response) {
is Captcha.Picture -> { is Captcha.Picture -> {
bot.logger.info("需要图片验证码") bot.logger.info("需要图片验证码")
var result = bot.configuration.captchaSolver.invoke(bot, response.data)
if (result === null || result.length != 4) {
//refresh captcha
result = "ABCD"
}
bot.logger.info("提交验证码")
LoginPacket.SubCommand2(bot.client, response.sign, result)
} }
is Captcha.Slider -> { is Captcha.Slider -> {
bot.logger.info("需要滑动验证码") bot.logger.info("需要滑动验证码")
......
...@@ -46,6 +46,7 @@ internal open class QQAndroidClient( ...@@ -46,6 +46,7 @@ internal open class QQAndroidClient(
@MiraiInternalAPI("Be careful. Do not use the id in BotAccount. use client.uin instead") @MiraiInternalAPI("Be careful. Do not use the id in BotAccount. use client.uin instead")
val account: BotAccount, val account: BotAccount,
val ecdh: ECDH = ECDH(), val ecdh: ECDH = ECDH(),
val device: DeviceInfo = SystemDeviceInfo(context), val device: DeviceInfo = SystemDeviceInfo(context),
bot: QQAndroidBot bot: QQAndroidBot
...@@ -160,6 +161,8 @@ internal open class QQAndroidClient( ...@@ -160,6 +161,8 @@ internal open class QQAndroidClient(
lateinit var mainDisplayName: ByteArray lateinit var mainDisplayName: ByteArray
var transportSequenceId = 1 var transportSequenceId = 1
lateinit var t104: ByteArray
} }
class ReserveUinInfo( class ReserveUinInfo(
......
...@@ -8,7 +8,7 @@ import net.mamoe.mirai.qqandroid.network.io.JceInput ...@@ -8,7 +8,7 @@ import net.mamoe.mirai.qqandroid.network.io.JceInput
import net.mamoe.mirai.qqandroid.network.protocol.jce.RequestPacket import net.mamoe.mirai.qqandroid.network.protocol.jce.RequestPacket
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.OnlinePush import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.OnlinePush
import net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket import net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket
import net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket //import net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket
import net.mamoe.mirai.utils.DefaultLogger import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiLogger import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.cryptor.adjustToPublicKey import net.mamoe.mirai.utils.cryptor.adjustToPublicKey
...@@ -50,7 +50,6 @@ internal val PacketLogger: MiraiLogger = DefaultLogger("Packet") ...@@ -50,7 +50,6 @@ internal val PacketLogger: MiraiLogger = DefaultLogger("Packet")
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf( internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
LoginPacket, LoginPacket,
SvcReqRegisterPacket,
OnlinePush.PbPushGroupMsg OnlinePush.PbPushGroupMsg
) { ) {
......
...@@ -26,6 +26,27 @@ import net.mamoe.mirai.utils.io.discardExact ...@@ -26,6 +26,27 @@ import net.mamoe.mirai.utils.io.discardExact
@UseExperimental(ExperimentalUnsignedTypes::class) @UseExperimental(ExperimentalUnsignedTypes::class)
internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wtlogin.login") { internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wtlogin.login") {
object SubCommand2 {
private const val appId = 16L
private const val subAppId = 537062845L
@UseExperimental(MiraiInternalAPI::class)
operator fun invoke(
client: QQAndroidClient,
captchaSign: ByteArray,
captchaAnswer: String
): OutgoingPacket = buildLoginOutgoingPacket(client, bodyType = 2) { sequenceId ->
writeSsoPacket(client, subAppId, commandName, sequenceId = sequenceId) {
writeOicqRequestPacket(client, EncryptMethodECDH7(client.ecdh), 0x0810) {
t2(captchaAnswer, captchaSign, 0)
t8(2052)
t104(client.t104)
t116(150470524, 66560)
}
}
}
}
object SubCommand9 { object SubCommand9 {
private const val appId = 16L private const val appId = 16L
private const val subAppId = 537062845L private const val subAppId = 537062845L
...@@ -180,12 +201,16 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt ...@@ -180,12 +201,16 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
) : LoginPacketResponse() ) : LoginPacketResponse()
sealed class Captcha : LoginPacketResponse() { sealed class Captcha : LoginPacketResponse() {
lateinit var answer: String
class Slider( class Slider(
val data: IoBuffer val data: IoBuffer,
val sign: ByteArray
) : Captcha() ) : Captcha()
class Picture( class Picture(
val data: IoBuffer val data: IoBuffer,
val sign: ByteArray
) : Captcha() ) : Captcha()
} }
} }
...@@ -240,17 +265,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt ...@@ -240,17 +265,15 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
"36" -> { "36" -> {
//图片验证 //图片验证
DebugLogger.debug("是一个图片验证码") DebugLogger.debug("是一个图片验证码")
bot.client.t104 = tlvMap[0x104]!!
val imageData = tlvMap[0x105]!!.toReadPacket() val imageData = tlvMap[0x105]!!.toReadPacket()
println(tlvMap[0x105]!!.toUHexString())
val signInfoLength = imageData.readShort() val signInfoLength = imageData.readShort()
val picLength = imageData.readShort() imageData.discardExact(2)//image Length
val sign = imageData.readBytes(signInfoLength.toInt()) val sign = imageData.readBytes(signInfoLength.toInt())
val tv104 = tlvMap[0x104]!! return LoginPacketResponse.Captcha.Picture(
val ssoSign = // data = imageData.readRemainingBytes().toIoBuffer(),
bot.configuration.captchaSolver.invoke( sign = sign
bot, )
imageData.readRemainingBytes().toIoBuffer()
)
} }
else -> { else -> {
error("UNKNOWN CAPTCHA QUESTION: $question") error("UNKNOWN CAPTCHA QUESTION: $question")
......
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