* fix(extension): correct cross-browser clipping and record live acceptance * fix(extension): use string prefix check for Jike image URLs
65 KiB
浏览器平台剪藏
关联 Issue #493 和实施方案。平台适配已通过 #505、#521、#578 合并;跨浏览器与登录态实站验收由 Issue #588 验收矩阵继续跟踪。以下各轮记录保留当时的代码、环境与验收边界。
2026-10-18 续验已补齐指定的即刻 Web 信息流、LinkedIn 登录公司信息流、Bluesky 引用信息流和 Edge/Firefox 完整 Substack 文章;新增修复及剩余浏览器环境限制见上述矩阵。
2026-10-18 第九轮补齐 Edge 登录雪球推荐列表、Facebook 展开列表、即刻 following 和 Bluesky 引用单卡,修复经典雪球类名定位;四条笔记及十三图来源阻断重开通过。轻微排版残留、构建边界和清理证据见验收记录。
2026-10-18 第十轮补齐 Edge 豆瓣影评/乐评/日记/短评及 ego lite Medium 公开全文,修复中文加粗边界、Bluesky 角标及 Medium 正文外链预览卡遗漏;476 项扩展测试通过,真实保存、来源阻断重开与清理结果见验收记录。
2026-10-18 整体复核修复即刻按钮媒体误删、即刻/Medium 可见后代被拒及 Medium 正文一级标题遗漏;完整非 E2E 3,743 项、扩展 481 项通过,1 个 Windows 专属用例按条件跳过。独立复审与构建边界见验收记录。
2026-10-18 对照 #493 原始需求复核
重新读取 #493 正文及维护者结案说明,逐项对照当前代码、夹具、自动回归和实站记录。#505、#521、#578 的 GitHub 状态均为 MERGED。原文 15 组/17 个平台均有对应实现;原 Issue 以开发交付结案,不把商店/全浏览器/完整 BOSS 实站混为同一完成条件。以下“实站”只指已记录的指定样本,不表示全部版式。
| 原要求 | 实现与证据 | 结论/边界 |
|---|---|---|
| Facebook:单主帖全文、作者/组织、时间、图,排除交互/评论 | social-clip.ts;social-clip.test.mjs;Edge 登录列表展开三图 | 实现/对应样本实站已覆盖 |
| Instagram:单帖/轮播、合并配文、Handle、时间 | social-clip.ts;三图及20媒体样本回归/实站 | 实现/对应样本实站已覆盖 |
| LinkedIn:完整动态、see more、姓名/职务、时间、图 | social-clip.ts、capture-platform.ts;个人职务、公司列表、SDUI UGC 回归/实站 | 实现/对应样本实站已覆盖 |
| Substack:正文、作者、时间、排版、Subscribe/付费界面过滤 | substack-content.ts、article-metadata.ts;文章三图、付费拒绝及可见选区 | 实现/对应样本实站已覆盖 |
| Medium:正文、副标题、作者、代码块高亮、清理推荐 | medium-content.ts;capture-bundle.test.mjs 代码原文/结构;语言与高亮消费方受控探测 | 正文/副标题/两图实站通过;第十一/十二轮三浏览器 40 个真实代码块原文及高亮通过 |
| Hacker News:Ask正文/Show外链、发布者、积分、提交时间 | hacker-news-clip.ts;platform-clip.test.mjs 正文/链接/UTC | 实现/对应样本实站已覆盖 |
| Threads / Bluesky:单帖、作者、时间、引用、原图 | social-clip.ts;两站引用分支回归;Bluesky引用实站 | Edge 文字/含图引用、Firefox/ego lite 含图引用通过;其余指定样本有证据 |
| BOSS直聘:岗位、薪资、城市、职责/任职要求、公司简介 | boss-clip.ts;vertical-clip.test.mjs 全字段、受限拒绝夹具 | 字段已实现;登录完整岗位持久化/重开按 #589 跟踪 |
| 雪球:长帖/研报、作者、配图、投资/股票标签 | xueqiu-clip.ts;详情三图三股票、登录推荐卡八图 | 实现/对应样本实站已覆盖 |
| 小宇宙:标题、Show Notes全文、时间轴、主播、节目名 | xiaoyuzhou-clip.ts;明确阿丁/毛毛、六节点及超过一小时的时间轴 | 实现;仅保留明确主播,不猜节目作者 |
| 微信公众号:正文富文本、公众号/作者、头图/正文图、净化底栏 | article-clip.ts;代码组件/懒图/头图去重/底栏回归,21图实站 | 实现/对应样本实站已覆盖 |
| 即刻:全文、展开、作者、时间、单图/九图高清 | jike-clip.ts、jike-web-state.ts;原图顺序/身份/展开及实站 | 实现;第十二轮已在三浏览器复验九图位置,Edge 8/9 归档且如实反馈 |
| V2EX:主题正文及各条附言 Markdown | v2ex-clip.ts;两附言、各自时间、排除回复 | 实现/对应样本实站已覆盖 |
| 少数派 / 掘金:正文、代码块、结构化大图 | article-clip.ts、platform-clip.ts;语言/缩进/表格,真实图片转存 | 实现;Edge 少数派8/9图时正确报部分外链 |
| 豆瓣:书影音长评/短评、日记 | douban-clip.ts;长评/三主机短评定位/日记,Edge 四类补验 | 实现/对应样本实站已覆盖 |
共同规范已核对保存消费方:专用平台通过 background.ts 的 performPlatformSave 写入统一标题、作者/职务、原发布时间、来源及平台 tags;Medium/Substack 通过 createMemo 写入 web-clip 和对应平台标签。图片都进入既有 page-images 下载/上传/地址改写,部分失败明确反馈,不等同于所有客户端冷启动离线验收。16 个新增平台菜单在 zh_CN、en、ja 的 message 均存在且非空。各平台均有对应提取/身份/保存回归;沿用刚完成的 3,743 项非 E2E 结果,不为纯只读核对重复跑整套测试。
复核时确认两项定向实站缺口:Medium 含代码文章及 Threads 引用帖。既有受控代码/引用回归未覆盖它们的当前真实 DOM;后续第十一轮因此发现并修复 Medium 语言/换行丢失和 Threads 嵌套引用时间戳误拒绝,不能把此前受控通过视为实站通过。
第十一轮已在保留登录的 Edge 原生扩展中补齐:公开 Medium 文章 1a538c9389fe 的 40 个代码块逐字符及换行一致,保留 38 个 JavaScript/2 个 XML 语言,屏蔽原站和 CDN 后重开仍有 551 个实际高亮片段;Threads @mosseri/DeAlGo0I71T 文字引用和 @mkbhd/DehHSaCnEmU 含图引用均保存/重开通过,主帖、引用正文、引用作者及原图保留。来源图片独立下载与实例附件逐字节一致。上述两个定向缺口已补齐;不扩报所有版式或其他浏览器的最新构建。详细风险、测试与清理见 #588 第十一轮记录。
#493 的开发交付结案边界保留;#587 商店交付/更新、#588 跨浏览器及登录态、#589 BOSS 完整岗位仍分别跟踪。初次只读核查证据:/private/tmp/edgeever-issue-493-audit-20261018;本轮修复及实站证据:/private/tmp/edgeever-issue-588-20261017-uz6mqhpj/evidence/eleventh。未提交、推送、部署或回写 GitHub Issue。
2026-10-15 PR 提交验证
本次提交以最新上游 72ab4816 为基线,包含 P2/后续文章平台适配及已合并 P1 的修复。上游“复制笔记”与当前 Web 修改无冲突合并。本次仅提交 83 个任务文件,排除无关 Android 缓存。
合并后 3,529 项批量测试、17 项 API 集成及 13 项桌面认证集成通过,共 3,559 项,其中扩展测试 427 项。根/移动端类型检查、Web 和 Chromium/Firefox 扩展构建通过,Firefox lint 为 0 错误、0 提示、7 条依赖警告。31 个来源样本的 Chromium 保存/附件回读及 2 项 HTML 安全检查通过。夹具空白行清理前后,六份受影响样本的完整提取结果与预格式化文字一致,相关 67 项测试通过。
首轮浏览器复验发现,Web 重建后本地 Wrangler 资源清单仍引用旧资产,新 JavaScript 路径返回 HTML;重启本任务的本地开发服务后,MIME 回读及整组回归通过。未修改生产代码或放宽测试时限。测试后 API 与备份 ID 集合一致,原有 17 条笔记及 1 个令牌完整保留。
本次为关联 #493 的阶段性 PR,商店发布、BOSS 当前登录截断页的全文及原生 Edge/Firefox 保存仍待验收。下方“未提交”等状态为对应轮次的历史记录。
2026-10-15 保存与文本保真复审
本轮修复六处有复现证据的问题:
- 少数派作者仅从当前文章读取,保留同文合著者和作者缺失情形,排除其他文章及隐藏作者卡片。
- 表格代码中的奇数个反斜线接竖线不再造成错列或丢失后列。GFM 无法无损表达的片段改为转义后的普通文字,保留字符与单元格边界;其他代码样式保持。
- 图片转存回写保留标题中的实体、换行及表格竖线,避免归档后图片消失或表格错列。
- 平台右键先固定选中帖子的链接,再显示保存提示,提示注入期间的新右键不会替换本次目标。
- 通用网页、平台及信息流工具栏在入队前记录初始选区与整页模式;右键选区使用浏览器提供的原文字。选区后来改变或消失时仅保存原选区文字,匹配时保留富文本与图片。纯文本回退使用字符实体,避免标题、缩进、URL 和 HTML 被重新解析;导航仍停止保存。没有初始选区的登录页或列表不会因此保存整页。
- 右键选区保存不再全局压缩空行,保留代码内部的连续空行。
最终完整非 E2E 检查通过:3,505 项批量测试(含 427 项扩展测试)、17 项 API 集成与 13 项桌面认证集成,共 3,535 项。根/移动端类型检查、Web 和 Chromium/Firefox 扩展构建通过;Firefox lint 为 0 错误、0 提示、7 条依赖警告。当前构建的 31 个来源样本 Chromium 保存/附件回读流程及 2 项 HTML 安全检查通过;其中即刻信息流使用真实 CDN,其余图片仍为受控 PNG。API 与备份 ID 集合比对确认原有 17 条笔记和 1 个令牌完整保留,无额外笔记。正确性、设计与简化复审无未处理实质发现。
以上修复仍在本地贡献工作区,尚未提交、推送或创建 PR。ego-lite 验收空间由用户控制,本轮未重载其中已安装的扩展。BOSS 当前登录截断、原生 Edge/Firefox 保存及其他登录态布局仍待实站验收;下方较早记录只代表对应版本。
2026-10-15 上游同步与遗漏补齐
沿用贡献工作区和原分支,将上游基线推进到 7b03c8db,保留此前剪藏修改并适配新的 React 弹窗。需登录/内容受限角标及说明继续显示;正在保存、错误和成功反馈优先,明确选区仍可保存。旧弹窗样式未恢复。
雪球信息流右键选中的截断卡片会通过临时同源预览框读取自身公开详情,保留已有页面会话和浏览器计算的 CSS 可见性。预览框设置 sandbox="allow-same-origin",禁用脚本,成功/失败/超时后均移除;错误身份、CSS 隐藏正文、卡片复用、页面跳转或访问受限不创建笔记。原右键监听器仍不联网。真实 Ego 页面已验证选中当前卡片读取公开详情与清理,完整长文和图片另由真实来源夹具验证。
LinkedIn 新增个人职业简介,与作者姓名和发布时间分开读取,保存为“作者: 姓名 · 职业简介”。activity、ugcPost、share 三种身份保持区分;关系等级、关注人数和嵌套帖元数据不能冒充作者、职务或时间。真实个人样本为 Mohammad Ahmed / Technical Lead - Backend at Dizzaract。
同步后的 macOS 本地完整非 E2E 检查通过:3,490 项批量测试、17 项 API 集成与 13 项桌面认证集成;其中扩展专项 412 项通过。根/移动端类型检查、Web 与 Chromium/Firefox 扩展构建通过。Firefox lint 为 0 错误、0 提示、7 条警告:4 条来自新上游 React DOM 包、2 条既有 Readability、1 条 mdast 内部解析器;未禁用检查。旧 ProseMirror 安装软链接造成的类型冲突通过重建依赖链接消除,未修改依赖版本或业务类型。
当前 31 个来源样本的 Chromium 保存流程通过,覆盖正文/元数据、附件回写与回读、屏蔽来源后编辑器重开、CSS 隐藏详情拒绝、临时预览框脚本隔离与清理,以及 React 登录/付费预览提示;另有 2 项 HTML 安全检查通过。即刻信息流样例使用真实 CDN,验证附件哈希、浏览器解码及已缓存笔记断网重开,其余图片为受控 PNG,不据此重复声称真实 CDN 验收。测试按上游虚拟列表验证目标行,不再按全部 DOM 行数等待。
首轮停在 Vite 会话转发超时,后一次 Wrangler 日志记录 ProxyController 错误退出。最终使用同一 workerd 的内部 Web/API 地址通过整组检查;未改开发服务器、添加重试或放宽测试时限,也未宣称该代理故障已根治。中断轮次残留数据已清理;API 与备份 ID 集合比对确认原有 17 条笔记全部保留、额外笔记为 0,令牌恢复到原有 1 个。本地扩展已重载,同一个 8 页 ego-lite 验收空间保留。尚未提交、推送、创建 PR 或发布。
当前 BOSS 实站仍为登录截断与无可读薪资,不能视为全文验收通过。原生 Edge/Firefox 保存及其他登录态布局仍待验收。以下较早检查记录仅代表各自当时版本。
2026-10-15 跨平台缺陷复审
将此前验收问题横查到 P1、P2 及其余本次要求的平台。修复豆瓣乐评单换行丢失、V2EX 隐藏正文/元数据泄漏及隐藏附言容器内恢复可见的正文遗漏、Facebook/Bluesky/LinkedIn 将嵌套帖正文归到原帖、隐藏帖头链接改变右键目标的问题。Medium、Substack、通用网页和明确选区共用 HTML 转 Markdown,不再压缩代码内部空行。
共用表格转换保留行列、图片及单元格换行,避免把 HTML fallback 当源码文字显示。只有表格单元格内无属性的 <br> 会转为硬换行,任意 HTML 仍作为文字。复杂单元格保留可读的内联内容,不保留嵌套列表/引用/代码块节点。纵向合并在原行组内重复值,横向合并使用空单元格占位;额外表头行作为数据行保留。图片地址替换改用解析器提供的源码位置与标签边界,保留转义示例、代码、引用式图片、嵌套图片标签及表格图片。通用网页/选区入口也会提示图片未完全归档。
使用已安装 Wrangler 代理进行独立实验:上游不消费 {} 时,50 组编辑/保存请求有 7 次失败;消费请求体、使用 Wrangler 原版 drain 中间件、不发请求体,均为 0/50 失败。扩展删除创建编辑会话时无用的请求体,未修改 API 或其他客户端,也不宣称修复了所有 Wrangler 连接故障。Substack 真实文章和 Note 已通过原配置 http://127.0.0.1:8787 完成 3/3 与 1/1 图片归档,4 张附件全部可解码、SHA-256 与源文件一致;两条临时笔记和 4 张附件均清理,原有 17 条笔记保留。
387 项扩展测试和 346 项共享模块/编辑器测试通过;根/移动端类型检查、Web 构建及 Chromium/Firefox 扩展构建通过。Firefox lint 为 0 错误、0 提示、3 条警告:两条既有 Readability 警告,以及 mdast 内部解析器 document().write() 方法被误判为浏览器文档写入;该方法不访问浏览器文档,background bundle 另在无 DOM 环境执行验证。正确性、设计与简化独立复审在本轮范围内均已收敛;依赖补丁另经隔离的干净安装验证。
继续保留同一个 8 页 ego-lite 验收空间。原生工具栏/右键点击、缺少样本的登录态布局及完整跨浏览器验收仍待完成;已有笔记不会自动改写。未提交、推送或发布。
2026-10-15 P1 真实图片补验
P1 五站继续共用 page-images 附件转存。真实 Bluesky 原尺寸图片可以下载,但扩展及来源页的 fetch 均被 CORS 拒绝,浏览器记录 MissingAllowOriginHeader。本轮仅新增 https://cdn.bsky.app/* 主机权限,重载本地扩展后原生权限检查通过;未为其他四站新增不必要的 CDN 权限。
在 ego-lite 当前页面提取正文与图片,通过扩展页面下载真实 CDN 内容,使用共用转存函数和原配置 http://127.0.0.1:8787 上传、回写,再从浏览器回读附件:Facebook 1/1、Instagram 3/3、LinkedIn 8/8、Threads 4/4、Bluesky 1/1。17 张附件全部 HTTP 200、SHA-256 与源文件一致且能正常解码,临时笔记外链图片为 0。Facebook 使用当前帖头的永久链接;不放宽帖子身份匹配来猜测旧链接别名。
本轮 Instagram 首次转存为 2/3,三张图片实际均已下载,缺失附件在同一临时笔记中单独补验后齐全,因此不是一次保存全部成功的证据。额外验证 Medium 的 2 张真实图片转存与回读通过;Substack 文章和 Note 的 3+1 张图片均已下载、上传,但最后回写各遇到一次本地代理 503,不能记为归档通过。该错误重启后仍复现;其表现与 Wrangler 上游记录的代理连接竞争问题 一致,但本轮没有证明精确的底层触发机制,也未改 Wrangler、添加产品重试或宣称问题已经根治。
370 项扩展测试与 Chromium/Firefox 构建通过,Firefox lint 保留两条既有 Readability 警告。原生工具栏点击、右键及完整跨浏览器验收仍待人工完成;本轮没有通过脚本代替用户授予来源页权限。临时笔记及附件在验证后清理,用户原有笔记保留。本地扩展已重载,P1 页面已放到同一个验收空间;未提交、推送或发布。
2026-10-15 图片下载与附件回写验收
抽查现有验收笔记发现,公众号最近一篇仍有 16 张外链,雪球和即刻未转存,少数派则有全部成功和部分失败的记录。公众号 CDN 缺少主机权限且拒绝页面内跨域读取;少数派 CDN 在没有来源头时返回 403、带少数派根站点来源头时返回有效图片。扩展新增 https://mmbiz.qpic.cn/* 和 https://cdnfile.sspai.com/* 访问权限,并将豆瓣既有来源头规则与少数派规则放在同一模块;每条规则只作用于本扩展发起的相应 HTTPS CDN GET,不携带原文章路径或查询参数。继续复用 page-images 的下载、上传、编辑冲突保护及图片地址改写流程。
本轮还复现了本地 Wrangler 代理在最后 /save 返回 503:21 张图片虽全部上传,笔记仍保留 21 张外链。重启当前本地开发服务后,通过原配置 http://127.0.0.1:8787 完成公众号 21/21、雪球 3/3、即刻 1/1、少数派 9/9、豆瓣 6/6、掘金 2/2、小宇宙封面 1/1 的真实 CDN 下载、临时笔记上传与回写。43 张附件逐张回读均为 200,SHA-256 与下载内容一致,并全部在浏览器解码成功,临时笔记中的外链图片为 0。这证明重启后该入口的本次转存链路恢复,未修改 Wrangler 或宣称代理故障根因已永久修复。
扩展 370 项测试、根类型检查及 Chromium/Firefox 构建通过;Firefox lint 仍只有两条既有 Readability 警告。工具栏/右键 bundle 回归覆盖少数派来源头规则;ego-lite 验证原生主机权限、请求规则、共用转存流程及附件读取,原生工具栏/右键点击仍待人工点验。临时笔记和附件在核对后清理,已有笔记不自动改写;本地扩展已重载,需重新剪藏才能应用修复。尚未提交或发布。
2026-10-15 豆瓣书评分段与图片
豆瓣长评的段落使用 white-space: pre-wrap,同一个 HTML 段落中的空行也是作者分段。读取器现在在脱离原页面的副本上恢复这些分段,保留跨分段的加粗与链接,代码内部空行不作为段落边界。示例书评由原先合并的 2 段恢复为原页显示的 7 段,6 张图片的位置保持不变。
旧验收笔记确认为 6 张外链、0 张附件。图片 CDN 在缺失豆瓣来源头时返回 418,页面内 fetch 又受 CORS 限制。扩展新增 https://*.doubanio.com/* 主机访问和 declarativeNetRequestWithHostAccess 权限;会话规则只匹配本扩展发起的 HTTPS GET、img[0-9].doubanio.com/view/ 图片请求,将来源头设为豆瓣根站点,不携带原页面路径或查询参数。图片仍使用 page-images 的既有体积/时间限制、资源上传及地址改写流程,失败仍提示部分图片为外链。升级后可能需要确认新增网站权限。
ego-lite 已重载本地扩展,原生请求规则使 6 张真实 CDN WebP 均返回 200。共用 page-images 对临时笔记完成 6/6 资源转存与地址改写,随后从已配置实例入口回读:7 段正文保留、外链图片为 0,6 张附件逐张 SHA-256 与源图一致,并在浏览器中全部解码为 1080 像素宽的有效图片。该次完整上传/保存验证直连同一 API worker 的内部地址:正常本地 Wrangler 代理先后在一次上传和一次保存返回了 503 / Your worker restarted mid-request,当时未改扩展配置或重启开发服务;后续通过原入口的验证见上节。原生工具栏/右键点击仍由人工验收;本轮实站验证分段覆盖真实 DOM 读取、扩展 CDN 请求、共用转存流程与 API/浏览器回读。
扩展 368 项测试、根类型检查与 Chromium/Firefox 构建通过;Firefox lint 为 0 错误、0 提示和两条既有 Readability 警告。E2E 新增段落边界断言并通过测试收集,未重跑整组 E2E。两条临时笔记已清理,原有笔记保留;已有笔记不会自动改写。
2026-10-15 掘金表格结构修复
人工验收发现,掘金总结中的三列表格被转换成了连续文字。原页与夹具均保留完整 HTML 表格,问题在共用转换器缺少表格规则。现在通过 Joplin 的 Turndown 表格插件生成 GFM 表格,保留表头、行列及单元格中的链接和行内代码;仅启用表格规则。表格说明先按正常富文本段落转换,避免插件把字面 HTML 当作标记输出。固定插件版本并通过依赖补丁修正连续 || 被合并的问题,不改变代码原文。
ego-lite 同一真实掘金页通过笔记编辑器使用的 Markdown 解析器核对出 1 张表、3 列、1 行表头与 4 行内容,所有单元格文字和“事件循环”链接均与原页一致;2 张图片、原始发布时间及原页面 DOM 保持不变。扩展 363 项测试、根项目/移动端类型检查、Web 与 Chromium/Firefox 扩展构建及 diff 检查通过;冻结锁文件安装通过,保留既有依赖版本,仅新增表格依赖及补丁。工具栏/右键真实 bundle 回归覆盖保存及附件地址改写后的表格。E2E 新增编辑器行列断言,本轮仅验证测试收集,未重跑整组浏览器保存验收。复杂合并单元格、嵌套表格及单元格内多行富文本不在本轮验收范围内。重载本地扩展并重新剪藏后生效,已有笔记不会自动重写。
2026-10-15 少数派更新说明补全
人工验收发现,少数派把文章更新说明放在正文容器旁的独立区块,原读取器只取正文而遗漏该区块。现在按页面顺序追加同篇文章可见的更新说明,每条转为独立引用块,内部按原页顺序保留显示时间、加粗标题和完整正文,不将更新标题提升为章节。富文本及图片继续使用既有转换与转存机制;不重复保存顶部更新导航,不扩大到互动或侧栏。缺失可选标题/时间不丢弃更新正文,隐藏更新不采集,原始发布时间保持独立。
ego-lite 同一真实页面读取后解析 Markdown,确认时间、加粗标题“中国大陆推出睡眠呼吸暂停迹象提示功能”及完整说明位于同一个引用块,没有额外标题元素;原始发布时间仍为 2024-10-10,9 张图片和原页面 DOM 保持不变。引用格式修正后,提取与保存相关 123 项测试、根类型检查、Chromium/Firefox 构建及 diff 检查通过;工具栏和右键真实 bundle 回归覆盖更新正文及其中图片的地址改写。浏览器 E2E 增补引用块保存断言,本轮仅验证测试收集,未重跑整组 E2E。重载本地扩展并重新剪藏后生效,已有笔记不自动改写。
2026-10-15 公众号正文标题层级
保留原文总标题,仅修复公众号正文中用普通段落和字号排版的章节。按正文主要字号识别明显较大的整段文字,并将不同字号映射为二级起的标题层级;成组的“第几步:…”放在所属章节的下一级。原有标题标签、普通加粗段落、首字放大、编号操作项、引用、代码和图注保持各自语义,不改写标题措辞。字号信息不足时不据单独加粗猜测标题。
同一真实公众号页面在 ego-lite 读取确认 3 个二级章节和 4 个三级步骤,文章总标题、21 张有效图片及原页面 DOM 保持不变。夹具补留实站计算出的必要字号/字重/对齐属性,用于复现原有视觉标题。扩展 355 项测试、根类型检查、Chromium/Firefox 构建及 diff 检查通过。工具栏和右键 bundle 回归同时核对保存及图片地址改写后的标题标记;浏览器 E2E 增补标题元素断言,本轮仅验证测试收集,未执行该整组 E2E。重载本地重建的扩展后重新剪藏生效,已有笔记不会自动改写。
2026-10-15 公众号人工验收修正
人工验收发现,公众号专用读取器虽然保留了元数据与 wechat 标签,仍把作者放在 #js_content 中的关注横幅和装饰图片视为正文。现在仅在公众号路径清理明确的蓝字关注/关于引导及同组附图、标注为分割线的装饰 GIF、原生 CPS 广告和末尾独立的原生文章推荐卡。保留教程操作说明、代码/引用中的原文、有内容的 GIF 和正文内引用,不按“点击”“关注”等单个词删除段落。微信逐行 <code> 组件先合并为完整代码块,避免只保存首行。
这篇样本清理后保留头图及 20 张正文图,共 21 张,删除的 6 张为关注横幅附图、4 张分割线及文末推荐图;原始夹具保留不变。工具栏/右键真实 bundle 回归核对正文和图片转存,ego-lite 同一真实公众号页面读取也确认清理结果、六行模型代码均保留且未修改原 DOM。扩展 352 项测试、根类型检查、Chromium/Firefox 构建及 diff 检查通过。已保存的笔记不会自动重写,修复后的扩展需重载后重新剪藏。该记录不代表所有公众号版式、CDN 转存或完整保存界面均已实站验收。
2026-10-15 追加闭环复审
本轮补上六处边界:右键选区在排队、提取或笔记本查询期间导航时停止保存,iframe 保留自己的来源 URL;Substack Note 先过滤 CSS 隐藏内容再定位自身卡片,隐藏副本不会挡住可见正文;Substack 付费提示按实际可见文本判断,支持子节点恢复可见性;即刻图片容器和图片自身带按钮语义时仍保留全部已确认原图;Medium 缺失标题时仍识别文章壳,读取失败不回退通用正文;默认开发环境的 E2E 不等待被主动禁用的 Service Worker,只有显式配置构建实例时执行缓存与断网段。真实 CDN 转存、摘要及源站阻断后的图片读取仍在默认测试路径中。
删除了 Web 文档重置中重复的源码字符串断言,保留实际 DOM 复用、图片释放和撤销历史回归。扩展 348 项测试、Web 编辑器 7 项测试通过,根类型检查及 Chromium/Firefox 扩展构建通过;E2E 测试可正常收集。本轮未重跑浏览器 E2E 或新增实站验收,下面的浏览器结果仍属于上一轮记录。改动保留在原贡献工作区,未提交、推送或发布。
2026-10-15 技术规范补齐与 P1 修复
即刻 H5 话题信息流复用 social-target、capture-platform 和现有保存队列,只保存指针下唯一确认的卡片。Medium/Substack 文章补齐可用作者、原始发布时间、web-clip 和 medium/substack 标签;公开元数据必须对应当前文章,缺失元数据不阻止可读正文。图片沿用 page-images 转存并回传归档状态;下载、上传或地址改写失败时保留一条笔记,明确提示部分图片仍为外链。Medium 可见日历日期保留日期精度,相对时间仍原样保存。
实站 Substack 付费预览的 .paywall 显示橙色“内容受限”角标与阅读权限提示,整篇保存明确失败,标题或正文未加载时也不回退通用采集。有效的可见选区仍可保存。该判断不因“付费文章”元数据单独拒绝已可读的全文。新增文案同步 zh_CN/en/ja/pl。
P1 五站统一过滤 CSS 隐藏内容。正文已缺失时,不靠 SEO 文本恢复;图片声明用于核对现有媒体,不能替换错误图片或把漏图报为完整。Facebook/LinkedIn 字面 HTML 通过 Markdown 文本边界转义,代码块保持原文。Meta 的作者与发布时间均为可选。LinkedIn 仍保留此前明确支持的公开 JSON-LD 全图及访客正文路径;清除无关隐藏控件不阻止完整正文。
真实 CDN JPEG 验收发现 Web 编辑器会在重置文档前清空仍复用的图片节点。现改为更新后只释放已移出编辑器的旧媒体,保留现有撤销历史隔离;真实 ProseMirror 回归覆盖节点复用、旧图释放和切换后撤销深度归零。笔记本、列表、详情与预取的本地 repository 查询改为 offlineFirst:允许首次离线读取 IndexedDB 或桌面本地数据,失败重试仍等待联网。没有修改缓存格式、认证、资源存储或迁移机制。
离线边界:Web 需要已登录页面、已同步笔记与已请求且由 Service Worker 缓存的附件;普通 Web 断网刷新/新标签冷启动仍受现有会话请求限制。桌面/iOS 需要本地笔记及已读取附件缓存,当前批次没有原生端验收。Android 现有图片内存缓存不证明冷启动离线可用,USB 真机未验证。
本轮验证:3117 项单元测试、17 项集成测试通过;根项目/移动端类型检查、Web 与 Chromium/Firefox 扩展构建、diff 检查通过。Firefox lint 为 0 错误、0 提示和两条既有 Readability 警告。29 份可读样本的保存验收、真实 Substack 受限预览角标/拒绝保存及两项 HTML 安全检查,共 3 项 Chromium E2E 在 59.9 秒内通过。
新增即刻话题样本使用真实 CDN JPEG,实例资源回读与 CDN 内容摘要一致。生产 Web 确认 Service Worker 控制、附件缓存和 IndexedDB 笔记已写入后,通过 clipper.localhost 真正断网,核对网络请求失败、切走再重开笔记的正文/图片与新的离线搜索查询;未主动写入测试缓存。其余样本的来源图片仍由受控下载源替换,不能据此证明全部 CDN、登录态即刻 Web 或其他浏览器实站验收。页面播放器的原生媒体预载与剪藏脚本的 fetch 分开计数,仍验证剪藏不下载音频/视频。
验证直连本次独立 worker 的内部来源,避开 Wrangler 代理的已复现 503 和旧服务资产清单问题;临时 E2E 配置通过现有 local-dev CLI 创建并校验专用测试会话,没有改产品认证。API 回读确认本次测试笔记和令牌已清理,原有笔记保留;本次测试会话已撤销、独立 worker 与浏览器任务空间已关闭,原有开发服务保留。改动仍未提交、推送或发布。
本次补齐的平台(2026-10-14)
沿用已有贡献工作区,补齐微信公众号、即刻、少数派、掘金和豆瓣。当前改动均在本地,尚未提交、推送或发布。未新增实例 API、依赖、权限或数据迁移。详情页工具栏与专用右键菜单共用读取器;明确选区继续优先。
| 平台 | 保存内容 | 已验证边界 |
|---|---|---|
| 微信公众号 | 文章标题、完整富文本正文转 Markdown、公众号名、可用作者/时间、声明的头图及懒加载正文图片。 | 支持短链 /s/{id} 和带身份参数的 /s?__biz=…&mid=…&idx=…;存在 sn 时保留。去掉分享、赞赏与底部控件。作者、头图或时间缺失不阻止保存可读标题与正文。 |
| 即刻 | 完整可见动态及链接、发帖人、可用时间、按序的公开原图及链接卡片封面。 | 已采样公开移动分享详情的单图、九宫格、长文及 H5 话题信息流。话题页右键按自身作者资料、正文与图片唯一匹配公开帖子数据;不按数组位置或正文引用链接猜测 ID。工具栏仍要求明确选区或打开单帖。已加载的公开原帖数据用于核对身份/完整性与原图地址,不导入隐藏正文。本地展开控件有等待上限。Web 详情跳转扫码登录页时显示橙色需登录角标,并拒绝整页采集;登录后的 Web 布局尚未验收。 |
| 少数派 | 文章标题、完整结构化正文、更新标题/显示时间/正文、作者、原始发布日期、原图与图注。 | 支持 /post/{id};更新按页面顺序保留,排除重复更新导航、隐藏作者浮层、互动与侧栏。 |
| 掘金 | 文章标题、完整正文、公开作者/时间元数据、图片、结构化对比表格,以及保留语言和缩进的围栏代码块。 | 支持 /post/{id};去掉复制代码控件,空图片占位不算已归档图片。 |
| 豆瓣 | 书/影/音长评、日记和选中的单条短评,保留可用作者/日期/评分及正文配图。 | 长评与日记按准确正文容器读取。作品短评列表中,右键目标卡片或选择一段文字;工具栏不保存整个列表。实测部分短评详情链接返回 404,因此保留可访问的列表来源 URL 及已有单条锚点。标为已编辑的时间不冒充原始发布时间。 |
不可读的已适配详情明确失败。已知身份变化、正文截断、即刻声明图片缺失或不匹配、隐藏内容,不会作为完整帖保存;可选元数据仍按可用性保留。登录页或短评列表只允许保存用户最初明确选择的文字;该选区中途消失时使用已记录的原文字,不回退为整页采集。沿用既有图片传输上限与部分成功提示。
真实浏览器中还通过 DOM 右键事件核对了书、影、音列表的单条短评定位。新增十一份真实页面脱敏夹具,在 apps/extension/fixtures/platforms/sources.json 记录来源与预期。浏览器读取器检查覆盖公开实站页面;即刻展开成功/超时/导航使用真实 bundle 和受控 DOM 验证,不代表实站展开点击验收。Chromium 持久化检查以受控下载源替换来源图片,不能据此证明真实 CDN 转存、Edge 或 Firefox 运行时已通过。
2026-10-14 验证:3071 项单元测试、17 项集成测试通过,根项目/移动端类型检查、Web 构建、Chromium/Firefox 扩展构建及 git diff --check 通过。Firefox lint 为 0 错误、0 提示,保留两条既有上游 Readability 警告。独立正确性与设计复审已关闭即刻正文缺失/变化、图片错绑、隐藏元数据和选区消失后回退整页的问题。
28 样本 Chromium 持久化测试在 52.7 秒内通过,覆盖十份新增详情夹具和先前十八份样例。逐份通过真实构建扩展及本地 API 保存,核对已存正文与预期图片引用,屏蔽来源后重开 Web 编辑器并检查全部正文图片;不可读变体拒绝创建第二条笔记。另两项 HTML 安全检查通过。正文断言排除编辑器自身无来源的 ProseMirror 分隔图与复制代码按钮,仍检查归档正文和每个预期附件。
本地开发的测试请求转发层两次在无关编辑器元数据请求上发生连接重置。现在设置 EDGE_EVER_CLIPPER_TEST_INSTANCE_URL 时,测试中的构建 Web、API 与扩展直接使用同一个 workerd 来源;未设置时沿用正常配置的 base URL。Web 构建后已重启本次创建的本地服务,刷新静态资产清单;未修改产品 API、增加重试或放宽超时。清理后通过 API 回读确认测试剪藏与测试令牌均为零,并关闭浏览器任务空间。未提交、推送、创建 PR 或发布,也未替换主工作区已安装的扩展。预览本次适配需加载 edgeever-clipper-p2/apps/extension/dist 并刷新来源页。
2026-10-14 追加复审:修复工具栏与右键并发时串存选区,以及受限页选区采集/保存期间导航未被拦截的问题。工具栏保存统一且仅一次进入既有采集队列,入队前固定点击时的标签页和来源 URL。涉及通用网页/选区采集时,在任务开始、采集回包及笔记本查询后的保存前核对原 URL;删除平台/视频分支内层排队,避免相互等待。覆盖另一页通用工具栏并发场景;未新增队列、重试、API 或元数据必填条件。七项真实 bundle 回归覆盖两种并发入口组合、排队时切换活跃页、即刻/豆瓣在注入或笔记本查询期间导航,以及超时后旧回包晚于下一条采集开始的场景。通用网页/选区消息增加请求标识,仅匹配的等待请求消费回包;超时或注入失败不会清空后续请求。
追加复审验证:3078 项单元测试、17 项集成测试通过;根项目/移动端类型检查、Web/Chromium/Firefox 构建及 diff 检查通过,Firefox lint 保持 0 错误和两条既有 Readability 警告。完整 28 样本 Chromium 持久化测试与两项 HTML 安全测试在同一轮共 52.3 秒内通过。独立复审确认并发、导航和迟到回包问题已关闭,没有新的实质发现。API 回读确认测试笔记/令牌均为零,本次创建的本地服务已停止。仍未提交、推送或发布。登录后即刻 Web 布局、真实 CDN 转存及其他浏览器运行时仍不属于已验证范围。
Phase 2:BOSS 直聘、雪球、小宇宙(2026-10-12)
基线为官方 3855efb3,P1 已由 PR #521 合并。P2 在贡献工作区 edgeever-clipper-p2、分支 feat/clipper-phase2 实现,保留原工作区无关改动。
| 平台 | 当前行为 | 明确边界 |
|---|---|---|
| BOSS 直聘 | 保存岗位标题、可读薪资、城市、经验/学历、可见福利、完整职责与任职要求、公司介绍和工作地址。 | 仅支持 zhipin.com/job_detail/{id}.html;若存在 canonical 则核对身份。只要求可读岗位标题与正文;明确登录截断仍拒绝。薪资、经验/学历、公司与地址等按可用性保留,缺失或隐藏则省略,不强制薪资格式,不读取受限数据,不把页面更新时间当发布时间。 |
| 雪球 | 保存公开详情全文、作者、原始帖发布时间、正文配图;附加 web-clip、xueqiu、投资 和最终净化正文明确股票链接中的代码。 |
港股五位数字保留前导零。最多 21 个股票标签,加 3 个固定标签,符合实例 24 个标签上限;正文仍保留全部链接。不猜测普通文字中的股票代码,不从评论/侧栏打标签;修改时间不冒充发布时间。 |
| 小宇宙 | 复用已有完整 Show Notes 与当前路由校验,保留时间轴、节目名、封面和正文明确的主播信息。 | 不从节目作者推断当集主播,不新增音频下载或转写。不补造时间轴跳转链接;无 href 的时间节点按原文保留。新增 CSS 隐藏子树/标题保护。 |
工具栏、专用右键菜单和当前网页状态同步识别 BOSS 岗位与雪球详情;状态只表示采集模式,保存时仍检查可读性。雪球详情以当前页面 URL 绑定目标,作者与发布时间不设必填;可用的自身永久链接/作者身份明确冲突时拒绝。首页/个人页的右键定位需要卡片自身永久链接,重复的相同 URL 不构成多帖;本次真实样本为截断预览;右键选中的自身卡片会在临时同源预览框中读取对应公开详情,禁用脚本并保留浏览器计算的 CSS 可见性,验证身份后保存完整正文。登录/验证页、预览框不可访问、错误详情或途中导航会拒绝保存,不将预览或整个信息流视为完整帖子。
BOSS 用户指定岗位 0d7e760b0a0e7c3a0nF939S0E1NU 在初次采样显示登录截断和 SVG 薪资占位;刷新后可读取完整薪资 25-50K·13薪、全部任职要求、公司介绍和地址。两种状态均保留去敏夹具。BOSS 夹具将浏览器计算为隐藏的节点标为 hidden 后移除样式,用于验证站点随机隐藏干扰文本不进入笔记。雪球公开长帖保留三图和三只明确股票;小宇宙新增“下课以后”单集样本,核验六个时间节点及明确的阿丁、毛毛主播文本。
验证覆盖去敏真实 DOM、身份/隐藏/权限截断边界、实际打包后台与读取器的工具栏/菜单一致性、股票标签持久化及图片转存。Chromium 集成使用此工作区的新本地 Web/API,覆盖 18 个页面样本,包括新岗位、雪球长帖及明确主播单集;检查来源被屏蔽后的附件和编辑器重新打开、拒绝保存不创建笔记,并清理验收笔记和令牌。原始图片响应以测试 PNG 替换,因此不把夹具 E2E 当作真实 CDN 下载验收。Edge/Firefox 实站保存、Firefox Android、BOSS 其他版式/移动页面和所有登录态信息流仍未验证;未发布扩展商店版本。
P2 基础验证:完整非 E2E 3,020 项单元测试和 17 项集成测试通过;根目录/移动端类型检查、Web 构建、Chromium/Firefox 扩展构建通过;Firefox lint 0 错误,保留 2 条已有依赖警告。18 样本 Chromium 保存流程与 HTML 安全测试均通过。当前代码尚未提交、推送或创建 P2 PR。
2026-10-12 补充:打开扩展时,对 BOSS 岗位执行只读 DOM 探测。仅当前岗位正文中可见的“登录查看完整内容”标记触发琥珀色“需登录”角标和登录/刷新提示;隐藏的残留标记或无关登录控件不会触发。探测权限失败或途中导航显示“未识别”,不显示绿色适配勾选。此角标不保证其他字段完整,保存仍执行身份与全文校验。按钮保持可用,以保留有效文本选区;未选择文字的受限岗位仍拒绝创建笔记。提示不会覆盖已开始的保存反馈。
登录角标补充验证:248 项扩展测试和根目录类型检查通过;Chromium 的 18 个页面样本保存流程同时验证可读/登录预览两种实际弹窗状态。Chromium/Firefox 构建通过,Firefox lint 保留原有 2 条警告、无错误。
2026-10-13 审查修正:撤回无依据的 BOSS 元数据必填/薪资格式限制、雪球详情作者/时间链接必填及通用展开类名拒绝。股票标签与 Markdown 使用同一份净化正文,控件或脚本中的股票链接不再贡献标签;保留实例 24 标签上限,撤回无依据的股票代码 15 字符上限。CSS 过滤区分整子树隐藏与可由后代恢复的 visibility:去掉隐藏自身文字,保留显式恢复可见的子节点;BOSS 角标与小宇宙正文同步处理该边界。两份 BOSS 夹具进一步移除无关动作跳转、跟踪与安全参数。
审查后验证:顺序执行完整非 E2E 测试,3,031 项单元测试和 17 项集成测试通过;根目录/移动端类型检查、Web 和 Chromium/Firefox 扩展构建通过,Firefox lint 0 错误、2 条已有依赖警告。Chromium 中的实际 CSS 可见性和惰性 HTML 安全测试通过。初次并行验证中几个未修改测试超时,隔离检查与最终完整重跑均通过;未修改这些测试或生产基础设施。18 样本集成重跑未完成:先遇到本地开发 API 代理 503/超时,改用 EDGE_EVER_CLIPPER_TEST_INSTANCE_URL 直连同一 workerd 后,小宇宙与 BOSS 的保存和 API 正文回读通过,但编辑器重开在本地 Vite 页面加载时超时。机器负载约 38 时,最后重跑仍在 Web 导航超时;未放宽测试时限或修改生产链路。先前 18 样本通过记录仅代表当时版本,本轮不声称整组 E2E 验收通过。本轮测试笔记及令牌已清理,并通过 API 回读确认无残留。
Phase 1:五个社交平台(2026-10-10)
Facebook、Instagram、LinkedIn、Threads、Bluesky 已新增专用读取器。打开支持的单帖后使用工具栏,或在帖卡上右键选择对应平台命令。选区剪藏保持优先。已打开的信息流需要刷新一次以加载目标监听器;无法识别卡片时打开详情页。不自动抓取或代为登录。
| 平台 | 支持的详情 URL | 保存内容 |
|---|---|---|
facebook.com/{account}/posts/{id}、permalink.php、story.php |
完整可读主帖、作者/组织、可用时间、已加载配图,排除评论与控件。 | |
instagram.com/p/{code}/、/reel/{code}/ |
完整可读配文、Handle、时间、完整已加载轮播图片或视频封面。 | |
linkedin.com/posts/…-{type}-{id}-…、/feed/update/urn:li:{type}:{id}/ |
完整动态、发布者、个人职业简介、时间、完整已加载图集(type 为 activity、ugcPost 或 share)。 |
|
| Threads | threads.com/@{handle}/post/{code} 及 threads.net 别名 |
完整动态、Handle、时间、已加载图片及明确引用内容。 |
| Bluesky | bsky.app/profile/{handle}/post/{id} |
正文、作者、可用时间、CDN 原尺寸图片及可见引用帖。 |
标签为 web-clip 加 facebook、instagram、linkedin、threads 或 bluesky。不下载视频。轮播缺项、正文截断、登录墙及错误 ID 会明确失败。来源身份使用帖头链接,排除正文及引用帖中的链接;隐藏 Meta 卡片不视为可读。
在 Ego Chromium 中采样了未登录真实页面,五站右键目标均已实测,包含 Bluesky 信息流。去敏夹具中 Facebook/Instagram/LinkedIn/Threads/Bluesky 预期图片数为 1/3/8/4/1。实际打包脚本测试覆盖菜单与工具栏一致性、信息流定位、引用内容、排队右键、导航、错误身份和图片部分失败。Chromium 持久化测试加载真实扩展及夹具,通过本地 API 保存;图片来源使用受控本地服务器,不是真实 CDN。屏蔽来源后检查全部预期附件及重新打开的编辑器正文。
本 PR 包含实现与回归检查。210 项扩展测试、根项目与移动端类型检查、Web 及 Chromium/Firefox 构建通过;Firefox lint 保留两条上游 Readability 警告。登录后的推荐流、Edge/Firefox 运行时保存及 Firefox Android 仍未验收。
八个平台的 Chromium E2E 通过(先前三个适配器加 P1),覆盖全部预期图片资源、重新打开编辑器后的图片、不可读页面拒绝和测试数据清理。Wrangler 4.112.0 开发代理间歇对 POST 返回 503,正文为 “Your worker restarted mid-request”。本次通过 EDGE_EVER_CLIPPER_TEST_INSTANCE_URL=http://127.0.0.1:64641 直连同一本地 workerd API;新开发进程需要重新确定内部端口,测试默认实例 URL 仍使用 base URL。未改生产 API 或运行时代码。Ego 已安装的开发扩展已重新加载;原有来源页需刷新以加载新目标监听器。
2026-10-11:修复 Instagram 为轮播各页提供独立配文时的误判。读取器用目标帖链接和当前可见页配文确认内容,保留已加载的全部逐张配文与媒体封面;父级文案若只是截断前缀则用完整逐张文案替换,独立父级文案继续保留。Google 的 DeKe6teEpya 实站页面已读取已加载的父级配文和 20 张封面(1 个视频、19 张照片);回归检查任意页配文、隐藏卡片、无关文字和轮播缺项。视频本身仍不下载。新增样例通过真实扩展、本地 API、20 张图片转存和屏蔽来源后重开笔记的 Chromium E2E;本次使用默认本地实例地址。
2026-10-11:补齐 LinkedIn ugcPost 分享链接和登录后 SDUI 帖卡识别,UGC 与 activity ID 保持区分。目标身份从主配文中的准确 UGC ID 读取,不使用评论或引用链接。实站样例 7497764716677758977 已读取完整正文、Friends of NASA、页面显示的相对时间和 8 张图片;归档正文中的 LinkedIn 安全跳转链接还原为目的地址,不保留跳转跟踪参数。该样例的单独 Chromium E2E 通过真实扩展、本地 API、8 张图片转存和屏蔽来源后重开笔记;使用同一 workerd 的内部 API 地址避开开发代理的间歇 503。整组测试首次遇到代理 503,重跑后停在先前 Instagram 的浏览器流程并被中断,因此本次不声称整组 E2E 通过。测试笔记及令牌已清理。
2026-10-11:补齐未登录的 LinkedIn UGC 帖子。公开帖卡同时提供 data-activity-urn 和 data-attributed-urn,JSON-LD 使用 activity 地址;读取器依据帖卡本身的声明匹配 UGC 请求,并保留请求的来源身份。匿名 HTTP 响应确认有完整正文、准确发布时间和全部 8 张图片,不要求登录;错误归属 ID 和正文中的其他帖子链接仍被拒绝。该未登录样例通过真实扩展、本地 API、8 张图片转存及屏蔽来源后重开显示的单独 Chromium E2E;多状态连续测试未完成,不据此声称整组 E2E 通过。
2026-10-11:对照本地实例中同一 LinkedIn 帖子的登录与未登录剪藏,正文文字、8 张图片及顺序一致。移除误混入正文的作者资料(如关注者数量);帖子正文中相同的文字仍保留。登录与未登录正文共用清理和 Markdown 转换:统一换行、跳转链接、话题链接及 LinkedIn 自动添加的链接加粗;可见正文不完整时才用 JSON-LD 补全文本。两份真实页面样本在 Chromium 中得到完全一致的正文 Markdown 和链接目标,均保留 8 张图片,回归测试直接比较两种状态的正文。发布时间保留页面实际提供的精确或相对时间。已有笔记不自动改写。
2026-10-11:修复 Threads DeMqtuYgkaL 的省略链接导致可读配文匹配失败。仅在准确帖卡和发布时间链接范围内,使用真实 href 核对配文中的链接;错误链接仍拒绝。实站读取到完整配文、NASA、原发布时间和 1 张视频封面,不下载视频。
Substack 短帖与已加载文章
Substack Note 详情页 https://substack.com/@{handle}/note/c-{id} 通过工具栏或详情页右键菜单保存。按原帖的作者路径、Note ID 和头部永久链接绑定正文;优先使用完整详情,避免选中同一帖子在推荐列表里的截断卡片。保留当前显示的全部段落、格式、作者、来源时间和已加载配图,排除头像、互动操作、评论及侧栏;隐藏或截断正文明确失败。当前仅适配上述详情 URL,不声明推荐流右键定位支持。
Substack 长文章仍通过网页采集入口,识别 Substack 子域名,以及带 Substack 样式资源标记的自定义域名。保留文章标题、副标题、正文、章节、图片与图注,排除订阅组件、分享按钮和章节链接控件。选区继续优先,只读取当前页面内容;未验证付费文章及特殊媒体嵌入。
2026-10-11:实测用户提供的 Ted Gioia Note c-357811021,未登录页面可阅读完整五段正文和一张配图;发布时间来自该原帖 JSON-LD。实站读取排除评论与侧栏。另实测 One Useful Thing 自定义域名的公开文章 the-dot-and-the-swarm,保留首尾正文、三个章节和三张图片。两份脱敏结构样例通过单独 Chromium E2E:真实扩展、本地 API、全部图片转存、屏蔽来源后重开笔记显示图片。短帖另外使用真实 Substack CDN 配图验证,独立下载 65,583 字节,归档前后 SHA-256 一致,屏蔽来源后重开仍显示;长文章图片验证使用受控下载源。测试笔记与令牌已清理,完整平台 E2E 本次未重跑;不声明所有 Substack 页面或跨浏览器运行时均已验收。
Medium 已加载文章
Medium 仍通过通用网页剪藏入口保存,新增正文块提取:保留页面已经显示的标题、副标题、正文、章节、图片和图注,去掉会员提示、互动数字、高亮操作提示及图片查看提示。识别 Medium 域名和带 Medium 站点标记的自定义域名;不抓取隐藏付费正文。选区优先级保持不变。
2026-10-11:实测用户提供的文章 a2ce2e6de88e,原 Medium 地址跳转到 scottbatson.dev。当前浏览器可阅读完整正文,实站提取保留首尾正文、Slow work/Writing 章节及 2 张图片和图注。该文章及上述 Threads 样例通过单独 Chromium E2E:真实扩展、本地 API、全部图片转存、屏蔽来源后重开笔记并显示图片。图片下载源由受控本地服务器替代,不能据此宣称真实 CDN 转存或 Medium 所有文章已验收。沿用同一 workerd 的内部地址避开开发代理间歇 503;测试笔记和令牌已清理。整组 E2E 未在本次重跑。
先前的详情页适配
使用方式
配置扩展的 EdgeEver 实例和 API Token 后,打开详情页,使用工具栏保存,或在页面空白处右键选择对应平台的保存命令。
| 平台 | 详情页 | 保存内容 |
|---|---|---|
| Hacker News | https://news.ycombinator.com/item?id=… 主帖 |
标题、可用作者和发布时间、采集时积分、正文和原始外链。链接帖可以没有正文;不继续抓取外链文章。 |
| V2EX | https://www.v2ex.com/t/… 或 https://v2ex.com/t/… |
正文、可用作者和发布时间、全部附言及其序号和可用时间,不含评论。 |
| 小宇宙 | https://www.xiaoyuzhoufm.com/episode/… |
单集标题、节目名称、发布时间、完整 Show Notes、其中的时间轴和明确写出的主播、封面及正文图片。没有有效链接的时间戳保留为文本。 |
有文本选区时,工具栏优先保存选区。已有选区和图片右键命令保留;新菜单只使用页面上下文。首页、列表、节目主页、用户主页和 HN 评论页不属于专用剪藏目标,请先打开详情页。
平台笔记带 web-clip 和 hacker-news、v2ex 或 xiaoyuzhou 标签。来源去除跟踪参数、评论分页和锚点。原始发布时间与采集时间分别记录;只有日期或相对时间时保留其精度,缺失字段省略。
抓取时间、发布时间和附言时间统一使用剪藏时浏览器所在系统的时区,格式为 yyyy-MM-dd HH:mm:ss,不显示时区标记或小数秒。例如在 Asia/Shanghai 系统环境中,V2EX 的 2023-12-13T13:25:31+08:00 显示为 2023-12-13 13:25:31。时区明确时换算到系统时区;未知时区不推测,保留原始时钟值,只有日期或相对时间时保持原信息。HN 页面省略时区的完整时间已与官方 API 的 Unix 时间戳核对,HN 专用解析器为其补上 Z。这些时间保存为正文文本,不随之后的设备时区变化。现有视频笔记仅记录本地抓取日期。V2EX 附言以序号作为小标题,时间另起一段普通文本。格式调整用于新剪藏,已有笔记保持原样。
详情页读取失败时,不回退成整页保存。按提示登录、等待加载、展开正文或回到目标详情页后重试。小宇宙只有确认 Show Notes 为空时,才保存元数据并注明“本期无 Show Notes”;读取失败不等于没有内容。不下载音频、不转录,也不生成摘要。
图片与反馈
正文先保存,再沿用现有图片转存流程:最多 30 张、每张 20 MiB、累计 60 MiB,完整流程预算 45 秒。
- 无图片或图片全部转存时显示保存成功;只有全部转存后才说明图片已归档。
- 下载、上传、回写失败或超限时,保留笔记并提示“正文已保存,部分图片仍为外链”。超出 30 张的图片也计入未转存数量。
- 转存期间编辑过笔记时,保留用户版本,不覆盖,也不重复创建。
图片归档表示图片可从 EdgeEver 实例资源读取,不是对整个客户端断网能力的新承诺。
验证记录
代码基线为上游 96626ef2,扩展开发版本为 0.1.17,未递增商店版本。以下先前记录描述上一批本地验证。
以下检查通过:
bun run test:extension
bun run typecheck
bun run typecheck:mobile
bun run build:web
bun run build:extension
bun run build:extension:firefox
bun run lint:extension:firefox
bunx playwright test tests/e2e/web-clipper-html-safety.spec.ts tests/e2e/web-clipper-platforms.spec.ts tests/e2e/web-clipper-page-images.spec.ts --reporter=line
扩展测试 136 项通过,3 项 Chromium E2E 通过;类型检查、移动端类型检查、Web 与 Chromium/Firefox 扩展构建通过。Firefox lint 为 0 errors、0 notices、2 warnings;lint 和 Chromium 验证不代表 Firefox 实机验收完成。
2026-10-09 补充回归:此前 HN 提交 16e11216 将发布时间保存为不带时区的文本。对照官方 API,样本的 1715879518 对应 2024-05-16T17:11:58Z;已修正 HN 专用解析器,并验证显式时区、仅日期和相对时间保持原样。在实际安装的 Ego Chromium 扩展设置页复现的三条 cross-world extension resource mismatch 警告,通过仅在扩展构建中设置 modulePreload: false 消除;设置页及弹窗正常加载,“测试连接”成功返回笔记本列表。
小宇宙自身的 UNSAFE_VAR_ASSIGNMENT 已修复:复用已有 Domino 依赖,在纯 JavaScript DOM 中解析完整性校验数据,仍只保存页面 DOM 中的正文;注入脚本增加约 236 KB,未新增依赖或权限。
2026-10-10 已撤回为消除第三方警告而添加的 Readability 补丁、注册和专用测试,并重新安装锁定的原版 @mozilla/readability@0.6.0。其正文重试与 <noscript> 图片解析中的两条静态警告保留,不屏蔽 lint 规则。当前调用仅传入脱离页面的文档副本,且预先移除脚本、嵌入内容和 <noscript>。Readability 本身不负责清洗不可信 HTML,其输出不能直接作为安全 HTML 插入页面。
撤回后重跑 135 项扩展测试和 3 项 Chromium E2E 均通过。Show Notes 校验测试禁止浏览器 HTML 赋值和解析入口,并以脚本、事件属性、图片、iframe、音频和视频探针验证无代码执行或资源请求;活动页面中的对照图片成功触发请求和事件。另两项 E2E 验证通用页面图片保存及三站笔记、图片持久化。上述运行证据属于 Chromium。
- DOM 夹具采自下表的公开页面,移除无关内容和敏感参数,来源与预期记录在
apps/extension/fixtures/platforms/sources.json。边界变体为合成测试,不冒充实站样本。 - 测试覆盖元数据、附言、代码、图片、危险 HTML、日期精度、空内容、展开超时、选区优先、消息关联、权限、导航、图片部分失败、超限和编辑冲突。
- Playwright 1.62.1 使用 Chromium / Chrome for Testing 151.0.7922.34 加载真实扩展,通过本地 API 保存三站样本,各验证成功和不可读失败路径,再在 Web 编辑器重开笔记。关闭来源页并阻断外部来源后,小宇宙封面仍由实例附件显示。仅临时测试扩展授予固定测试主机权限;正式 manifest 未增加权限。测试笔记和 Token 已清理。
- 原有通用页面图片 E2E 通过;扩展测试同时覆盖选区、图片及 X、Reddit、小红书、知乎、GitHub、YouTube/B 站相关代码,未逐站重做实站验收。
- 正确性、简化、设计三个独立只读复审均无未处理实质发现。已修复选区清洗为空后的全文误保存、标题空白误判和小宇宙站内导航旧数据问题。
实站采样在未登录的 Ego Chromium 浏览器中进行,报告的 UA 为 Chrome/152.0.0.0。这些步骤运行构建后的提取脚本;持久化由上述本地实例 E2E 独立验证。
| 样本 | 预期与实测 |
|---|---|
| HN 主帖 40380738 | 成功保留作者 jnnnthnn、原时间、主帖全文末段和外链,不含评论。 |
| HN 评论 40384810 | 正确返回不可读,拒绝作为主帖。 |
| V2EX 1000000 | HTTP 实页采样及夹具验证保留正文、两条附言和各自时间,不含回复。实站浏览器导航超时,该站浏览器实站保存未验证。 |
| 小宇宙第 25 期 | 完整保留时间轴和最后的音乐条目。展开前 DOM 已含全文,无需额外点击。 |
| 小宇宙第 161 期 | 从第 25 期经节目页切换后,首屏 __NEXT_DATA__ 仍为旧 ID。改用当前路由已加载的单集数据校验 DOM 后,提取新 ID、新标题、新正文,无旧单集内容。 |
尚未完成 Chrome、Edge、Firefox 各自加载扩展后的三站完整实站保存验收;Firefox Android 也未验证,因此本批不能标为全部验收完成。2026-10-09 核对确认 HN 初版已通过 PR #505 合并;本 PR 包含 HN 时间修正、预加载修正及 V2EX/小宇宙实现。
2026-10-11 本地审查
本轮修复 Instagram 父级配文截断后遗漏后半正文的问题,保存已加载的全部逐张配文并保留独立父级文案;Meta 可读性检查和右键定位共用同一帖卡边界;拒绝隐藏的 Facebook/Bluesky/LinkedIn 正文;删除依据普通分数正文推测 Bluesky 图片数量的逻辑;已识别但不可读的 Medium/Substack 文章明确失败,不再退回整页采集。文章识别与 Markdown 转换复用共享能力。先前 Instagram 验证没有断言最后一张图片的文案,本轮回归及 Chromium 编辑器验证已补齐。
端到端夹具测试覆盖全部 15 个样例,通过真实扩展、本地 API、图片转存及屏蔽来源后的编辑器重开,同时验证不可读/隐藏内容拒绝和清理。因本地开发代理间歇超时,扩展、API 断言及编辑器 API 请求均直连同一 workerd;这证明本地业务链路,不能视为代理故障已修复,也不代表所有实站 CDN 或浏览器均已验收。浏览器 HTML 安全检查通过。Firefox 仅完成构建与 lint,本轮未新增 Firefox 运行时验收。
2026-10-18 补验:ego lite 用户手动触发原生工具栏,同篇 Substack 完整文章的两次保存及各 3/3 图片归档通过;两条笔记均在来源/CDN 被阻断后重开,正文一致、六图解码。测试数据及专用令牌已清理,原数据完整保留。详见 #588 验收记录。
2026-10-18 第六轮补验:Firefox 新增 Instagram 20 项媒体及豆瓣影评、乐评、日记、短评单卡;Edge 新增 Instagram 20 项媒体及 Facebook 公开详情。七条笔记、52 个附件完成实际保存与来源阻断后重开。Edge Threads/LinkedIn 登录遮罩下正确拒绝,登录态待用户完成;Firefox Medium 访问验证受阻。测试数据、令牌、临时会话与工具已清理,原数据与产品构建摘要保留。详见 #588 验收记录。
2026-10-18 第七轮补验:用户在原 Edge 窗口登录后,Threads 四图/短链详情及 LinkedIn SDUI UGC 八图详情通过原生工具栏保存、完整来源正文核对及来源阻断后重开。13 个附件按顺序匹配独立源下载;三条笔记、13 个资源及测试令牌已清理,原数据和网站登录保留。Edge Medium 仍在 Cloudflare 验证页等待用户处理。详见 #588 验收记录。
2026-10-18 Medium 第八轮补验:用户分别通过 Edge/Firefox 的人机验证后,公开文章《Come to my Medium Day talk》完成两浏览器原生保存、16 个正文块/五项列表/末段核对、1/1 配图归档及来源阻断重开。原文章当前为会员预览,Edge 仅验证 11 个可见文本块及一张图,没有隐藏付费正文。三条笔记及三个资源和专用令牌已清理,原数据、网站登录及验证状态保留。详见 #588 验收记录。
2026-10-18 第十二轮补齐最终构建在 Firefox/ego lite 的 Medium 40 块代码高亮和含图 Threads 引用,以及三浏览器即刻九图位置保留。Firefox/ego lite 各11图来源阻断重开通过;Edge 即刻8/9归档且如实提示外链,八图重开通过。七条笔记/30资源及令牌清理、原数据核对和 #588 六项完成条件逐项证据见验收记录。可提交维护者结案审阅,未回写 GitHub;保留自然卡片复用、未采样版式及 #587/#589 边界。
2026-10-18 第十三轮整体复审修复 Medium 容器内代码与根 pre 段落身份的语言/换行遗漏,撤去无依据语言长度上限。完整非 E2E 3,746 项、扩展 484 项通过,独立复审收敛;本轮仅自动化验证,实站记录不追溯到新构建。详见验收记录。