一个基于 Playwright 的 ChatGPT 对话批量导出工具,支持将对话导出为高质量 Markdown 格式。采用 API 优先提取策略,无损保留原生 Markdown 格式、LaTeX 公式与 Web Search 引用链接。
- API 优先提取:直接调用 ChatGPT 后台 API 获取纯净 JSON 消息树,毫秒级完成单条对话导出,100% 保留原生 Markdown 格式(超链接、表格、代码块等)。当 API 不可用时,自动降级为 DOM 渲染抓取。
- LaTeX 公式统一:自动将 ChatGPT 混杂输出的
\(...\)、\[...\]统一转换为标准$...$/$$...$$格式,兼容 Obsidian、GitHub 等主流 Markdown 渲染器。 - Web Search 引用映射:精准解析 ChatGPT 深度搜索中的内部引用标记(如
citeturn0search14),自动映射到对应 URL 并清理utm_source等追踪参数,输出干净的[来源](url)链接。 - Deep Research 最终报告提取:针对 Deep Research 这类带嵌入式 Widget 的对话,自动跳过工具启动 JSON 与中间状态,直接提取最终研究报告正文及其引用链接。
- Custom GPT & Canvas 支持:兼容自定义 GPT 对话和 Canvas 学习模式,正确提取各类特殊内容。
- 批量导出 & 容错:支持全量导出、指定 URL 或从文件读取列表。每条对话有独立的错误边界,单条失败不影响其余导出。
- 智能登录检测:自动判断登录状态,首次运行时引导手动登录,登录状态持久化保存。
确保你已经安装了 Node.js (建议 v16+)。
npm install全量导出模式(推荐):
node export_chatgpt.js --all指定链接导出:
node export_chatgpt.js --urls "https://chatgpt.com/c/xxxx,https://chatgpt.com/c/yyyy"从文件导入链接列表:
node export_chatgpt.js --file urls.txt首次运行时,脚本会启动一个 Chrome 窗口。请在弹出的窗口中手动登录 ChatGPT,登录成功后脚本会自动继续。登录状态保存在本地临时目录中,后续运行无需重复登录。
如果你怀疑本地保存的登录状态已经异常,比如被重定向到 workspace/deactivated、明明没登录却被误判为已登录,建议临时切换到新的浏览器 profile 目录后再运行:
$env:CHATGPT_EXPORT_PROFILE_DIR='E:\temp\chatgpt_export\.chatgpt-profile-new'
node export_chatgpt.js --all你可以在 export_chatgpt.js 顶部的 CONFIG 对象中修改配置:
const CONFIG = {
OUTPUT_DIR: './chatgpt_export', // 导出文件保存目录
DELAY_BETWEEN_CONVERSATIONS: 2000, // 对话间延迟(毫秒),防风控
PAGE_LOAD_TIMEOUT: 30000, // 页面加载超时(毫秒)
LOGIN_TIMEOUT: 300000, // 登录等待超时(毫秒),5 分钟
PROFILE_DIR: process.env.CHATGPT_EXPORT_PROFILE_DIR || path.join(process.env.TEMP || '/tmp', 'chatgpt-export-profile'),
// PROFILE_DIR = 浏览器 profile 目录,用来保存 Cookie / 登录态 / 本地缓存
};- API 通道(优先):通过
/api/auth/session获取 AccessToken,再调用/backend-api/conversation/{id}获取完整消息树。速度快、格式无损,并会额外解析 Deep Research / Widget 对话里的最终报告节点。 - DOM 通道(降级):当 API 不可用时(如接口变更),自动切换到页面 DOM 解析,通过 KaTeX annotation 还原公式、遍历 DOM 提取超链接等。
ChatGPT 的对话数据以树状结构(mapping)存储,脚本从根节点递归遍历,只提取 user 和 assistant 角色的有效消息,过滤掉 system 和 tool 等辅助节点。
- 隐私安全:所有数据仅保存在你本地的
chatgpt_export目录下,不会上传到任何服务器。 - 风控防范:脚本内置了对话间延迟,
--all模式下逐条导出时会自动等待,大批量导出建议保持默认 2 秒间隔。 - 公式渲染:导出的 Markdown 文件针对 Obsidian 进行了优化,也兼容 GitHub 和其他支持 KaTeX/MathJax 的渲染器。
MIT

