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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:27:01