使用Telethon导出Telegram聊天记录出现TakeoutInvalidError求助
错误原因确认
你的推测完全正确,TakeoutInvalidError的官方触发逻辑就是Telegram服务端同一时间仅允许单个活跃的takeout数据导出会话,只要存在其他未结束的导出会话,新的takeout请求就会被拒绝。常见的会话残留场景包括:
- 你在Telegram桌面/手机/网页端发起了官方数据导出任务,还未完成或未手动取消
- 之前的代码运行时被强制中断、网络波动,导致没有正常调用接口关闭takeout会话,残留了无效的活跃会话记录
- 同时运行了多个调用takeout接口的代码进程
解决方案
1. 排查并取消其他导出任务
先检查所有端的Telegram官方导出状态:进入「设置-高级-数据导出」,如果有正在进行的导出任务,要么等待完成,要么手动点击取消,等待1-2分钟后再运行代码。
2. 手动清空残留的无效takeout会话
如果确认没有正在运行的官方导出,可调用Telegram接口强制取消所有现存的takeout会话,在运行你的导出函数前先执行以下代码即可:
from telethon import functions # 传入你已经初始化完成的TelegramClient实例即可 async def cancel_old_takeout_sessions(client): await client(functions.account.CancelTakeoutSessionRequest())
3. 优化代码逻辑避免会话残留
你原本的代码有两处可优化点,修改后可以大幅降低会话残留概率:
- 补充缺失的
min_id参数:你当前代码里的min_id没有作为函数参数传入也没有在函数内定义,属于变量未声明问题,会额外引发运行错误 - 增加异常捕获逻辑,遇到会话失效时自动重试:
import asyncio from telethon.errors import TakeoutInvalidError def chat_message_takeout(chat_id, client: TelegramClient, save_path: str, offset_date: datetime.datetime, min_id: int): try: with client.takeout() as takeout: messages = takeout.iter_messages(entity=chat_id, reverse=True, min_id=min_id, offset_date=offset_date) for message in messages: print(message, '\n') except TakeoutInvalidError: # 先清空旧会话再重试 asyncio.run(cancel_old_takeout_sessions(client)) with client.takeout() as takeout: messages = takeout.iter_messages(entity=chat_id, reverse=True, min_id=min_id, offset_date=offset_date) for message in messages: print(message, '\n')
4. 临时替代方案
如果只是小批量导出聊天记录,不需要大流量的takeout接口权限,可以直接用普通的client.iter_messages()方法调用,不需要创建takeout会话,不会触发该错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

