如何将 Claude 对话保存为 Markdown(Artifacts、引用、Projects)
Claude 对话正越来越成为严肃研究和代码工作发生的地方。包含 Artifacts、引用以及数小时来回交流的长线程,往往比你笔记中的任何文档承载着更多的推理。然而 Anthropic 并不提供任何导出功能。没有”以 Markdown 下载”按钮,没有 JSON dump,没有归档端点。一旦一条线程滚出你的侧边栏,回去的唯一方法就是在 claude.ai 上搜索,而它并不总能浮现出你记得的内容。
把 Claude 对话保存为 Markdown 一次解决三件事:你得到一个永久的本地存档,你可以在 Obsidian 或 Notion 中引用过去的推理,并且在切换模型时可以把一个旧的 Claude 线程作为上下文反喂给 ChatGPT 或 Gemini。
本指南涵盖了把 Claude 对话转为干净 Markdown 的所有方法——从一次快速聊天到一条包含 Artifacts 的 200K token 研究线程。
为什么把 Claude 对话保存为 Markdown?
Markdown 是无论一段对话需要去哪里都能用的格式:
- 喂给另一个 LLM ——把旧的 Claude 线程粘贴进 ChatGPT、Gemini 或本地模型,当你想要第二意见或不同的推理风格时
- 放进 Obsidian 或 Notion ——一个对话一个文件,完全可搜索,可从项目笔记里链接
- 引用某个具体回合 ——在 50 回合的线程里找到”Claude 提议重构的那个时刻”,只需一次搜索
- 把 Artifacts 归档为真实文件 ——Claude 构建的代码、文档、React 组件变成一个你可以复制到仓库的代码块
- 保留引用 ——Claude 为其回答做依据的网页搜索结果变成你日后可审计的脚注
2026 年驱动大部分 Claude-to-Markdown 流量的用例是第一个:人们用 Claude 做深度工作,然后想保留输出和推理,而不仅仅是最终答案。
方法 1:Save(最快,一键)
Save 是一个 Chrome 扩展,一键就能把任何 Claude 对话变成 Markdown 文件。它遍历对话 DOM,按顺序提取每一个用户和助手回合,把 Artifacts 提取为带正确语言标识符的代码块,并将引用保留为脚注。
工作方式:
- 在 Chrome 中打开 Claude 对话(支持
claude.ai/chat/...和共享对话链接) - 点击工具栏中的 Save 扩展图标
- 一个
.md文件立即下载(如果已连接 Save Vault,则落入其中)
你能得到什么:
- 对话标题和日期作为 frontmatter
- 每一个用户和助手回合,按顺序,带角色标签(
## You/## Claude) - Claude Artifacts(代码、文档、HTML、React 组件)被提取为带正确语言标识符的代码块
- 回复内的代码块带语言提示
- Claude 的网页搜索结果中的引用作为 Markdown 脚注
- 当 Claude 调用工具时的 tool-use 回合(调用和结果都会出现)
- 当对话在 Claude Project 内且系统提示或知识文件可见时,保留 Project 上下文
被移除的内容:
- Claude.ai 的导航 chrome、侧边栏、模型选择器
- 你未选中的空再生分支
- 内联 UI 元素(“Edit”、“Copy”、“Retry” 按钮)
- 加载骨架和部分流
最适合: 研究者、工程师、AI 用户,任何在 Claude 中跑长线程并想保留工作的人。如果你需要一份干净的对话记录粘贴到另一个模型、归档到 Obsidian 或交给队友,这是最干净的路径。
输出示例
保存一段带 Artifact 的简短 Claude 对话会产生:
---
title: "Refactor my Express middleware into Hono"
url: https://claude.ai/chat/a1b2c3d4-...
model: Claude Opus 4.7
date: 2026-05-22
turns: 6
---
## You
Here's my Express middleware. Can you port it to Hono? I want to keep
the same auth behavior but drop the body-parser dependency.
```js
app.use((req, res, next) => {
if (!req.headers.authorization) return res.sendStatus(401)
// ...
})
Claude
Hono ships JSON parsing in core, so the body-parser dependency goes
away on its own. The middleware shape is almost identical --- c.req
instead of req, and you return instead of calling next().
Here’s the port 1:
import { Hono } from 'hono'
const app = new Hono()
app.use('*', async (c, next) => {
const auth = c.req.header('Authorization')
if (!auth) return c.text('Unauthorized', 401)
await next()
})
那个文件再粘贴一下就是可用的 ChatGPT 上下文,再按一下键就是一份永久的 Obsidian 笔记,里面的 Artifact 再复制一下就能被 commit 到仓库。
## 方法 2:手动复制粘贴
Claude.ai 允许你在对话区中选择文本,像任何网页一样复制。
**步骤:**
1. 滚动到对话顶部
2. 单击拖动选择每一个回合
3. 复制,粘贴到 Markdown 编辑器
4. 手动添加角色标签、修复代码块围栏、重新添加未传过来的 Artifact 内容、重建引用链接
**这种方法的问题:**
- 在长线程中选择整段对话很脆弱——Claude 虚拟化了 DOM,所以滚动会让更早的回合从文档中掉出
- Artifacts 不会作为文本复制;你只能得到占位符或什么都没有
- 代码块失去其语言提示
- 网页搜索引用会以 `[1]` `[2]` 的形式出现,没有目标 URL
- 角色边界崩塌——用户和 Claude 的回合糊成一面文本墙
- 分支对话(你重新生成了某个响应)会一次性把所有分支带来
对 2 回合的交流可行。超过一屏的就崩溃。
## 方法 3:浏览器控制台 + 脚本
对开发者来说,对话数据存在 DOM 里。你可以在 Chrome DevTools 控制台写一个小脚本来遍历它。
```js
const turns = document.querySelectorAll('[data-testid="conversation-turn"]')
const md = Array.from(turns).map(t => {
const role = t.querySelector('[data-role]')?.dataset.role
const body = t.querySelector('.prose')?.innerText
return `## ${role === 'user' ? 'You' : 'Claude'}\n\n${body}`
}).join('\n\n---\n\n')
console.log(md)
最适合: 想对输出做一次性控制的工程师,或需要在多条线程上脚本化批量提取的人。
这种方法的问题:
- 这些选择器不是任何公开 API 的一部分;Anthropic 经常发布 UI 变更,脚本会无预警地坏掉
- Artifacts 渲染在 iframe 或树外的 React portal 里;
innerText抓不到 - 引用存在于初始 DOM 中没有的 tooltip 里
- tool-use 回合的嵌套结构与文本回合不同
- 你必须登录并在对话标签页上;不能作为批处理任务运行
控制环境时的合理逃生通道。不是可以依赖的方法。
方法 4:Anthropic 的 Workbench API(重建对话)
Anthropic API 通过 Messages 端点暴露对话原语,但没有任何端点会返回你过去在 claude.ai 上的对话。API 只看到你通过它发送的对话。要以编程方式重建一条 claude.ai 线程,你得自己重放它。
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-5",
"messages": [{ "role": "user", "content": "..." }]
}'
最适合: 在自己的数据库中存储对话、构建自己的 Claude 包装器的团队。如果你掌控调用,你就掌控导出。
对于”已有对话”用例的问题:
- 过去的 claude.ai 对话通过 API 无法触达
- 需要 API 额度和你自己的存储层
- 对归档你已经在 Web UI 上拥有的线程帮不上忙
- Artifacts 也是 API 的一个特性,但渲染流水线是 Web 应用的,不是 API 的
如果你在做产品,这是正确的方法。如果你在尝试归档昨天的研究线程,这就是错误的方法。
你应该使用哪种方法?
| 场景 | 最佳方法 |
|---|---|
| 归档一条你已有的 Claude 研究线程 | Save ——一键、结构化输出 |
| 把旧的 Claude 对话粘贴进 ChatGPT 或 Gemini | Save ——每个回合,Artifacts 完整 |
| 保留 Claude 为你构建的 Artifact(代码、文档、React) | Save ——以代码块形式提取 |
| 把一条线程放进 Obsidian 与项目笔记并列 | Save ——干净的 frontmatter 和标题 |
| 从零搭建自己的对话日志 | Anthropic API ——如果你掌控调用 |
| 快速粗略复制 2 回合的交流 | 手动复制粘贴 ——免费、快、乱 |
| 带自定义变换的一次性提取 | 控制台脚本 ——如果你熟悉选择器 |
对大多数人——特别是任何把 Claude 用于研究、工程或写作的人——Save 就是答案。它无需任何设置就能产出最干净的 Markdown,并以与单回合聊天相同的速度处理 200K token 的线程。
Save 处理的边缘情况
- Claude Projects。 Project 内的每段对话都被提取为独立文件。当 Project 的系统提示或知识文件在对话头部可见时,Save 会把它们捕获到 frontmatter,这样上下文就不会丢失。
- 多 Artifact 对话。 Claude 构建了三个 Artifacts(例如一个 HTML 页面、一个 React 组件和一个 SQL 模式)的线程,会以每个 Artifact 自己的代码块出现,按出现的顺序,带正确的语言标识符。
- 非常长的对话。 Claude 的 200K 上下文窗口可以产生数百回合、数万字的线程。Save 边滚边流式处理 DOM,因此完整的线程能不丢失早期回合地通过。
- 分支和重新生成的响应。 当你重新生成了一个 Claude 回复时,只有你保留的那个分支(当前显示的)会被导出。被丢弃的分支会被跳过。
- tool-use 回合。 当 Claude 调用工具时——网页搜索、代码执行、computer use——调用和结果都会被捕获为带
tool_use和tool_result标记的代码块,使推理链保持完整。 - 共享对话链接。
claude.ai/share/...的 URL 与你自己的对话工作方式相同。便于归档别人分享给你的线程。 - Computer Use 会话。 仅限于 DOM 中可见的——截图和模型的推理会通过,底层 VM 状态不会。
- Claude Code 对话。 Claude Code 在你的终端而非
claude.ai中运行。对于终端会话,参见 Claude Code + Obsidian 工作流指南,单独捕获它们。
与你的工作流搭配
Markdown 输出在你需要的任何地方都能用:
- ChatGPT / Gemini / 本地模型 ——粘贴文件,对不同模型问后续问题
- Obsidian ——丢进你的 vault,从项目笔记链接它,搜索你曾保存过的每一条 Claude 线程
- Notion ——直接粘贴,标题和 Artifact 代码块正确渲染
- Apple Notes ——通过 Markdown 分享扩展干净导入
- git 仓库 ——直接从代码块把 Artifacts commit 到正确文件
- Save Vault ——如果你连接了一个,每次 Claude save 都会自动落入其中,带反向链接和标签
常见问题
Save 能在共享对话链接上工作吗?
能。claude.ai/share/... 下的任何东西都以与你自己对话相同的方式导出。便于归档同事发给你的线程。
Claude Projects 呢? Project 内的每段对话单独保存。当 Project 的系统提示或知识文件在页面(头部或侧边栏)可见时,Save 会把它们捕获到 frontmatter,这样你不会失去对话所依赖的上下文。
它会捕获 Artifacts 吗? 会——这是核心差异点。Artifacts(代码、文档、HTML、React 组件、Mermaid 图)会按 Claude 构建它们的顺序,以带正确语言标识符的代码块形式通过。你可以直接把它们复制到仓库或文档。
Claude 网页搜索的引用呢? 引用以 Markdown 脚注形式保留。脚注文本是源 URL,所以你日后可以审计 Claude 的依据,而不必回到原始线程。
它会在 Claude Code(CLI)中工作吗?
Claude Code 在你的终端而非浏览器中运行。扩展面向 claude.ai。对于 CLI 会话,对话记录存在 ~/.claude/ 的磁盘上,可以单独捕获——Claude Code + Obsidian 工作流指南涵盖这部分。
它能处理非常长的线程吗? 能。Claude 的 200K 上下文可以产出数百回合的对话。Save 滚动对话面板并随每个回合重新虚拟化回 DOM 时读取它,因此即使最长的线程也能完整通过。
会包含分支响应吗? 只包含 UI 中当前显示的分支(你保留的那个)。你未选择的重新生成分支会被跳过,使文件与 Claude 向你展示的对话一致。
它要多少钱? Save 有免费档位,让你可以在几段对话上试用。之后,小额订阅覆盖持续使用。
相关 Save 指南
- 将 ChatGPT 对话保存为 Markdown ——每个回合,代码块完整
- 将 YouTube 视频保存为 Markdown ——AI 转录、摘要、时间戳
- 将 GitHub 仓库和 issue 保存为 Markdown ——README、issues、PR 讨论,全在一个文件里
- Claude Code + Obsidian 知识库工作流 ——捕获终端会话并构建可查询的归档
Footnotes
## Continue reading
如何将 ChatGPT 对话保存为 Markdown(每轮对话、代码块完整保留)
将任意 ChatGPT 对话转换为干净的 Markdown:每轮对话、代码块、表格、引用。面向研究者和 AI 用户的 2026 完整指南。
如何将 Notion 页面保存为 Markdown(toggle 展开,database 转为表格)
把任何 Notion 页面转成干净的 Markdown:toggle 展开,database 转为表格,callout 保留。面向 Obsidian 和 AI 用户的 2026 完整指南。
如何将 Reddit 帖子保存为 Markdown(含评论和上下文)
将任何 Reddit 帖子转换为干净的 Markdown,保留嵌套评论、karma、flair 和 OP 标记。2026 年研究人员和 AI 用户完整指南。
如何用 Save 构建 LLM 知识库
将任何网络内容转化为个人知识库,让 Claude、ChatGPT 或任何 LLM 变得更加智能。灵感来自 Andrej Karpathy 的方法。
Written by
Jean-Sébastien Wallez
I've been making internet products for 10+ years. Built Save on weekends because I wanted my own reading library in clean markdown for Claude and Obsidian. Write here about web clipping, AI workflows, and the small things that make a personal knowledge base actually useful.