公众号文章剪藏(WeChat Article Clipper)
功能
通过 Obsidian Web Clipper 浏览器扩展,将微信公众号文章剪藏到 Obsidian vault。用户只需提供文章链接,脚本自动完成:页面加载 → 进入阅读模式 → 触发剪藏 → 关闭标签页。
为什么不用爬虫
直接爬取微信公众号文章存在问题:
- 微信公众号反爬机制强,频繁触发"环境异常"验证
- 爬虫只能拿到纯文本,丢失图片、排版等格式信息
- 元数据(标题、作者、描述)需要额外提取逻辑,容易出错
本方案改用 Obsidian Web Clipper 浏览器扩展:
- 扩展运行在浏览器内部,不受反爬限制
- 保留文章原始格式(图片、排版、代码块等)
- 元数据由扩展模板自动生成,格式统一可靠
- 脚本只负责"打开页面 + 触发扩展 + 点击按钮",逻辑极简
触发条件
- 用户说「收录」+ 文章链接 → 自动启动收录
- 用户单独说「收录」→ 主动询问文章链接
依赖条件
| 依赖 | 说明 |
|---|---|
| Chrome 浏览器 | Google Chrome,用于运行浏览器扩展 |
| Chrome 调试端口 9222 | 脚本通过 CDP 协议连接 Chrome |
| Chrome profile | 专用 profile:~/.config/chrome-obsidian_web_clipper-profile |
| xdotool | Linux X11 按键模拟工具,用于向 Chrome 发送快捷键 |
| Obsidian Web Clipper 扩展 | v1.7.0+,负责内容提取和剪藏 |
| Playwright(Python) | 通过 CDP 连接 Chrome:pip install playwright |
| DISPLAY | 需要 X11 显示环境(headful 模式),xdotool 才能发送按键 |
初次使用检查
每次收录前检查 Obsidian Web Clipper 扩展是否已安装。通过 Chrome Preferences 检查扩展 ID cglkecpjdocecmkknmolikihbocdpbcd 是否已注册:
python3 -c "
import json, os
pref = os.path.expanduser('~/.config/chrome-obsidian_web_clipper-profile/Default/Preferences')
d = json.load(open(pref)) if os.path.exists(pref) else {}
ext = d.get('extensions', {}).get('settings', {}).get('cglkecpjdocecmkknmolikihbocdpbcd', {})
path = ext.get('path', '')
print('OK' if path and os.path.isdir(path) else 'MISSING')
"
- 输出
OK→ 扩展已安装,直接进入收录流程 - 输出
MISSING→ 首次使用,按 README.md 的「初次使用说明」完成初始化
收录流程
1. 运行脚本
echo "<文章链接>" | python3 scripts/headful_playwright_scraper.py
脚本自动完成:
- 连接已运行的 Chrome 调试端口(9222),若未运行则自动启动
- 新建标签页访问文章链接,等待页面加载
- 激活 Chrome 窗口,发送 Ctrl+Shift+R 进入 Obsidian 阅读模式
- 点击"添加到 Obsidian"按钮完成剪藏
- 自动关闭标签页
2. 脚本运行失败时
若脚本报错(如点击按钮失败、扩展未响应),检查:
1. 快捷键是否配置为 Ctrl+Shift+R
2. 剪藏路径是否配置为 Obsidian vault 中的目标目录
3. 反馈
收录完成后,告知用户「收录成功」并展示文章链接。
注意事项
- 若微信文章触发环境验证,需要用户先在 Chrome 中手动完成验证后再重新运行脚本
- Obsidian Web Clipper 扩展的模板配置决定剪藏文件的元数据格式和保存路径
- 非 Linux 环境(Windows/macOS)需将 xdotool 替换为 pyautogui