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

使用Telethon在线程中请求Telegram验证码未收到问题排查

问题分析与解决方案

一、线程中异步API的使用问题

你的代码里线程结合异步的写法存在潜在问题:

  • 虽然每个线程新建事件循环的逻辑本身可行,但Telethon的TelegramClient在connect后立刻disconnect的短连接场景下,可能因会话状态未完全初始化,导致验证码请求的上下文不完整,影响推送流程。
  • 不要在send_code_request后立刻手动调用disconnect,Telegram的验证码推送可能需要客户端保持短暂连接以确认设备/会话合法性。

修正后的写法建议使用async with上下文管理器,它会自动处理连接和断开,同时为线程设置当前事件循环:

import asyncio
from threading import Thread
from telethon import TelegramClient
from telethon.sessions import StringSession

phone = "+5312345678"
api_id = 12345
api_hash = "xxxxxxxx"

def sync(func):
    def wrapper(*args, **kwargs):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)  # 为线程绑定当前事件循环
        loop.run_until_complete(func(*args, **kwargs))
    return wrapper

@sync
async def main():
    async with TelegramClient(StringSession(), api_id, api_hash) as client:
        res = await client.send_code_request(phone, force_sms=True)  # 强制短信渠道测试
        print("hash:", res.phone_code_hash)

Thread(target=main).start()

二、Telegram侧的拦截/限制问题

如果修正代码后仍收不到验证码,大概率是Telegram的安全限制导致:

  • 共享IP风险:Heroku等云平台的IP属于共享池,很多被用于违规操作,会被Telegram标记为高风险IP,直接拦截验证码推送。
  • 账号状态异常:如果该号码是首次用Telethon登录,或之前有异常登录记录,Telegram会触发安全审核,暂时拒绝发送验证码。
  • 渠道限制:部分地区的号码可能无法接收APP内验证码,强制短信也可能被运营商拦截。

排查步骤:

  • 换用本地IP运行代码,排除云IP的影响。
  • 先用该号码登录官方Telegram客户端,确认账号状态正常后,再尝试用Telethon请求验证码。
  • 切换验证码渠道,比如用voice=True参数请求语音验证码,或再次尝试force_sms=True。

三、其他排查点

  • 确认号码是标准国际格式(带国家码,无多余符号/空格)。
  • 检查api_id和api_hash是否正确,且来自未被限制的Telegram开发者账号。

内容的提问来源于stack exchange,提问作者Asiel Diaz Benitez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:45:33