无活跃会话设备如何获取Telethon二维码授权登录令牌?
Telethon无本地活跃会话时获取二维码登录令牌的方法
首先明确核心误区:调用接口要求提前建立连接,不等于要求提前完成账号授权,这是很多刚接触Telethon二维码登录的开发者最容易混淆的点。
- 核心概念区分:
Telethon和Telegram服务器的交互分两个完全独立的阶段:- 基础连接阶段:客户端和Telegram的MTProto服务器完成网络握手,建立加密传输通道,这个阶段不需要任何账号身份、不需要登录态,哪怕你从来没在这个设备上登过账号也能完成
- 授权登录阶段:在建立好的连接上,通过手机号验证码、二维码、密码等方式完成身份校验,拿到账号的会话授权,后续才能调用账号相关的业务接口
官方文档标注的「调用方法前必须先建立连接」,指的是完成第一步的基础网络连接,完全不需要提前走到第二步的授权阶段。
- 无活跃会话下的二维码令牌获取流程:
- 初始化
TelegramClient实例,会话文件路径可以填一个本地不存在的新文件名,不需要提前准备已有会话 - 显式调用
connect()方法完成和Telegram服务器的基础连接,这一步不需要任何账号相关的输入 - 直接调用
auth.ExportLoginTokenRequest接口即可拿到二维码登录令牌,不需要提前登录 - 将返回的token拼接为
tg://login?token={base64编码处理后的token}格式的内容,生成二维码给已授权设备扫描 - 轮询接口等待扫码确认,扫码通过后客户端会自动完成授权,把会话保存到本地文件,后续就可以正常调用其他账号接口了
- 初始化
- 可直接运行的参考代码:
import asyncio import base64 from telethon import TelegramClient, functions from telethon.errors import SessionPasswordNeededError # 替换为你自己申请的api_id和api_hash API_ID = 123456 API_HASH = "your_api_hash_here" # 新会话文件名,本地不存在会自动创建 SESSION_NAME = "qr_login_new_session" client = TelegramClient(SESSION_NAME, API_ID, API_HASH) async def main(): # 第一步:建立基础连接,无任何登录要求 await client.connect() # 第二步:导出二维码登录令牌,未登录状态可直接调用 login_token = await client(functions.auth.ExportLoginTokenRequest( api_id=API_ID, api_hash=API_HASH, except_ids=[] # 未登录状态传空列表即可 )) # 拼接为Telegram可识别的登录链接 qr_url = f"tg://login?token={base64.urlsafe_b64encode(login_token.token).decode('utf-8').rstrip('=')}" print("请使用已登录Telegram账号的移动端扫描以下链接生成的二维码:") print(qr_url) # 等待扫码完成 try: await client.qr_login_wait(login_token) print("登录成功!") except SessionPasswordNeededError: # 账号开启两步验证时需要额外输入密码 password = input("请输入账号两步验证密码:") await client.sign_in(password=password) print("两步验证通过,登录成功!") if __name__ == "__main__": asyncio.run(main())
补充说明:官方示例里的
except_ids=[42]只是示例占位,未登录状态下这个参数传空列表即可,作用是排除指定的已登录设备id,避免把登录通知发给这些设备。
内容的提问来源于stack exchange,提问作者Aem Aem
相关产品推荐
相关产品推荐

