如何跳过Telethon会话无效时的号码/机器人令牌请求?
解决Telethon会话失效时自动弹出输入提示的问题
不需要修改源码,有两种简单方式跳过这个交互式输入请求:
1. 捕获会话失效异常,手动终止流程
Telethon在会话失效需要重新认证时,会抛出AuthorizationError或SessionPasswordNeededError这类异常。你可以在代码里提前捕获这些异常,自定义处理逻辑(比如直接退出程序、记录日志),避免触发默认的交互式输入提示。
示例代码:
from telethon import TelegramClient from telethon.errors import AuthorizationError, SessionPasswordNeededError api_id = 12345 api_hash = 'your_api_hash' session_name = 'my_session' client = TelegramClient(session_name, api_id, api_hash) async def main(): try: await client.start() # 这里写你的业务逻辑 await client.send_message('me', '会话正常') except (AuthorizationError, SessionPasswordNeededError): print('会话已失效,需要重新登录,但已跳过输入提示') # 直接退出或做其他处理 exit(1) with client: client.loop.run_until_complete(main())
2. 自定义客户端类,重写认证请求方法
通过继承TelegramClient,重写负责请求验证码的_request_code方法,让它直接抛出异常而不是弹出输入提示。这样只要会话失效需要重新认证,就会直接触发异常,不会进入交互式流程。
示例代码:
from telethon import TelegramClient from telethon.errors import AuthKeyError class NoPromptTelegramClient(TelegramClient): async def _request_code(self, phone, *args, **kwargs): # 直接抛出异常,跳过输入提示 raise AuthKeyError('会话失效,已跳过输入请求') api_id = 12345 api_hash = 'your_api_hash' session_name = 'my_session' client = NoPromptTelegramClient(session_name, api_id, api_hash) async def main(): try: await client.start() await client.send_message('me', '会话正常') except AuthKeyError as e: print(e) exit(1) with client: client.loop.run_until_complete(main())
如果是使用机器人账号(bot token),初始化客户端时直接传入bot_token参数,会话失效时会直接抛出异常,不会弹出输入提示:
client = TelegramClient(session_name, api_id, api_hash).start(bot_token='your_bot_token')
内容的提问来源于stack exchange,提问作者Marz1k
相关产品推荐
相关产品推荐

