使用Telethon封装Account类时触发Cannot send requests while disconnected错误
解决Telethon多账户类中ConnectionError的问题
问题根源
- 执行顺序错误:你在
__init__中直接调用run_until_disconnected(),该方法会阻塞线程,导致后续run()方法(事件处理器注册)永远无法执行,客户端没有任何消息处理逻辑。 - 未完成连接流程:手动创建
TelegramClient时,不像with上下文会自动完成登录连接,必须显式调用start()方法完成账户登录,否则客户端处于断开状态,调用run_until_disconnected()会抛出连接错误。 - 事件注册时机错误:消息处理器必须在客户端启动前完成注册,否则无法捕获后续的新消息。
修正后的Account类实现
from telethon import TelegramClient, events class Account: def __init__(self, acc): # 初始化客户端,保留system_version参数避免被识别为非官方客户端 self.client = TelegramClient( acc['name'], acc['api_id'], acc['api_hash'], system_version="4.16.30-vxCUSTOM" ) # 初始化阶段注册消息处理器 self._setup_message_handler() def _setup_message_handler(self): @self.client.on(events.NewMessage(chats=list_channels)) async def my_event_handler(event): # 这里编写你的消息处理逻辑 print(f"收到消息:{event.message.text}") async def run(self): # 先完成登录连接 await self.client.start() # 运行事件循环直到断开 await self.client.run_until_disconnected()
多账户运行示例
Telethon基于异步IO,需用asyncio同时运行多个账户的事件循环:
import asyncio async def main(): # 定义多个账户配置 accounts_config = [ {'name': 'account1', 'api_id': 123456, 'api_hash': 'your_api_hash_1'}, {'name': 'account2', 'api_id': 654321, 'api_hash': 'your_api_hash_2'} ] # 创建账户实例并启动任务 tasks = [] for acc in accounts_config: account = Account(acc) tasks.append(account.run()) await asyncio.gather(*tasks) if __name__ == "__main__": asyncio.run(main())
关键说明
- 保留
system_version参数,避免Telegram服务器识别为非官方客户端导致限制。 - 第一次运行时,每个账户会提示输入手机号和验证码,验证后生成会话文件(对应
acc['name']的文件),后续启动无需重复验证。 - 事件处理器必须在
client.start()前注册,否则无法捕获启动后的新消息。
内容的提问来源于stack exchange,提问作者Default
相关产品推荐
相关产品推荐

