diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index e9a26dadc..c51aae235 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -43,12 +43,8 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler mainloop@ while (true) { when (response) { 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 + bot.configuration.loginSolver.onSolveUnsafeDeviceLoginVerify(bot, response.url) + response = LoginPacket.SubCommand9(bot.client).sendAndExpect() } is Captcha -> when (response) { @@ -73,7 +69,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler is Error -> error(response.toString()) - is SMSVerifyCodeNeeded -> { + is DeviceLockLogin -> { response = LoginPacket.SubCommand20( bot.client, response.t402, diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt index fc71737ce..5dbfc2b27 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt @@ -300,7 +300,7 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt class UnsafeLogin(val url: String) : LoginPacketResponse() - class SMSVerifyCodeNeeded(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() + class DeviceLockLogin(val t402: ByteArray, val t403: ByteArray) : LoginPacketResponse() } @InternalAPI @@ -336,10 +336,10 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>("wt private fun onSMSVerifyNeeded( tlvMap: TlvMap, bot: QQAndroidBot - ): LoginPacketResponse.SMSVerifyCodeNeeded { + ): LoginPacketResponse.DeviceLockLogin { bot.client.t104 = tlvMap.getOrFail(0x104) println("403: " + tlvMap[0x403]?.toUHexString()) - return LoginPacketResponse.SMSVerifyCodeNeeded(tlvMap[0x402]!!, tlvMap.getOrFail(0x403)) + return LoginPacketResponse.DeviceLockLogin(tlvMap[0x402]!!, tlvMap.getOrFail(0x403)) } private fun onUnsafeDeviceLogin(tlvMap: TlvMap): LoginPacketResponse.UnsafeLogin { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt index b86e4607e..913270bed 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt @@ -13,9 +13,7 @@ abstract class LoginSolver { abstract suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? - abstract suspend fun onGetPhoneNumber(): String - - abstract suspend fun onGetSMSVerifyCode(): String + abstract suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? } /** diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/DefaultCaptchaSolverJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/DefaultCaptchaSolverJvm.kt index 5d0c049a3..4266a8898 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/DefaultCaptchaSolverJvm.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/DefaultCaptchaSolverJvm.kt @@ -52,44 +52,34 @@ class DefaultLoginSolver : LoginSolver() { } } bot.logger.info("请输入 4 位字母验证码. 若要更换验证码, 请直接回车") - return readLine()?.takeUnless { it.isEmpty() || it.length != 4 } + return readLine()?.takeUnless { it.isEmpty() || it.length != 4 }.also { + bot.logger.info("正在提交[" + it +"]中...") + } } } override suspend fun onSolveSliderCaptcha(bot: Bot, url: String): String? { bot.logger.info("需要滑动验证码") bot.logger.info("请在任意浏览器中打开以下链接并完成验证码. ") + bot.logger.info("完成后请输入任意字符 ") bot.logger.info(url) - return readLine() - } - - override suspend fun onGetPhoneNumber(): String { - loginSolverLock.withLock { - while (true) { - MiraiLogger.info("请输入你的手机号码") - val var0 = readLine() - if (var0 !== null && var0.length > 10) { - return var0; - } - } + return readLine().also { + bot.logger.info("正在提交中...") } - return ""; } - override suspend fun onGetSMSVerifyCode(): String { - loginSolverLock.withLock { - while (true){ - MiraiLogger.info("请输入你刚刚收到的手机验证码[6位数字]") - val var0 = readLine() - if(var0!==null && var0.length == 6){ - return var0; - } - } + override suspend fun onSolveUnsafeDeviceLoginVerify(bot: Bot, url: String): String? { + bot.logger.info("需要进行账户安全认证") + bot.logger.info("该账户有[设备锁]/[不常用登陆地点]/[不常用设备登陆]的问题") + bot.logger.info("完成以下账号认证即可成功登陆|理论本认证在mirai每个账户中最多出现1次") + bot.logger.info("请将该链接在QQ浏览器中打开并完成认证, 成功后输入任意字符") + bot.logger.info("这步操作将在后续的版本中优化") + bot.logger.info(url) + return readLine().also { + bot.logger.info("正在提交中...") } - return ""; } - } // Copied from Ktor CIO