# 1 这个是新的技能需求,[lightweight-web-article-clipper.md](C:/Users/wangq/Documents/Codex/knowledge-vault/requirements/skills-vault/lightweight-web-article-clipper.md) 这个是我以前的在其他机器上的类似技能,`D:\article-download\`。这个缺点是,每次我得提供cookie。 这是我和ChatGPT交流,它给的建议:`C:\Users\wangq\Documents\Codex\knowledge-vault\discussions\agents\GitHub助手GPT\2026-06-27-知乎、x文章.md` --- 关于这个技能,有什么问题和想法? 我倾向于做,但不要按“爬虫平台包”来做。 核心判断:`clip-web-article` 应该是一个轻量 Skill,默认保存“当前可见文章材料”,然后做统一输出规整;旧的 `D:\article-download` 只能作为参考,不能直接迁移。旧实现里最大的问题不只是 cookie,而是硬编码机器路径、输出到 `temp/downloads`、平台子目录、部分脚本会删除已有输出目录,并且把作者/日期/分隔线等塞进正文,和这次需求相反。 主要问题有几个: 1. **OpenCLI 可作为底座,但不能直接等于成品。** 它当前文档确实覆盖知乎、微信公众号、小红书、Twitter/X 等下载能力,也要求 Node >= 20 和 Browser Bridge;本机 Node 是 `v24.14.1`,但还没有 `opencli` 命令。它的输出通常会带 frontmatter、images 子目录或平台语义,需要 wrapper 再清洗。参考:[OpenCLI docs](https://opencli.info/docs/)。 2. **cookie 不应该再进入默认路径。** 正确边界是:公开页能抓就直接抓;需要登录时,让用户在连接的 Chrome/Edge 里打开页面,Skill 只读可见 DOM/页面内容,不读、不保存 cookie/localStorage/token。OpenCLI 的 Browser Bridge 思路比“粘贴 cookie”更接近这个方向。 3. **小红书和 X 要降级预期。** 小红书很多价值在图片里,OCR 不应默认做;X 的 thread/article/media 抽取很容易混入回复、引用、时间线内容。初版应接受“正文 + 可见图”而不是完整平台归档。 4. **脚本部分应只做确定性工作。** 我建议内置脚本负责:标题清洗、非覆盖目录创建、Markdown 清洗、图片下载/重命名、相对链接重写、失败图片保留可读内容。平台登录和可见页面获取交给 OpenCLI 或浏览器自动化,不在脚本里实现绕风控。 5. **依赖要补。** 当前 `skills-vault` conda 环境没有 `requests`、`bs4`、`markdownify`、`playwright`。如果做 Python 实现,要更新 `environment.yml` 并验证;如果 OpenCLI-first,则要把 Node/OpenCLI/Browser Bridge 作为外部依赖检查,而不是悄悄假设存在。 推荐方案:**Hybrid thin wrapper**。 - Skill 名用 `clip-web-article`。 - 默认输出到 `knowledge-vault\sources\clipped-articles\文章参考`。 - 优先用公开页面或已连接浏览器获取可见内容。 - OpenCLI 可用时优先借它处理知乎/公众号等成熟路径。 - 统一后处理成:一个文件夹、一个 `.md`、同级 `img_1.jpg` 这类图片。 - 不写 metadata、log、raw html、原始 URL、frontmatter。 - 单元测试只测本地 fixture 和后处理;真实平台只做手动 smoke。 我唯一想先确认的决策是:初版是否接受 **OpenCLI 作为可选/优先底座**?我的建议是接受,但 Skill 必须能在 OpenCLI 不存在时给出清楚失败原因或走浏览器可见页面兜底,而不是把 OpenCLI 变成隐形硬依赖。 # 2 **我更不希望重新造轮子。** 接受 **OpenCLI 作为可选/优先底座**,可以把这个 OpenCLI 变成硬依赖。OpenCLI我已经装了。 或者你基于`article-download`改造也行,只要别让我手工提供cookie就行。`article-download`是我之前用Openclaw打造的,更贴合我的使用。你照着`article-download`做,只要能测试通,反而会少了很多后续的调整。 --- 这个技能本身就很轻,意义对我来说也是,只是替代我日常的手工,下面是和knowledge-vault讨论需求时,我说的: ```txt 这个是个轻量的,我不希望有抓取的文章内容之外的,log,json这些。 这些抓取的文章,是我之后要进行讨论的素材;讨论后,就失去了它的意义。 讨论,沉淀观点;沉淀的观点,有可能会进入后续的写作。对我来说,核心是沉淀的观点。 而抓取的文章,讨论后,甚至可以删掉了;这个只是省我一些复制粘贴的工作,而有些网站会防止复制粘贴,我会麻烦一些,F12,看源码来复制粘贴。 ``` --- 需要注意的是: * 知乎分两种,讨论与文章。 * X也做了处理 * 另外是翻译,保留英文和中文 这些在旧的`article-download`中都处理了。 --- 下面给些测试的URL,可供你测试用。 知乎讨论URL:`https://www.zhihu.com/question/1998112125915267964/answer/2052741315209831340` 知乎文章URL:`https://www.zhihu.com/pin/2042210955053065858` x的,`https://x.com/dotey/status/2069632132431929651` 公众号的:`https://mp.weixin.qq.com/s/TApHplXcBONvmVXgDKUUOg` 小红书的可以忽略。 --- 你根据以上判断下,有问题提出,没问题可以去做这个skill了。 已做成 `clip-web-article` Skill,并安装到: `C:\Users\wangq\.agents\skills\clip-web-article` 实现上按你的取舍走:OpenCLI 是硬依赖,旧 `article-download` 的行为只保留为参考取向。新脚本不读 cookie 文件、不要求手工粘贴 cookie,最终输出只保留 `标题.md` 和同级 `img_N.ext` 图片;OpenCLI 产物里的 frontmatter、原文链接、`images/` 子目录会被压平成你要的轻量形态。 主要文件: - [SKILL.md](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/SKILL.md) - [clip_web_article.py](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/scripts/clip_web_article.py) - [test_clip_web_article.py](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/tests/test_clip_web_article.py) - [skills-index.md](C:/Users/wangq/Documents/Codex/skills-vault/registry/skills-index.md) 验证结果: - 源码测试:`5/5 OK` - 源码 `quick_validate.py`:通过 - 安装面 `quick_validate.py`:通过 - 安装目录测试:`5/5 OK` - 真实 URL smoke:已尝试公众号 URL,但 `opencli doctor` 显示 daemon 正常、Browser Bridge 扩展未连接,所以真实抓取被 OpenCLI 连接层阻断,不是脚本或 cookie 问题。 后续你连上 OpenCLI Chrome 扩展后,可直接用: ```powershell conda run --no-capture-output -n skills-vault python -B "C:\Users\wangq\.agents\skills\clip-web-article\scripts\clip_web_article.py" "URL" ``` ::git-create-branch{cwd="C:\Users\wangq\Documents\Codex\skills-vault" branch="codex/clip-web-article"} # 3 我已经装了OpenCLI Chrome 扩展后 你能继续完成测试么? 可以,测试已经完成了。 `opencli.cmd doctor` 现在正常: ```text [OK] Daemon: running on port 19825 [OK] Extension: connected (v1.0.20) Everything looks good! ``` 我用已安装的 `clip-web-article` 跑了你给的 4 个 URL,未手工提供 cookie,全部通过。烟测输出放在 [tmp\clip-smoke](C:/Users/wangq/Documents/Codex/skills-vault/tmp/clip-smoke),没有写入 `knowledge-vault` 默认目录,避免污染正式素材目录。 结果: | 来源 | 结果 | |---|---| | 公众号 | 1 个 Markdown,9 张图 | | 知乎讨论 | 1 个 Markdown,13 张图 | | 知乎 pin/文章 | 1 个 Markdown,10 张图 | | X status/thread | 1 个 Markdown,2 张图 | 输出形态也检查过:每个目录只有 `.md` 和 sibling `img_N.*` 图片,没有 JSON/log/raw/html,没有子目录;公众号正文里的 `---` 是文章内容里引用 Skill 片段,不是 frontmatter。 常规验证也重新跑过: ```text source tests: 5/5 OK source quick_validate: Skill is valid installed tests: 5/5 OK installed quick_validate: Skill is valid ``` 这轮没有再改代码。当前剩下的可提交变更还是这个 Skill 本身、安装说明、registry 和计划文档。 # 4 我看了几个帖子,问题: * `英文的时候,同时保留英文文档,然后翻译出来一份中文`,这个是通用规则,不仅仅是针对X * 我只要原始文章,不要评论 * 对于讨论稿,我只要当前讨论,不要其他人的,比如`为什么感觉一年比一年过得快,是因为年龄增长的原因吗?`还有其他人的回复 * 格式很凌乱,我还得做清理工作。 * 文件夹和文件名字太长 `C:\Users\wangq\Documents\Codex\knowledge-vault\sources\clipped-articles\文章参考`这些都是原`article-download`抓的 已按你反馈的问题改完并重新安装到 `.agents\skills`。 主要改动: - 知乎回答 URL 改用 `opencli zhihu answer-detail`,只抓当前 answer,不再抓同问题下其他回答。 - X 改为只保存目标 status 那一行,不再保存评论/回复。 - 知乎 pin 保留正文图片,但裁掉作者卡片、点赞评论区、编辑/评论 UI。 - 文件夹名压短,文件名 stem 限制到 32 字符。 - 英文规则改成通用规则:任何英文来源都保留英文原文,并由执行 Skill 的 agent 在同目录生成中文译文,不再只针对 X。 改动文件核心在: [clip_web_article.py](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/scripts/clip_web_article.py) [SKILL.md](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/SKILL.md) [test_clip_web_article.py](C:/Users/wangq/Documents/Codex/skills-vault/skills/clip-web-article/tests/test_clip_web_article.py) 最终真实烟测输出在: [C:\Users\wangq\Documents\Codex\skills-vault\tmp\clip-smoke-v4](C:/Users/wangq/Documents/Codex/skills-vault/tmp/clip-smoke-v4) 结果: - 公众号:1 md,9 图 - 知乎讨论:1 md,0 图,只含目标回答 - 知乎 pin:1 md,4 图,无评论/UI - X:1 md,1 图,无回复评论 验证也跑完了: - source tests:6/6 OK - source quick_validate:valid - installed tests:6/6 OK - installed quick_validate:valid - 输出形态检查:无 json/log/html/raw,无子目录;其他回答/X 评论/知乎 UI 命中数都是 0。 # 5 我看了最后冒烟,格式基本ok。原来的遗留问题就一个, X的,我打开URL默认是英文。你的冒烟测试里,只有一个中文md;是因为你打开是中文的,还是bug。 另外,补3个逻辑: 1. 支持批处理,调用方可以一次性传入多个URL 2. 你打开browser 爬完后,应该在本次任务结束后/批任务的话,应该在批完成后,关闭browser 3. 默认路径`C:\Users\wangq\Documents\Codex\knowledge-vault\sources\clipped-articles\文章参考`,但是调用方可以传入新的目标路径 已补完这轮逻辑,并重新安装到 `.agents\skills`。 关于 X 那个语言问题:我核对了 `opencli twitter thread` 的返回,`text` 字段本身就是中文。也就是说这次烟测不是因为我打开了中文页面,而是 OpenCLI adapter 拿到的是原帖原文;如果你浏览器里默认看到英文,大概率是 X/浏览器侧的翻译展示,不是当前抓取结果的来源。 这次新增了三点: - 支持批处理:一次可以传多个 URL。 - 支持自定义目标目录:继续用 `--output-root "目标路径"`,默认仍是 `C:\Users\wangq\Documents\Codex\knowledge-vault\sources\clipped-articles\文章参考`。 - OpenCLI 命令都加了 `--keep-tab false`,释放本次抓取打开的 tab lease;不会关闭你的 Chrome 进程。 批处理示例: ```powershell conda run --no-capture-output -n skills-vault python -B "C:\Users\wangq\.agents\skills\clip-web-article\scripts\clip_web_article.py" "URL1" "URL2" --output-root "D:\target\folder" ``` 验证结果: - source tests:9/9 OK - source quick_validate:valid - installed tests:9/9 OK - installed quick_validate:valid - 真实批处理烟测:知乎 answer + X 一次调用成功 - 批处理输出检查:无 json/log/html/raw,work dir 已清理,知乎其他回答/X 回复命中数都是 0 烟测输出在: [C:\Users\wangq\Documents\Codex\skills-vault\tmp\clip-batch-smoke](C:/Users/wangq/Documents/Codex/skills-vault/tmp/clip-batch-smoke)