1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-17 09:09:23 +08:00

Android login Captcha complete

This commit is contained in:
jiahua.liu 2020-01-26 17:30:45 +08:00
parent 77e25ec863
commit 0d6582fb00
2 changed files with 27 additions and 1 deletions
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network

View File

@ -34,6 +34,14 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
bot.logger.info("Trying login")
when (val response: LoginPacket.LoginPacketResponse = LoginPacket.SubCommand9(bot.client).sendAndExpect()) {
is UnsafeLogin -> {
bot.logger.info("Login unsuccessful, device auth is needed")
bot.logger.info("登陆失败, 原因为非常用设备登陆")
bot.logger.info("Open the following URL in QQ browser and complete the verification")
bot.logger.info("将下面这个链接在QQ浏览器中打开并完成认证后尝试再次登陆")
bot.logger.info(response.url)
return
}
is Captcha -> when (response) {
is Captcha.Picture -> {
bot.logger.info("需要图片验证码")

View File

@ -112,7 +112,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
isGuidFromFileNull = false,
isGuidAvailable = true,
isGuidChanged = false,
guidFlag = guidFlag(GuidSource.FROM_STORAGE, MacOrAndroidIdChangeFlag.NoChange),
guidFlag = guidFlag(GuidSource.FROM_STORAGE, MacOrAndroidIdChangeFlag(0)),
buildModel = client.device.model,
guid = client.device.guid,
buildBrand = client.device.brand,
@ -215,6 +215,10 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
val sign: ByteArray
) : Captcha()
}
class UnsafeLogin(val url: String) : LoginPacketResponse()
class DeviceLockLogin() : LoginPacketResponse()
}
@InternalAPI
@ -239,10 +243,24 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt
0 -> onLoginSuccess(tlvMap, bot)
1, 15 -> onErrorMessage(tlvMap)
2 -> onSolveLoginCaptcha(tlvMap, bot)
-96 -> onUnsafeDeviceLogin(tlvMap, bot)
-52 -> onDeviceLockLogin(tlvMap, bot)
else -> error("unknown login result type: $type")
}
}
private fun onDeviceLockLogin(tlvMap: Map<Int, ByteArray>, bot: QQAndroidBot): LoginPacketResponse.DeviceLockLogin {
println(tlvMap[0x104]!!.toUHexString())
println(tlvMap[0x402]!!.toUHexString())
println(tlvMap[0x403]!!.toUHexString())
return LoginPacketResponse.DeviceLockLogin();
}
private fun onUnsafeDeviceLogin(tlvMap: Map<Int, ByteArray>, bot: QQAndroidBot): LoginPacketResponse.UnsafeLogin {
return LoginPacketResponse.UnsafeLogin(tlvMap[0x204]!!.toReadPacket().readRemainingBytes().encodeToString())
}
private fun onErrorMessage(tlvMap: Map<Int, ByteArray>): LoginPacketResponse.Error {
return tlvMap[0x146]?.toReadPacket()?.run {
readShort() // ver