You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时运行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,无法累计计数,切换逻辑也不支持循环复用账号。

修复步骤:

  1. 定义全局计数变量和客户端列表,统一管理发送账号
  2. 使用取模运算实现循环切换逻辑
  3. 优化异常处理,避免吞掉所有错误信息

修改后的事件处理代码:

# 全局变量:累计发送条数,发送客户端列表
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:01:08