You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用go-tdlib时持续卡在authorizationsStateWaitPhoneNumber状态求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:06:08