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

如何让多个脚本共用单个Telethon会话?解决会话冲突问题

解决Telethon多脚本共用会话的问题

为啥会出问题?

  1. SQLite锁冲突:Telethon默认用SQLite存储会话数据,这个数据库是单文件级别的锁,多个进程同时读写同一个会话文件,必然触发database is locked报错。
  2. 会话凭证冲突:直接复制会话文件等于复用同一个Telegram登录凭证,服务器会把两个脚本当成同一个登录实例——你断开其中一个,服务器就会把另一个也踢下线,自然事件处理器就停了。

正确的解决办法

方法1:用会话字符串替代文件共享

先把已有的会话导出成字符串,两个脚本各自用这个字符串初始化客户端,完全绕开文件锁和会话冲突:

  • 先在任意已登录的脚本里导出会话字符串:
    from telethon import TelegramClient
    
    client = TelegramClient('原会话文件名', API_ID, API_HASH)
    client.start()
    print(client.export_session_string())  # 复制输出的字符串备用
    
  • 脚本1(一次性任务):
    from telethon import TelegramClient
    
    # 替换成你导出的会话字符串
    SESSION_STR = "1A2B3C..."
    client = TelegramClient(session=SESSION_STR, api_id=API_ID, api_hash=API_HASH)
    
    async def do_once_task():
        # 这里写你的一次性任务逻辑
        await client.send_message('自己', '一次性任务搞定')
        await client.disconnect()
    
    with client:
        client.loop.run_until_complete(do_once_task())
    
  • 脚本2(持续监听消息):
    from telethon import TelegramClient, events
    
    SESSION_STR = "1A2B3C..."  # 和上面用同一个会话字符串
    client = TelegramClient(session=SESSION_STR, api_id=API_ID, api_hash=API_HASH)
    
    @client.on(events.NewMessage(chats='自己'))
    async def msg_handler(event):
        await event.reply('收到消息啦')
    
    client.start()
    client.run_until_disconnected()
    
    这种方式下,两个客户端是独立的登录实例,Telegram允许同一个账号同时登录多个客户端,互相不会影响——脚本1断开后,脚本2的监听完全不受影响。

方法2:用主进程+IPC(进阶)

如果非要用文件形式的会话,别复制文件,而是让一个脚本当主进程维护会话,另一个脚本通过进程间通信(比如队列、管道)给主进程发任务请求,由主进程执行操作。这种方式彻底避免多进程碰同一个会话文件的问题,但实现起来比方法1复杂,适合有特定需求的场景。

必看注意点

  • 绝对不要复制会话文件复用,服务器会把它们当成同一个登录会话,断一个全断。
  • 两个脚本的API ID和API Hash必须完全一致,不然会认证失败。
  • 用会话字符串的时候,别把字符串泄露出去,这相当于你的登录凭证。

内容的提问来源于stack exchange,提问作者Tacco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:32:32