12 KiB
1
这个是新的技能需求,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、平台子目录、部分脚本会删除已有输出目录,并且把作者/日期/分隔线等塞进正文,和这次需求相反。
主要问题有几个:
-
OpenCLI 可作为底座,但不能直接等于成品。 它当前文档确实覆盖知乎、微信公众号、小红书、Twitter/X 等下载能力,也要求 Node >= 20 和 Browser Bridge;本机 Node 是
v24.14.1,但还没有opencli命令。它的输出通常会带 frontmatter、images 子目录或平台语义,需要 wrapper 再清洗。参考:OpenCLI docs。 -
cookie 不应该再进入默认路径。 正确边界是:公开页能抓就直接抓;需要登录时,让用户在连接的 Chrome/Edge 里打开页面,Skill 只读可见 DOM/页面内容,不读、不保存 cookie/localStorage/token。OpenCLI 的 Browser Bridge 思路比“粘贴 cookie”更接近这个方向。
-
小红书和 X 要降级预期。 小红书很多价值在图片里,OCR 不应默认做;X 的 thread/article/media 抽取很容易混入回复、引用、时间线内容。初版应接受“正文 + 可见图”而不是完整平台归档。
-
脚本部分应只做确定性工作。 我建议内置脚本负责:标题清洗、非覆盖目录创建、Markdown 清洗、图片下载/重命名、相对链接重写、失败图片保留可读内容。平台登录和可见页面获取交给 OpenCLI 或浏览器自动化,不在脚本里实现绕风控。
-
依赖要补。 当前
skills-vaultconda 环境没有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讨论需求时,我说的:
这个是个轻量的,我不希望有抓取的文章内容之外的,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/ 子目录会被压平成你要的轻量形态。
主要文件:
验证结果:
- 源码测试:
5/5 OK - 源码
quick_validate.py:通过 - 安装面
quick_validate.py:通过 - 安装目录测试:
5/5 OK - 真实 URL smoke:已尝试公众号 URL,但
opencli doctor显示 daemon 正常、Browser Bridge 扩展未连接,所以真实抓取被 OpenCLI 连接层阻断,不是脚本或 cookie 问题。
后续你连上 OpenCLI Chrome 扩展后,可直接用:
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 现在正常:
[OK] Daemon: running on port 19825
[OK] Extension: connected (v1.0.20)
Everything looks good!
我用已安装的 clip-web-article 跑了你给的 4 个 URL,未手工提供 cookie,全部通过。烟测输出放在 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。
常规验证也重新跑过:
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 SKILL.md test_clip_web_article.py
最终真实烟测输出在: 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个逻辑:
- 支持批处理,调用方可以一次性传入多个URL
- 你打开browser 爬完后,应该在本次任务结束后/批任务的话,应该在批完成后,关闭browser
- 默认路径
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 进程。
批处理示例:
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