浏览器工具自制指南·对话导出(1):需求与选型

18 阅读12分钟

前言

现在 AI 工具愈发强大,无论日常的搜索、问答,还是工作向的策划、方案,和 AI 聊一聊、头脑风暴一下,都能获得一个不错的结果。

我最近一段时间就深度使用了大厂的 AI ,在各种主题下讨论碰撞观点,积累了不少会话内容。我翻了一下和几个大模型产品的聊天记录。有些对话长达数千条,涉及一个完整的技术方案从0到1的演进过程——需求分析、架构选型、接口设计、踩坑记录、优化思路。如果把这些整理出来,足够写一篇不错的技术博客。

但它们就躺在那个聊天框里,和后面几十个无关话题混在一起。我想把它们批量提取出来,发现只有几个指定的选项:DOC、PDF、图片或者网页链接,而且要么会话整体导出,要么逐条勾选我所需要的记录,总而言之一切并不轻松:

  • DOC 的排版阅读起来还行
  • PDF 把大部分内容变成了图片
  • 图片 就更不用说了 —— 没法搜索、没法编辑。

导出过程就已经比较繁琐了,导出的结果又属于人可读但 AI 不好用,它们不是纯文本,二次喂给 AI,token 消耗量大速度又慢。

一个能把高质量对话沉淀下来的功能,对于每天都在用 AI 辅助工作的人来说,应该是刚需。但大厂们似乎并不这么认为。它们的导出功能更像是“我有这个功能”的打卡项,而不是真的想让你把数据带走。

使用过程中我还注意到另一个问题,数十轮对话下来,AI 会记住我的项目背景、业务场景、甚至我的写作风格。我不再需要每次从头交代背景,它似乎越来越懂我了。

  • 但实际上,当对话累积到成百上千轮,就会发现:
    1. 早期的关键决策、技术选型理由、被否决的方案,慢慢被后来的对话稀释
    2. AI 的回答开始“跑偏”,因为它更关注最近的几条消息,而忽略了开头约定的规则
    3. 想回顾两周前某个精彩的设计思路,只能手动往上翻几百条消息

后来我了解到这是 长上下文污染:超长的上下文导致 AI 的注意力被太多历史信息分散了。解决方案也很朴素:把有价值的对话片段沉淀成外部记忆,需要时再喂回去。

于是这就回到了最初的问题,如何高效地导出会话记录供人机展开后续阅读使用?

最理想的介质当属 Markdown 文档:

  • 人能读:纯文本,任何编辑器都能打开,有良好的视觉排版能力
  • 机能吃:LLM 对 Markdown 的理解远优于 PDF/DOC,纯文本也能降低 token 成本
  • 生态广:Obsidian、Notion、GitHub、Typora ……全都原生支持
  • Git 可 diff:版本管理天然友好

所以问题的答案变得清晰:

我需要一个由我自己控制的、能从网页里把原始对话数据拿出来的工具。

不要 PDF,不要 DOC,只要干净的 Markdown。代码块还是代码块,表格还是表格,公式还是公式。人能读、机能吃、Git 可 diff。

本专栏适合有一定前端基础(了解HTML/CSS/JavaScript)、希望掌握数据自主权、乐于动手折腾的技术爱好者。如果你是纯小白,也不必担心,我们会尽量讲得通俗易懂。

一、Pandoc 方案的尝试与失败

有了目标,第一反应往往是找现成的工具。

我的想法很简单:既然大厂提供了 DOC 导出,那我找个工具把 DOC 转成 Markdown 不就行了?于是网上了解了一下,这类工具还不少 —— Pandoc 是其中最知名的一个。

Pandoc的安装使用可参考本专栏 0.1篇-用 Pandoc 一站式搞定

Pandoc 是一个文档格式转换工具,能把 DOCX、LaTeX、HTML、Markdown 等几十种格式互相转换。社区活跃,文档齐全,命令行一行搞定。看起来完美匹配我的需求:

pandoc chat.docx -o chat.md

于是我把它加入了工作流:在 AI 端导出 DOC 文档,拖进终端跑一行命令,得到 Markdown。一开始用着还行,段落、列表、粗体斜体基本都能保留。我以为问题解决了。

但我很快发现,这只是假象。用了快一个月之后,我开始逐步回看整理这些会话内容,我发现了不对劲。

事情发生在一次技术方案讨论的导出上。那场对话里有大量的代码块 —— Java、JS、bash命令,还有文字字符绘制的流程图等等。导出成 DOC 再转 Markdown 之后,各种代码块相关内容全部消失了。对话里讲到展示核心代码,接着就是代码如上的总结,中间最重要的内容却不翼而飞,这样的会话记录导出来又有何意义?

我起初以为是 Pandoc 的参数没调对,试了 --wrap=preserve、--from docx+empty_paragraphs 等各种组合,结果都一样,遇到代码块就丢了。

我开始意识到,问题可能不在转换工具上,而是数据源头有问题。于是我开始对照 DOC 查看 Markdown 缺失的对应内容,发现DOC文档里代码块流程图的地方,都被包裹在一个文本框中,文本框带有灰色背景、圆角边框、等宽字体。看起来像是有人把代码复制进了 Word 的文本框组件里。

我试着查了一下 Pandoc 的文档和社区讨论。结论是:Pandoc 并非完全不能处理文本框里的内容,通过 --extract-media 参数可以把文本框内的图片提取出来,配合 Lua filter 也能尝试解析文本框中的文本。但问题是:

  • 每个文本框的样式不同,有的带背景色,有的不带,解析规则难以统一
  • 文本框内的换行和缩进经常丢失,代码格式化全乱
  • 如果文本框里嵌套了图片(比如流程图截图),提取出来也是一张静态图,没有任何语义

简而言之,Pandoc 能做,但做不干净。每次转换都需要人工检查和修复,遇到复杂的文档,修复的时间比自己重新整理一遍还长。

这条路虽然走得通,但走不远。它不是一次性的技术问题,而是每次导出的结果都存在不确定性,还需要后续的纠偏。我想要的是一个能稳定产出可用 Markdown 的方案。

所以我放弃了 Pandoc 这条线,开始往另一个方向看 —— 在数据被封装成 DOC 之前,直接从网页里拿到原始内容。

二、Tampermonkey 脚本

放弃 Pandoc 之后,我开始重新思考这个问题:我要的到底是什么?

并非"把 DOC 转成 Markdown",只需"从 AI 聊天页面里拿到原始的对话数据,输出为 Markdown"。这两件事的区别在于:前者是在下游做格式转换,后者是在上游做数据捕获。

那怎么从网页里拿到原始数据?

最直接的办法是看浏览器里发生了什么。例如,在腾讯元宝的网页版中,我就通过 Network 面板抓取到了结构清晰的JSON数据。刷新页面,开始一轮对话,观察网络请求。很快就能发现规律:每次发送消息和接收回复,浏览器都会向后端接口发起请求,返回的数据通常是 JSON 格式,里面包含了消息的完整内容——包括代码块、表格、公式,全都是结构化的文本,没有被渲染成图片。

也就是说,在数据到达浏览器、被渲染成 DOM、再被导出为 DOC 之前,它还是干净的。如果能在这个阶段把数据截住,就能绕过所有格式损失的问题。

那么问题变成了:如何在浏览器层面拦截这些网络请求,拿到响应数据,然后组装成 Markdown?

有几个可选方案:

方案优点缺点
浏览器扩展功能完整,可长期运行开发门槛高,需熟悉 Manifest V3、事件监听、权限声明等
书签脚本轻量,无需安装额外工具只能在页面加载完成后执行,无法拦截早期发起的请求
Tampermonkey 脚本开发简单,跨浏览器,支持 GM_* API,可拦截 XHR 和 Fetch依赖宿主环境,需额外安装扩展

对于个人工具来说,Tampermonkey 用户脚本的优势很明显:

  • 上手快:只需要会 JavaScript 和基本的 DOM 操作,不需要了解扩展的复杂生命周期
  • 跨浏览器:Chrome、Firefox、Edge 都支持 Tampermonkey,一套脚本到处跑
  • 拦截能力强:通过 @run-at document-start 可以在页面最早阶段注入代码,覆盖 XHR 和 Fetch 两种请求方式
  • 存储方便:GM_getValue / GM_setValue 提供了简单的键值存储,不需要操心 IndexedDB 或 Chrome Storage API

综合来看 Tampermonkey 用户脚本,便是目前理想的方案。在 AI 聊天页面拦截网络请求,拿到原始 JSON 数据,组装成 Markdown 文件,下载导出,它完全胜任,而且轻量。

三、门槛与局限

用户脚本方案虽然看起来很不错,但也并非完美无缺:

  • 依赖 Tampermonkey 这个宿主环境,用户需要额外安装一个浏览器扩展并配置
  • 脚本的撰写需要一定的编程基础,需要耐心分析接口和数据结构
  • 网页改版可能导致选择器失效,需要自行维护更新
  • 当消息量达到几千条时,纯 DOM 操作会遇到性能瓶颈

认识到其局限性,便于确立我们对工具的期待边界。对于初期目标 —— 拿到几百到一千条对话,输出为可用的 Markdown ,用户脚本是完全够用的。至于更大的规模、更高的稳定性,那是后续工具升级要考虑的事情,后续篇章再行展开。

在继续阅读前,请确认你是否具备以下条件:

  1. 安装了最新版 Edge 浏览器
  2. 了解最基本的 JavaScript 语法
  3. 能接受网页改版导致工具失效的风险

四、专栏交付物

整个专栏围绕一个目标展开:一个能把 AI 对话从网页中提取出来、输出为干净 Markdown 的工具。它不是一个概念验证的 demo,而是一个真正能用的脚本,并且附带完整的构建流程。

具体来说,交付物包括:

4.1 可直接运行的 Tampermonkey 脚本

这是核心产出。安装 Tampermonkey 后,导入脚本,打开 AI 聊天页面就能看到导出按钮。点击即可将整场对话导出为 Markdown 文件,代码块、表格、公式均保持原始格式,不做任何转换或降级。

目前的脚本选用的 AI 平台为 腾讯元宝,并会在后续迭代中持续适配。


4.2 一份完整的开发实战记录

光有脚本是不够的。如果哪天平台改版导致脚本失效,需要有能力自己修复,甚至根据自己的需求定制功能、适配更多平台。

因此,专栏会从零开始讲解脚本的开发过程:

  • 如何安装 Tampermonkey 扩展
  • 如何分析 AI 聊天页面的网络请求,定位数据接口
  • 如何拦截 XHR 和 Fetch,拿到原始 JSON
  • 如何将 JSON 数据组装成结构完整的 Markdown
  • 如何处理长对话的分页加载
  • 如何利用 GM_* API 实现配置持久化和菜单交互

五、线路图

整个专栏共六篇,按"需求→基础→核心→工程→进阶"的脉络展开。下表列出了每篇的主题和核心内容:

篇目标题核心内容
(1)需求与决策本文。从 Pandoc 失败到 Tampermonkey 选型的完整推导过程
(2)环境搭建与项目结构初始化 browser-tools 仓库,划分 shared/userscript/extension/ 目录,配置开发环境
(3)消息池与 shared 层设计消息数据结构,实现消息池的增删改查,抽离平台无关的核心逻辑
(4)拦截对话流与 MD 组装拦截 XHR/Fetch 获取原始 JSON,解析消息内容,组装为结构化 Markdown
(5)构建脚本与自动更新编写 build.js 打包脚本,部署到 Gitee Raw 实现脚本自动更新
(6)进阶方案与架构升级DOM 拦截升级为 API 分页拉取全量数据;评估用户脚本迁移至浏览器扩展的必要性与成本

总结

本篇我们从一次日常的需求(想把 AI 对话导出为可复用的 Markdown)出发,经历了一条从工具选型到方案推翻再确立的探索路径:

  • Pandoc 转换方案存在瓶颈:大厂导出的 DOC 已经把代码块和流程图封装成了文本框,下游工具难以无损还原。
  • 从"格式转换"到"数据捕获":对比浏览器扩展、书签脚本和 Tampermonkey 用户脚本三种方案,最终选择了开发成本最低、跨平台最好、拦截能力足够的用户脚本路线
  • 用户脚本的局限:依赖宿主环境、需要编程基础、面临网页改版风险、大规模对话下存在性能瓶颈。认清这些局限,不是为了劝退,而是为了让工具的预期边界清晰可见。
  • 专栏整体路线预览:从需求逐步推进到方案的落地与进阶。

接下来的篇章,我们将从环境搭建开始,一步步把这个脚本从零实现出来。


本文首发于个人博客「阶进遐的技术随笔」
博客中配有完整专栏目录、可复制配置与长期更新,适合沉浸式阅读。
欢迎来博客逛逛,这边有任何疑问也可直接评论区交流。