Telethon正常模式无法授权,调试模式可用且需保存会话
解决Telethon正常模式授权与会话保存问题
核心问题拆解
- 会话未持久化:
StringSession()是内存临时会话,程序结束后自动丢失,无法留存登录状态 - 密码回显警告:用
input()输入密码会明文显示,触发安全警告且存在风险 - 正常模式授权失败:调试模式可能绕过部分校验,正常模式需严格遵循官方登录流程
解决方案步骤
1. 持久化保存会话
两种常用方案:
- 文件会话(推荐):用本地文件路径初始化客户端,Telethon自动将会话数据保存到文件,下次启动直接加载
- StringSession手动持久化:生成会话字符串后写入本地文件,下次启动时读取加载
2. 消除密码回显警告
用Python标准库getpass的getpass()方法替代input()输入密码,该方法会隐藏输入内容,同时消除Telethon的安全警告
3. 修正正常模式授权流程
调整登录逻辑,适配两步验证场景,确保流程符合Telethon官方规范
完整代码示例
方式一:文件会话(推荐)
from telethon import TelegramClient import getpass api_id = 你的API_ID api_hash = '你的API_HASH' system_version = "4.16.30-vxCUSTOM" # 用文件路径创建客户端,会话自动保存到my_session.session文件 with TelegramClient('my_session', api_id, api_hash, system_version=system_version) as client: phone = input("Enter phone: ") code_request = client.send_code_request(phone) value = input("Enter login code: ") # 安全输入两步验证密码,无明文回显 password = getpass.getpass("Enter 2-step verification password: ") try: client.sign_in(phone, code=value, phone_code_hash=code_request.phone_code_hash, password=password) print("登录成功,会话已自动保存到本地文件") except Exception as e: print(f"登录失败:{str(e)}")
方式二:StringSession手动持久化
from telethon import TelegramClient, StringSession import getpass api_id = 你的API_ID api_hash = '你的API_HASH' system_version = "4.16.30-vxCUSTOM" session_file = 'telegram_session.txt' try: # 尝试读取已保存的会话字符串 with open(session_file, 'r') as f: session_string = f.read().strip() client = TelegramClient(StringSession(session_string), api_id, api_hash, system_version=system_version) client.start() print("已加载保存的会话,无需重新登录") except (FileNotFoundError, Exception): # 首次登录或会话失效,重新授权 with TelegramClient(StringSession(), api_id, api_hash, system_version=system_version) as client: phone = input("Enter phone: ") code_request = client.send_code_request(phone) value = input("Enter login code: ") password = getpass.getpass("Enter 2-step verification password: ") client.sign_in(phone, code=value, phone_code_hash=code_request.phone_code_hash, password=password) # 保存会话字符串到本地文件 session_string = client.session.save() with open(session_file, 'w') as f: f.write(session_string) print(f"登录成功,会话已保存到{session_file}")
关键说明
- 文件会话无需手动管理会话数据,Telethon自动完成存储与加载,更稳定易用
getpass模块彻底解决密码回显问题,同时规避安全风险- 添加异常捕获可以快速定位登录失败原因(如验证码错误、密码错误等)
内容的提问来源于stack exchange,提问作者user11225404
相关产品推荐
相关产品推荐

