拓冰建站拓冰建站
首页 / 资讯中心 / 正文

DeepSeek对话一键导出:油猴脚本实现原始数据自由

DeepSeek 网页版用多了最让人难受的不是模型答得不好而是好不容易调出来的一轮高质量对话复制出来全是乱的。代码块换行丢、标题层级跟网页样式纠缠在一起、复制到 Markdown 编辑器里还要手动清理半天。更要命的是几十轮对话翻下来想留个完整的原始记录官方网页只有聊天记录列表没有一键导出手动复制又顾头不顾尾。所以当我看到社区里有人写了 DeepSeek-Raw-Export 这个开源油猴脚本时第一时间就装上了。这脚本做的事情很朴素接管 DeepSeek 网页版原来的“复制”按钮点一下就把当前对话内容以干净、完整、结构化的格式导出成文件。不用打开开发者工具不用调 API不用安装重型浏览器插件一个油猴脚本搞定。适合谁经常用 DeepSeek 写代码、跑方案、长期整理对话资料的人想把自己调 Prompt 的过程沉淀成语料的人以及刚接触油猴脚本想看看浏览器自动化到底怎么玩的开发者。这篇文章不吹不黑从设计思路、安装配置、实际操作、翻车排查到扩展玩法把我自己的使用过程和踩过的坑完整拆给你看。1. 为什么需要“Raw 导出”1.1 DeepSeek 官方导出能力的缺失目前网页版 DeepSeek 的对话管理基本就是“看得到、摸不着”。你可以在聊天记录里翻到历史对话可以点击复制按钮拿一段文本但官方并没有提供“导出完整对话记录”的功能更别说批量导出成 Markdown、JSON 这类结构化格式。这个问题在普通聊天场景下还好一旦你把 DeepSeek 当作生产力工具痛点就立刻暴露出来。我平时用 DeepSeek 写代码方案、梳理业务流程经常需要把几轮对话里的关键结论整理进自己的笔记系统或者把一通折腾后调好的 Prompt 存档。如果只能靠手动复制一次两次还能接受长期下来你会发现几件事复制的文本格式不稳定代码块的缩进和语言标注可能被吃掉对话轮次一多容易漏掉中间某次追问不同浏览器、不同操作系统下复制的行为还有细微差别最终整理成本高得离谱。数据这东西只有在能自由流动的时候才有价值。DeepSeek 网页版把数据锁在了一个个气泡里短期体验没问题长期看就是给自己埋坑。社区做 DeepSeek-Raw-Export 这类工具本质上是补全官方缺失的能力让用户拿回自己对话内容的控制权。1.2 复制按键背后的“所见非所得”你可能以为网页上的“复制”按钮就应该把屏幕上显示的内容原封不动复制出来可真做前端的人都清楚这里有两层问题。第一层浏览器复制机制会同时写入多种格式比如 text/plain 和 text/html。粘贴到普通记事本里是纯文本粘贴到富文本编辑器里却带着样式。DeepSeek 网页版的复制按钮通常是程序化生成一段文本再写入剪贴板而不是直接把屏幕上的内容拷贝一份。所以你会发现复制出来的东西跟屏幕上看到的并不完全一样尤其代码块的缩进、空行、LaTeX 公式可能被简化。第二层屏幕渲染结果和原始数据不是一回事。模型返回的内容经过了前端渲染变成了一个由 DOM 节点组成的树。当你操作 DOM 去拿文本时拿到的可能只是“渲染后的片段”而不是后端返回的原始消息结构。DeepSeek-Raw-Export 的价值就在这里它不满足于拿剪贴板里的残次品而是想办法从页面运行时的数据源里把完整对话记录取出来再按你自己定义的格式落地成文件。这种导出方式才配叫“Raw Export”。1.3 为什么用油猴脚本而不是浏览器扩展或 API实现导出的路子有好几条我自己以前也试过浏览器扩展功能最完整可以深度监听网络请求、操作页面但开发、审核、安装都偏重为了导出一个对话上个扩展有点杀鸡用牛刀。直接调 DeepSeek API这条路最“正规”但要准备 API Key、要按 token 计费而且它只能拉取你跟模型之间的“会话记录”拉不到你在网页版里跟模型一来一回形成的完整上下文视图。油猴脚本足够轻注入页面立即生效跨浏览器用同一个脚本管理器代码改了就能热更新特别适合“在已有网页上做一个小功能增强”这种场景。所以 DeepSeek-Raw-Export 选择油猴脚本是非常合理的设计。它不需要独立的扩展安装包不用专门的应用商店权限只要浏览器有一个 Tampermonkey 或 Violentmonkey加一个脚本文件就能跑。这也是这种“开源工具”区别于商业产品的地方小而精解决一个明确问题代码黑是黑但你能看到底。2. 安装、配置与源码浅拆解2.1 油猴运行环境准备先说明一点DeepSeek-Raw-Export 需要在浏览器端运行所以你得有一个用户脚本管理器。个人推荐 Tampermonkey适配性强更新及时Chrome、Edge、Firefox 都能用如果你想更轻一点Violentmonkey 也可以某些场景下它对 GM API 的兼容做得反而比 Tampermonkey 更保守稳定。安装步骤不复杂第一次上手大约五分钟在你常用的浏览器里装上 Tampermonkey 扩展。打开管理面板点击“添加新脚本”。把 DeepSeek-Raw-Export 的脚本源码复制进去保存。在脚本设置里确认 match 规则包含了https://chat.deepseek.com/*同时检查脚本开关状态是“启用”。装好之后打开 DeepSeek 网页版刷新页面。如果一切正常你在任意一问答完点击回答下方的“复制”按钮应该会看到文件直接下载或者弹出保存文件窗口而不是把内容复制进剪贴板。如果你没看到这种情况先别急后面第四章专门讲排查方法。2.2 脚本文件的目录结构与核心逻辑在拆解逻辑之前先说一个总的设计判断DeepSeek-Raw-Export 这类油猴脚本本质是一个“前端逻辑注入器”。它没有自己的后台页面没有独立的 UI所有能力都来自对原网页事件监听和 DOM 数据读取。用伪代码表达它的核心结构大概是这样的// UserScript // name DeepSeek Raw Export // match https://chat.deepseek.com/* // grant GM_download // run-at document-idle // /UserScript (function () { const config { fileNameTemplate: deepseek-{timestamp}.md, includeRaw: true, includeThinking: true, format: markdown, }; function handleCopyClick(event) { const messageNode findClosestMessage(event.target); if (!messageNode) return; const rawMessage extractRawMessage(messageNode); const output buildExportContent(rawMessage, config); triggerDownload(output, config.fileNameTemplate); } function attachListeners() { document.addEventListener(click, handleCopyClick, true); } attachListeners(); })();这段伪代码表达了几个关键点。第一脚本必须找到一个触发点。DeepSeek 网页版的“复制”按钮其实是一个可点击的 HTML 元素。脚本需要在捕获阶段监听 click 事件如果点击的目标附近能匹配到某个消息节点就触发导出逻辑。用捕获阶段而不是冒泡阶段是为了在页面自身的处理逻辑执行之前介入这样才有可能“接管”原本的复制按钮。第二必须拿到数据源。注意这里不是简单地从 DOM 的 innerText 里取值因为那样拿到的仍然是渲染后的文本。更好的做法是从 React 运行时或者页面内部挂载的数据结构里去取原始消息。很多现代前端框架都会把数据挂在 DOM 元素属性或内部 fiber 节点上用户脚本可以通过遍历 parent 节点找到 messageId再通过页面对应状态的引用拿到原始消息内容。这样拿到的数据包含完整的 role、content、timestamp甚至可能包含思考过程的原始文本。第三要生成导出文件。脚本把拿到的数据拼成 Markdown 或 JSON 字符串用Blob封装然后通过URL.createObjectURL生成一个临时下载链接模拟点击一个隐藏的a标签完成下载。如果配合GM_downloadAPI也可以直接交给浏览器的下载管理器处理。2.3 关键配置项与自定义玩法我用的版本里排在前面几个配置项是配置项作用我的建议format导出格式支持 markdown / json / txt大多数场景用 markdown需要程序处理优先 jsonfileNameTemplate文件名模板支持{timestamp}、{title}占位符保持时间戳前缀避免重名覆盖includeThinking是否把模型思考摘要也导出来看用途写文章时关掉研究推理时就打开autoDownload点击复制后是否直接下载文件开省一步操作如果你跟我一样是个喜欢折腾的人可以把它从“复制按钮触发下载”改成“复制时同时写入剪贴板和下载文件”。比如先在脚本里自定义一个热键 CtrlShiftD然后监听 keydown 事件触发同样的导出函数这样既不和浏览器默认复制冲突又能随时手动导出。另外脚本头部里的match必须严格匹配 DeepSeek 的网页地址。因为油猴脚本默认不跨域一旦 DeepSeek 调整域名或者你用镜像站脚本可能静默失效。不过还是强烈建议使用 DeepSeek 官方域名避免第三方站点带来的账密风险。3. 从零完成一次“复制即导出”3.1 完整实操步骤下面是我比较推荐的操作流程能帮你快速跑通整个导出链路。打开 DeepSeek 网页版进入你想导出的对话。先把页面滚动到对话底部确保所有消息都已经渲染。如果对话很长建议先等几秒让潜在懒加载内容都加载完成。任意选一条你关心的回复点击回复下方的“复制”按钮。观察浏览器右下角的下载提示正常情况下会看到一个.md文件开始下载。打开这个文件检查内容结构消息角色是否完整代码块是否保留原始语言标注有没有多余的 HTML 标签。我实操下来最顺的一次是在 DeepSeek 上连续问了十一个关于“油猴脚本怎么处理动态加载内容”的问题中间穿插了五六次代码修正和追问。每一次点回复的复制按钮都会下载一个独立的 Markdown 文件里面把用户问题、模型回答、思考摘要、代码片段都分块整理好了几乎没有额外清理成本。如果你发现点击复制后没有下载而是正常的复制行为大概率是脚本没有成功接管事件。这种情况下可以看看有没有开启“兼容模式”有些页面在捕获阶段会提前调用stopPropagation脚本监听不到事件需要调整监听目标和阶段。3.2 导出的内容长什么样打开导出的文件你会发现脚本并不是简单地把屏幕文本抠出来而是按消息轮次重排成了结构化文档。一个典型的 Markdown 导出文件会长这样# DeepSeek 对话导出 - 时间2025-01-15 21:30:00 - 模型DeepSeek-V3 ## User 请解释一下油猴脚本的 match 规则。 ## Assistant match 规则用来声明脚本应该在哪些网址上运行支持通配符格式是 scheme://hostpath。 ## User 能不能给个例子 ## Assistant 比如 https://chat.deepseek.com/* 会匹配所有 chat.deepseek.com 下的路径。跟原网页直接复制相比最重要的区别在于代码块。网页复制模式下代码块的换行可能会被压成一行或者语言标注丢失而 DeepSeek-Raw-Export 导出时直接用 Markdown 代码块包住代码粘贴到任何支持 Markdown 的编辑器里都干净利落。如果你导出的是 JSON 格式脚本会尽量保留原始消息对象里的字段比如role、content、reasoning、timestamp等方便后续做程序化处理。3.3 两个实用硬核小技巧批量导出历史对话。脚本一次只能导出一个复制按钮对应的那条回复但你可以利用文件命名模板把文件名改成带时间戳和对话主题的形式然后再用一个小脚本统一合并。比如在 Obsidian 的目录下用 Python 读取多个 md 文件按时间排序合并成一个长对话档案。下面是我常用的合并思路import glob, datetime files sorted(glob.glob(deepseek-*.md)) merged [] for f in files: with open(f, encodingutf-8) as fh: merged.append(fh.read().strip()) with open(merged_conversation.md, w, encodingutf-8) as f: f.write(\n\n---\n\n.join(merged))对接本地知识库。导出不是终点数据能进你的笔记系统、知识库才有复盘价值。把 Markdown 文件统一导入 Obsidian 或 Logseq或者把 JSON 文件转成适合向量化的格式再交给本地部署的模型做摘要检索整个链路就闭环了。DeepSeek-Raw-Export 帮我把对话沉淀成了“个人语料”这个价值比它当时帮我回答的那个问题更持久。4. 常见问题、翻车现场与排查清单4.1 脚本装上却不生效这是评论区里最常出现的问题。多数情况是脚本管理器开着但页面没刷新或者match没有覆盖当前地址。简单排查方法如下确认 Tampermonkey 图标上有一个红色的数字角标没有的话说明脚本没匹配当前页面。打开管理面板确认脚本状态是“启用”。点击“复制”按钮前先用 CtrlShiftC 检查按钮元素是否正常渲染。如果 DeepSeek 页面做过结构调整旧版本的选择器可能失效去开源仓库拉最新版本。还有一种隐蔽情况开发者工具的“禁用缓存”打开时刷新页面可能会跳过某些注入时机导致监听器没挂上。关闭开发者工具正常刷新一次基本上能解决。4.2 导出内容缺漏或乱码我在一次很长的代码调试对话里遇到过导出文件只包含后半段内容的现象。后来发现原因是页面是懒加载的对话太长时前面的消息还没有被渲染进 DOM脚本就找不到对应的数据节点。解决方案很直白导出前先把页面滚到最上面再逐屏滚下来确保所有消息都加载过一次。如果代码块内部乱码大概率是编码问题。导出时脚本会把整个文本拼成字符串如果某一轮回复里含有特殊字符比如 emoji 或非常规引号而编辑器打开文件时认成了错误编码就会看到乱码。遇到这种情况优先用 UTF-8 编码打开文件并且在脚本里也固定使用 UTF-8 写入。4.3 与 DeepSeek 页面更新冲突油猴脚本最怕的就是网页改版。DeepSeek 的迭代频率不低比如前端路由从某个旧版本升级到新版本后原来可以读取内部消息数据的 hooks 可能被移除脚本就会彻底失效。应对方案有三个定期检查脚本仓库有没有新 release。如果暂时没有更新用浏览器开发者工具观察新页面的 DOM 结构自己修改选择器。在脚本里多写一层兜底逻辑优先读 React 状态读不到就退回到 DOM 文本解析。说实话这个问题无解只能接受。开源工具就是这样靠的是社区活跃度。你如果是开发者也可以顺手把修复发个 PR对自己对别人都有好处。4.4 安全红线别什么脚本都往浏览器里塞油猴脚本拥有页面上下文的能力可以访问你在这个域名上的一切数据。DeepSeek-Raw-Export 本身没问题但你在网上搜索时会看到各种“增强版”“破解版”脚本千万不要乱装。安装任何用户脚本前至少做三个检查脚本是否托管在可信仓库代码里有没有明显的网络请求或数据上传逻辑有没有请求GM_xmlhttpRequest调用第三方域名。另一个容易忽略的点是不要把 DeepSeek 的 API Key 或任何敏感 token 留在脚本配置里。油猴脚本的运行环境远不如浏览器扩展的隔离环境安全一旦来源不明敏感信息分分钟被脚本原作者拿到。安全底线永远优先于功能便利。5. 扩展和 DeepSeek API、本地部署互补5.1 网页导出与服务端拉取怎么选身边不少朋友问我既然要导出为什么不直接用 DeepSeek API 拉取对话记录。我的看法是两个工具的定位完全不同。DeepSeek-Raw-Export 面向“网页端可见的当前对话”你看到什么就能导什么零代码零成本适合个人使用者。API 方式更适合“程序化地管理对话”你需要先有 API Key再按 token 计费而且 API 管理的是你通过接口创建的对话和消息跟你自己在网页端聊的记录通常不是一套体系。所以不存在谁替代谁而是看你手里有什么数据、想要什么格式。如果你有大量历史对话需要建立索引可以考虑把网页导出的 JSON 文件通过 API 做一个清洗和向量化再存入本地知识库。这本质上就是一个“原材料加工”的过程油猴脚本负责采集API 负责加工两不冲突。5.2 把导出数据二次加工成可用语料从 DeepSeek 网页版导出的多轮对话天然是一份高质量的训练/评估语料。但原始导出文件里可能包含思考摘要、时间戳等信息你需要按用途过滤。我自己的做法是先用脚本将格式设为 JSON然后写个 Python 小脚本读取所有导出文件把role为 user 和 assistant 的文本提取出来拼成标准的对话对。再交给本地部署的模型做一轮质量过滤去掉回答太短、内容重复的样本。这个流程跑通之后我手头积累的对话数据再也不是浏览器的“历史记录”了而是可以拿来做 Prompt 优化、做模型效果评估的资产。这一段其实也解释了为什么有人会去折腾 DeepSeek 本地部署、vLLM 部署之类的话题。只要数据能以结构化形式流出来后面的工程化玩法基本都能接上。DeepSeek-Raw-Export 做的就是最前面那一步把数据从网页里解放出来。5.3 给不同用户的一句话选型建议如果你只是偶尔复制一段回答到朋友圈或者笔记里其实原网页的复制按钮就够用没必要装脚本。但如果你像我一样每周都会在 DeepSeek 上沉淀几十轮对话随手要把每个回复存档那 DeepSeek-Raw-Export 这种“一键导出”的开源工具就是实打实的生产力提升。如果你是开发者想把这套思路用到其他 AI 对话网页上DeepSeek-Raw-Export 的架构也很适合作为模板。把它的事件监听、数据抓取、文件导出三个模块拆出来改一改选择器和数据提取逻辑就能适配其他前端页面。开源工具的价值不只是“拿来即用”更是“看完能用”。最后再分享一个我自己的个人习惯每次一轮重要对话快结束时我不会只点一次复制导出而是顺手用脚本的文件名模板带上主题词比如prompt-调优-20250115.md。这样导出的文件自动按主题归类后面整理知识库时省掉了改名的功夫。踩过几次坑之后你会发现导出工具好不好用一半在脚本另一半在自己命名习惯。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门