如何同时运行3个及以上Telegram客户端?(报错解决)
问题解决与代码修复
一、解决sqlite3.OperationalError: database is locked错误
你启动多个客户端时重复使用了同一个session文件名(session1),每个Telegram账号需要独立的session存储文件,多个实例共用同一个SQLite文件会触发数据库锁冲突。
修复方法:
给每个客户端分配唯一的session名称,示例:
# 监听用的主账号 client = TelegramClient('session_listener', api_id, api_hash) client.start() # 发送用的子账号,每个用不同的session名 client1 = TelegramClient('session_sender1', api_id1, api_hash1) client1.start() client2 = TelegramClient('session_sender2', api_id2, api_hash2) client2.start() client3 = TelegramClient('session_sender3', api_id3, api_hash3) client3.start() client4 = TelegramClient('session_sender4', api_id4, api_hash4) client4.start() client5 = TelegramClient('session_sender5', api_id5, api_hash5) client5.start() client6 = TelegramClient('session_sender6', api_id6, api_hash6) client6.start()
二、实现每50条消息循环切换账号的逻辑
你当前代码里的index每次进入事件处理都会重置为0,无法累计计数,切换逻辑也不支持循环复用账号。
修复步骤:
- 定义全局计数变量和客户端列表,统一管理发送账号
- 使用取模运算实现循环切换逻辑
- 优化异常处理,避免吞掉所有错误信息
修改后的事件处理代码:
# 全局变量:累计发送条数,发送客户端列表 total_sent = 0 sender_clients = [client1, client2, client3, client4, client5, client6] MESSAGES_PER_CLIENT = 50 @client.on(events.ChatAction) async def handler(event): global total_sent if event.user_added or event.user_joined: user = await event.get_user() receiver = InputPeerUser(user.id, user.access_hash) try: # 计算当前使用的客户端索引:每50条切换,循环6个账号 client_index = (total_sent // MESSAGES_PER_CLIENT) % len(sender_clients) current_client = sender_clients[client_index] await current_client.send_message(receiver, message) print(f'客户端{client_index+1}发送消息成功!累计发送:{total_sent+1}条') total_sent += 1 except Exception as e: print(f'发送失败:{str(e)}')
三、额外优化建议
- 确保每个账号的api_id和api_hash独立有效,不要混用
- 遵守Telegram API频率限制,避免短时间发送大量消息导致账号受限
- 改用异步启动方式,提升多客户端稳定性:
import asyncio async def main(): await client.start() await client1.start() await client2.start() await client3.start() await client4.start() await client5.start() await client6.start() await client.run_until_disconnected() if __name__ == '__main__': asyncio.run(main())
内容的提问来源于stack exchange,提问作者Pekea
相关产品推荐
相关产品推荐

