1. 从对话框到本地文档:为什么导出这件事在 2026 年依然让人头疼
如果你每天用 ChatGPT 写方案、用 Grok 查资料、用 Claude 改代码,那你大概率经历过这个场景:一段三千字的技术分析在对话框里排版精美,代码块、表格、LaTeX 公式一应俱全,可一旦复制到本地 Markdown 编辑器,层级全乱、公式变乱码、表格塌成一堆竖线。这不是你的操作问题,而是大模型 Web 端渲染流与本地文档流之间的协议差异导致的。
AI 导出鸭就是针对这个断层设计的浏览器插件,它做的事情可以概括为一句话:把 ChatGPT、Grok、Claude、Gemini、DeepSeek、Kimi 等平台的对话内容,按结构化方式导出为 Markdown、Word、PDF 或长图,尽量保留原有的标题层级、代码块语言标记、表格结构和公式渲染。适合谁用?频繁在 CSDN、知乎、公众号发技术文章的开发者,需要把 AI 对话整理成周报或论文素材的研究人员,以及任何不想手动重排格式的人。
这篇内容不堆参数,直接给你可复制的配置骨架和逐项验证动作。我会用 ChatGPT 和 Grok 作为主要对照对象,因为这两个平台在导出行为上差异最大:ChatGPT 的 Markdown 扩展语法相对规范,Grok 则更偏向纯逻辑输出,表格和代码块的边界处理经常需要额外干预。下面从环境准备开始,一步步走完导出、验证、排障的完整链路。
2. 前置准备:TaoToken 接入与 AI 导出鸭的配合逻辑
在聊导出之前,先解决一个容易被忽略的问题:你导出的内容从哪来。如果你只是偶尔用网页版对话,直接复制也行;但如果你需要批量处理、或者想把导出流程嵌进自动化脚本,那就需要一个稳定的 API 入口来拉取对话内容。TaoToken 在这里的角色是提供统一的模型调用通道,让你可以用同一套 Key 访问不同模型的对话接口,导出的原始数据来源更可控。
TaoToken 的官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基础地址是 https://taotoken.net/api 。你不需要把它理解成什么复杂的东西,就当成一个能让你用标准 HTTP 请求拿到模型回复的网关即可。对于导出场景来说,关键是你拿到的回复是原始 Markdown 文本,而不是经过 Web 端二次渲染的 HTML,这样 AI 导出鸭在处理时少一层解析损耗。
具体操作上,你需要先拿到 API Key。进入控制台页面 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,创建一个新的 Key,权限范围选对话读取即可。然后在 API Keys 管理页 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 确认 Key 状态为 active。如果你打算用 Coding Plan 做长期批量导出任务,可以看 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 了解配额和并发限制。
注意:API Key 只用于服务端请求,不要写进前端代码或浏览器插件配置里明文存储。导出鸭插件本身走的是页面 DOM 解析,不需要你的 Key,两者是解耦的。
环境准备清单:一个支持 Manifest V3 的 Chromium 内核浏览器(Edge 或 Chrome 均可),AI 导出鸭插件安装完成,TaoToken 的 Key 已创建并测试通过。接下来进入配置环节。
3. 可复制配置骨架:settings.json 与 config.toml 示例
AI 导出鸭的配置分两层:插件侧的导出规则用 JSON 描述,服务端拉取对话内容用 TOML 描述。下面两份配置你可以直接复制修改,我按 ChatGPT 和 Grok 两个平台分别标注了差异项。
3.1 插件侧 settings.json:控制导出格式与结构化保留
这份配置放在导出鸭的「高级设置」→「导入配置」里,作用是告诉插件在遇到不同模型页面时,用哪套选择器提取内容、保留哪些 Markdown 扩展语法。
{ "version": "2026.03", "profiles": { "chatgpt": { "selector": "div[data-message-author-role]", "preserve": ["heading", "codeblock", "table", "latex", "list"], "codeblockLang": true, "tableFormat": "pipe", "latexDelimiter": "dollar", "exportFormat": ["markdown", "docx"], "batchSize": 20 }, "grok": { "selector": "div.message-bubble", "preserve": ["heading", "codeblock", "list"], "codeblockLang": false, "tableFormat": "html", "latexDelimiter": "bracket", "exportFormat": ["markdown", "pdf"], "batchSize": 10 } }, "global": { "imageHandling": "base64", "lineBreak": "lf", "encoding": "utf-8" } }关键参数说明:preserve数组决定哪些结构不被扁平化,ChatGPT 建议全开,Grok 因为表格渲染不稳定,tableFormat设成html反而比pipe更保真。batchSize控制一次导出的对话条数,Grok 的 DOM 节点较重,设 10 比较稳。
3.2 服务端 config.toml:拉取对话原始内容
如果你要通过 TaoToken 的 API 批量拉取对话记录再交给导出鸭处理,用这份 TOML:
[api] base_url = "https://taotoken.net/api" api_key = "sk-your-key-here" timeout_seconds = 30 max_retries = 3 [export] default_model = "gpt-4o" fallback_model = "claude-3-5-sonnet" output_dir = "./exports" naming_pattern = "{model}_{timestamp}_{index}.md" [structure] keep_headings = true keep_code_fence = true keep_tables = true normalize_latex = true strip_html_tags = false [batch] concurrency = 3 chunk_size = 4000 resume_on_failure = truechunk_size设 4000 是为了避开部分模型在超长输出时的截断问题,导出鸭会按这个粒度分段请求再拼接。resume_on_failure在批量导出几十条对话时很有用,中途某条失败不会导致整个任务重来。
提示:config.toml 里的
api_key建议用环境变量注入,不要硬编码在文件里。导出鸭支持读取TAOTOKEN_API_KEY环境变量。
配置写完后,先别急着跑全量。下一步用一条短对话做验证请求,确认链路通了再放大批量。
4. 验证请求与成功结果:从单条对话到批量导出
验证分三步走:先确认 API 能拿到原始 Markdown,再确认导出鸭能正确解析,最后确认输出文件的结构完整。
4.1 第一步:用 curl 验证 TaoToken 返回的是原始文本
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "user", "content": "用 Markdown 输出一个包含标题、代码块和表格的示例,代码块用 python 标注"} ], "stream": false }'成功的话你会看到choices[0].message.content里是带##、```python、|的原始文本。如果返回的是 HTML 标签或者转义字符,说明请求头或模型参数需要调整。这一步的目的是确认数据源头是干净的 Markdown。
4.2 第二步:在导出鸭里做单条导出测试
打开 ChatGPT 的一个对话页面,点击导出鸭图标,选择刚才导入的chatgptprofile,导出格式选 Markdown。导出完成后打开文件,逐项检查:
- 标题层级是否为
##和###,没有变成纯文本 - 代码块是否保留了语言标记,比如
```python - 表格是否为管道符格式,列对齐是否正常
- LaTeX 公式是否被
$包裹,没有变成乱码
我实测下来,ChatGPT 页面在开启preserve全项后,结构化保留率能到 95% 以上,偶尔丢的是嵌套列表的缩进。Grok 页面需要把tableFormat改成html,否则表格会塌成一行。
4.3 第三步:批量导出与结果核对
在导出鸭的批量模式里,选中多个对话,设置batchSize为 10,导出格式勾选 Markdown 和 PDF。导出完成后,用以下命令快速核对文件数量和大小分布:
ls -lh ./exports/*.md | awk '{print $5, $9}' | sort -k2正常情况下,每条对话对应一个文件,文件大小在 2KB 到 50KB 之间。如果出现大量 0KB 或 1KB 的文件,说明选择器没匹配到内容,需要回到 settings.json 调整selector字段。Grok 的div.message-bubble在页面改版后可能变成div[class*="message"],用浏览器开发者工具确认一下当前类名。
成功导出的标志:Markdown 文件在 Typora 或 VS Code 预览里层级清晰,代码块有高亮,表格可读,公式正常渲染。到这一步,你的导出链路就算跑通了。
5. 本篇常见错排查:导出乱码、表格塌陷、批量中断
这一节列的都是我在实际使用中踩过的坑,按出现频率排序。
5.1 导出后中文乱码或公式变问号
原因通常是编码不一致。导出鸭默认用 UTF-8,但部分 Windows 编辑器打开时按 GBK 解析。解决方法是在 settings.json 的global里确认encoding为utf-8,同时在编辑器里手动切换编码。LaTeX 公式变问号则是latexDelimiter设错了,ChatGPT 用dollar,Grok 用bracket,设反了就会解析失败。
5.2 表格导出后塌成一列
这是 Grok 页面最常见的报错。Grok 的表格在 DOM 里用的是div模拟,不是标准table标签,导出鸭的pipe模式识别不了。把tableFormat改成html,导出后再用 Pandoc 转成 Markdown 表格:
pandoc input.html -f html -t markdown -o output.md5.3 批量导出中途卡死或部分文件为空
先检查batchSize是否过大。Grok 页面节点多,设 10 以上容易触发浏览器内存限制。其次看concurrency,服务端拉取时并发超过 3 可能被限流。如果某个对话特别长,chunk_size设 4000 仍然截断,可以降到 2000 并开启resume_on_failure。另外,导出前刷新一次页面,确保 DOM 完全加载,能减少选择器匹配失败的概率。
5.4 API 返回 401 或 403
检查 TaoToken 的 Key 是否过期,以及请求头里Authorization格式是否为Bearer sk-xxx。如果用的是 Coding Plan 的配额,确认当前任务没有超出并发限制。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 有完整的错误码说明,遇到不常见的状态码可以先查那里。
6. 按需选型:不同场景下的导出方案与工具入口
回到最初的问题:ChatGPT 和 Grok 的导出到底怎么选。如果你主要处理学术内容、公式多、需要 PDF 交付,ChatGPT 配合导出鸭的dollar模式更稳;如果你做的是逻辑分析、代码片段为主、表格少,Grok 的导出速度更快,但表格要转一道 HTML。Claude 的 Artifacts 导出适合前端文档,Gemini 适合 Google 生态内的协同,这些在导出鸭里都有对应的 profile 可以切换。
对于需要长期、批量处理对话导出的场景,比如每天整理几十条 AI 对话成周报素材,建议走 API 拉取加脚本处理的路线。你可以用 TaoToken 的模型对话接口 https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 拉取原始回复,再用导出鸭的 CLI 模式批量转换格式。如果涉及编码任务和 Agent 工作流,Coding Plan 的配额模型更适合持续调用。
最后给一个实用技巧:导出前先在对话里发一句「请用标准 Markdown 重新输出上述内容,保留所有代码块语言标记和表格结构」,让模型自己整理一遍,导出鸭的解析成功率会明显提升。这个动作花不了几秒,但能省掉后面手动修格式的十分钟。