knowledge-vault/discussions/technology/Codex/4.Skills/article-clipper.md

232 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
这个是个轻量的我不希望有抓取的文章内容之外的logjson这些。
这些抓取的文章,是我之后要进行讨论的素材;讨论后,就失去了它的意义。
讨论,沉淀观点;沉淀的观点,有可能会进入后续的写作。对我来说,核心是沉淀的观点。
而抓取的文章讨论后甚至可以删掉了这个只是省我一些复制粘贴的工作而有些网站会防止复制粘贴我会麻烦一些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 个 Markdown9 张图 |
| 知乎讨论 | 1 个 Markdown13 张图 |
| 知乎 pin/文章 | 1 个 Markdown10 张图 |
| X status/thread | 1 个 Markdown2 张图 |
输出形态也检查过:每个目录只有 `.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 md9 图
- 知乎讨论1 md0 图,只含目标回答
- 知乎 pin1 md4 图,无评论/UI
- X1 md1 图,无回复评论
验证也跑完了:
- source tests6/6 OK
- source quick_validatevalid
- installed tests6/6 OK
- installed quick_validatevalid
- 输出形态检查:无 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 tests9/9 OK
- source quick_validatevalid
- installed tests9/9 OK
- installed quick_validatevalid
- 真实批处理烟测:知乎 answer + X 一次调用成功
- 批处理输出检查:无 json/log/html/rawwork 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)