把
chat.deepseek.com上你自己账号 的对话历史一键导出为 JSON / Markdown / ZIP,零外联、零持久化、纯本地运行,开箱即用的 Tampermonkey 单文件脚本。
背景
DeepSeek 网页版的「历史对话」只能在浏览器里滚动查看,没有官方导出按钮。一旦账号异常、被风控、或者网页改版,这些对话就再也找不回来了。
更现实的问题是:很多人会把 DeepSeek 当成第二大脑------长文写作、技术方案、学习笔记、代码片段------但这些内容的唯一副本只存在云端。这种状态对长期使用 AI 的人来说,既不安心也不可持续。
于是就有了这个脚本。目标很朴素:
- 能拿回自己的数据------只读 API,只动自己的账号
- 跑在本地------不上传任何第三方服务器,Token 仅存在内存
- 零依赖------单文件 JS,不需要 Python / Node / 浏览器扩展之外的任何东西
- 格式可选------JSON 留底、Markdown 给人和 LLM 读、ZIP 打包分门别类
核心特性
| 维度 | 说明 |
|---|---|
| 🔒 零外联 | 所有请求走页面原生 fetch(自动带 Cookie),不引入任何第三方服务 |
| 💾 零持久化 | Bearer Token 只存在内存里,关 tab 即失 |
| 🚫 不绕 PoW | 只调用只读接口(/users/current · /chat_session/fetch_page · /chat/history_messages) |
| 🐢 礼貌限速 | 每 5 个会话停 800ms,防止触发风控 |
| 📊 进度实时 | 右下角浮窗 + 模态面板,单调递增进度条 |
| 📦 多格式导出 | JSON 完整结构 / Markdown 易读排版(保留思考过程、工具调用)/ 每会话独立 ZIP 打包 |
| 🔄 全量拉取 | 用 keyset cursor 翻到底,20000 会话硬上限 |
| ⚡ 单会话秒出 | 从 URL 拿当前会话 ID,跳过列表查询,适合测试 |
| 🧪 测试 ZIP | 前 5 个会话打包,几秒出结果,验证格式无误再跑全量 |
| 🧭 路由自适应 | 监听 SPA 路由变化,按钮自动启用 / 禁用 |
快速开始
第 1 步:安装 Tampermonkey
浏览器扩展商店搜索 Tampermonkey(Chrome · Edge · Firefox 都支持)。
第 2 步:安装脚本
打开 GitHub 仓库根目录的 deepseek-exporter.user.js → 全选复制 → Tampermonkey 控制面板「实用工具」→「从剪贴板导入」。
或者直接 Tampermonkey 新建一个脚本,把文件内容粘贴保存即可。
第 3 步:启动导出
- 打开 https://chat.deepseek.com/
- 在左栏点开 1~2 个对话 (让浏览器发出带
Authorization头的 fetch,脚本会被动捕获 Token) - 点击右下角 📥 浮窗 → 选你要的格式 → 等待下载
💡 首次推荐流程 :打开任一对话 → 点
⚡ 当前 Markdown→ 几秒后下载 → 打开看字段是否识别正确 → 验证 OK 再跑全量。
使用说明
浮窗面板上一共 8 个按钮,按"范围 × 格式"两两组合,没有学习成本:
| 按钮 | 范围 | 格式 | 用途 |
|---|---|---|---|
| 全量合并 1 个 JSON | 全量 | JSON | 把所有会话合并到单文件,结构最完整 |
| 全量合并 1 个 Markdown | 全量 | Markdown | 所有会话合并到单文件,人类可读 |
| 📦 全量逐个 ZIP (JSON) | 全量 | ZIP | 每会话独立 .json + manifest.json 打包 |
| 📦 全量逐个 ZIP (Markdown) | 全量 | ZIP | 每会话独立 .md + manifest.json 打包 |
| ⚡ 当前 1 个 JSON | 当前会话 | JSON | 跳过列表查询,秒出结果 |
| ⚡ 当前 1 个 Markdown | 当前会话 | Markdown | 同上,Markdown 格式 |
| 🧪 测试 ZIP (前 5 个 JSON) | 前 5 | ZIP | 几秒出结果,验证 ZIP 格式 |
| 🧪 测试 ZIP (前 5 个 MD) | 前 5 | ZIP | 同上,Markdown 格式 |
ZIP 文件结构
解压 deepseek-all-YYYYMMDD-HHMM-per-session.zip 后:
text
deepseek-all-20260707-1300-per-session.zip
├── manifest.json ← 导出元信息(用户、时间、范围)
├── 001-标题1--fa5d16f5.md
├── 002-标题2--35313c17.md
└── ...
文件名规则:编号-标题消毒后--会话ID前8位.{json|md},可以直接拖进任何笔记软件。
工作原理
整体架构非常薄,总共四步:
text
┌────────────┐ ① hook fetch ┌──────────────────┐
│ 页面原生 │ ◀────────────────── │ Tampermonkey │
│ fetch │ ── 捕获 Bearer ────▶│ 脚本 │
└─────┬──────┘ └────────┬─────────┘
│ │
│ ② 用捕获的 Token 调只读 API │
▼ │
┌──────────────────────────────────┐ │
│ chat.deepseek.com/api/v0/* │ │
│ - /users/current │ │
│ - /chat_session/fetch_page │ │
│ - /chat/history_messages │ │
└────────┬─────────────────────────┘ │
│ │
│ ③ 返回 JSON │
▼ ▼
┌──────────────────┐ ┌──────────────────────┐
│ 内存组装数据 │ ──────▶ │ GM_download / <a> │
│ 生成 ZIP / MD │ │ 触发浏览器下载 │
└──────────────────┘ └──────────────────────┘
几个值得一提的实现细节
Token 捕获 :unsafeWindow.fetch 钩子 + XMLHttpRequest.setRequestHeader 兜底,从 Authorization: Bearer ... 被动取出 Token。不弹窗、不要求用户复制粘贴,打开对话就自动捕获。
会话分页 :用上一页最后一项 (pinned, updated_at, id) 作 keyset cursor 构造下一页请求,5 个独立终止条件:
js
// (a) 本页 < page_size ─── 已经是最后一页
// (b) bz.has_more === false ─── 服务器明确告诉结束
// (c) 全部重复 (added==0) ─── 游标失效自保
// (d) 页数 > 200 ─── 20000 兜底,防止死循环
// (e) limit > 0 && out.length >= limit ─── 测试模式到顶就停
ZIP 打包 :内联 STORE-only zip 写入器 + CRC32,零依赖,不引入 JSZip。设置 General Purpose Bit Flag 的 EFS 位(bit 11)标记文件名 UTF-8,WinRAR / Windows Explorer / macOS Archive Utility 全部按 UTF-8 解析,中文不乱码。
下载兼容 :Blob → data: URL → GM_download,失败回退到原生 <a download>,两边都试过才认输。
超时控制 :每次 API 调用 15s AbortController 超时 + console 探针,卡死时能在控制台看到 [DS-Exporter] → / ✓ / ✗ 日志,定位到具体哪个接口、哪条消息。
安全与合规
⚠️ 本工具仅用于备份你自己账号的数据 。任何滥用------批量抓取他人账号、绕过 DeepSeek 鉴权、向第三方分发抓取的数据------都违反 DeepSeek ToS 与《数据安全法》第 21/27 条,与作者无关。
数据流承诺
- ✅ Token 仅在内存存在,永远不会 写入
localStorage/ IndexedDB / Cookie - ✅ 脚本仅在
chat.deepseek.com上激活(@match强制) - ✅ 不发起任何跨域请求,所有外发流量都是发回
chat.deepseek.com的只读接口 - ✅ 开源 MIT,代码可审计
已知 schema 不稳
⚠️ DeepSeek 的
/api/v0/*接口目前没有公开稳定性承诺。如果 schema 改了,脚本会失效。提 issue 时附上控制台的[DS-Exporter] → / ✓ / ✗日志,方便定位。
已知限制
- 20000 会话数硬上限(超过会被分页护栏截断,继续翻页可能拿到重复数据)
- 上传文件只导出
file_info,原始文件二进制需要单独走/file/fetch_uploaded_files history_messages全量回带(cacheControl: REPLACE),不支持断点续传;网络中断需重新开始- 限速影响大账号:单次导出 5 个会话后停 800ms,>5000 会话会跑数分钟
- ZIP 是 STORE-only(不压缩),体积比 7z / zip 压缩模式大约 2-3 倍;如需压缩可用 WinRAR / 7-Zip 二次处理
写在最后
这个脚本的核心思路其实是**"借用浏览器自己的 fetch"**------既不用破解鉴权,也用不到任何第三方服务,只在内存里临时组装一下数据,然后交给 GM_download 触发下载。所有逻辑加起来不到 1100 行 JS,绝大多数都是 UI 进度条和错误处理。
如果你也是 DeepSeek 重度用户,强烈建议现在就导出一次,放进自己的笔记库或者 Git 私有仓。别等到账号异常、网页改版、或者哪天 DeepSeek 改了 ToS 再后悔。
仓库地址:https://github.com/YiShan-X/deepseek-exporter · MIT License · 欢迎提 Issue 和 PR。