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