使用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
相关产品推荐
相关产品推荐

