232 lines
12 KiB
Markdown
232 lines
12 KiB
Markdown
# 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)
|
||
|