如何让多个脚本共用单个Telethon会话?解决会话冲突问题
解决Telethon多脚本共用会话的问题
为啥会出问题?
- SQLite锁冲突:Telethon默认用SQLite存储会话数据,这个数据库是单文件级别的锁,多个进程同时读写同一个会话文件,必然触发
database is locked报错。 - 会话凭证冲突:直接复制会话文件等于复用同一个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(持续监听消息):
这种方式下,两个客户端是独立的登录实例,Telegram允许同一个账号同时登录多个客户端,互相不会影响——脚本1断开后,脚本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()
方法2:用主进程+IPC(进阶)
如果非要用文件形式的会话,别复制文件,而是让一个脚本当主进程维护会话,另一个脚本通过进程间通信(比如队列、管道)给主进程发任务请求,由主进程执行操作。这种方式彻底避免多进程碰同一个会话文件的问题,但实现起来比方法1复杂,适合有特定需求的场景。
必看注意点
- 绝对不要复制会话文件复用,服务器会把它们当成同一个登录会话,断一个全断。
- 两个脚本的API ID和API Hash必须完全一致,不然会认证失败。
- 用会话字符串的时候,别把字符串泄露出去,这相当于你的登录凭证。
内容的提问来源于stack exchange,提问作者Tacco
相关产品推荐
相关产品推荐

