使用go-tdlib时持续卡在authorizationsStateWaitPhoneNumber状态求助
看起来你遇到的核心问题是授权逻辑没有处理需要用户交互的状态,加上第三次重启后tdlib本地数据库的状态可能异常,导致程序一直卡在等待手机号的状态却没有触发输入流程。
问题分析
你的代码里只是循环调用client.Authorize()并打印状态,但tdlib的Authorize()方法不会自动处理需要用户输入的场景(比如手机号、验证码、两步验证密码)。当处于authorizationsStateWaitPhoneNumber状态时,程序需要主动提示用户输入手机号,并调用对应的tdlib API提交信息,而不是单纯循环等待状态变化。
至于第三次重启后才出现问题,大概率是前两次的授权流程没有正常完成,或者本地数据库保存的状态异常,导致tdlib重启后认为需要重新提交手机号,但你的程序没有处理这个交互步骤,所以陷入死循环。
修复方案
修改授权循环逻辑,针对不同的授权状态做对应处理,让程序能响应输入请求:
attempt := 0 for ; currentState.GetAuthorizationStateEnum() != tdlib.AuthorizationStateReadyType; currentState, err = client.Authorize() { if err != nil { log.Fatalf("Authorize error: %+v\n", err) } fmt.Printf("Current auth state: %+v\n", currentState) switch state := currentState.(type) { case *tdlib.AuthorizationStateWaitPhoneNumber: // 提示用户输入国际格式手机号 fmt.Print("请输入手机号(国际格式,例如+8613800138000): ") var phoneNumber string _, err := fmt.Scanln(&phoneNumber) if err != nil { log.Fatalf("读取手机号失败: %v", err) } // 提交手机号到tdlib _, err = client.SetAuthenticationPhoneNumber(phoneNumber, &tdlib.SendCodeSettings{ AllowFlashCall: false, IsCurrentPhoneNumber: false, AllowMissedCall: false, AllowSmsRetrieverAPI: false, }) if err != nil { log.Fatalf("提交手机号失败: %v", err) } case *tdlib.AuthorizationStateWaitCode: // 提示用户输入验证码 fmt.Print("请输入验证码: ") var code string _, err := fmt.Scanln(&code) if err != nil { log.Fatalf("读取验证码失败: %v", err) } // 提交验证码 _, err = client.CheckAuthenticationCode(code) if err != nil { log.Fatalf("验证验证码失败: %v", err) } case *tdlib.AuthorizationStateWaitPassword: // 处理两步验证密码 fmt.Print("请输入两步验证密码: ") var password string _, err := fmt.Scanln(&password) if err != nil { log.Fatalf("读取密码失败: %v", err) } // 提交密码 _, err = client.CheckAuthenticationPassword(password) if err != nil { log.Fatalf("验证密码失败: %v", err) } case *tdlib.AuthorizationStateReady: // 授权完成,退出循环 break default: log.Printf("未处理的授权状态: %T", state) attempt += 1 time.Sleep(5000 * time.Millisecond) } if attempt >= MaxAttempt { log.Fatalf("授权尝试次数超出上限") } }
额外排查建议
- 清理异常数据库:如果是数据库状态导致的问题,可以删除
./tdlib-db目录,重新运行程序从头开始授权。 - 确保终端可交互:如果程序在后台运行或没有分配终端,会导致无法读取输入,建议在交互式终端中测试。
- 提升日志级别:把
tdlib.SetLogVerbosityLevel(1)改成3,查看errors.txt中的详细日志,确认授权失败的具体原因。
内容的提问来源于stack exchange,提问作者Jian-Hua He
相关产品推荐
相关产品推荐

