豆瓣图书 Bookmark 自动化
不要再使用 agent-browser。
统一使用本 skill 自带脚本:
这套方案分成两段:
- 1. 用
requests + BeautifulSoup 解析豆瓣搜索页,稳定拿到第一本书的详情页 URL - 用
Playwright launch_persistent_context 复用本地浏览器 profile,打开详情页并点击「想读」
前提
环境依赖:
- - INLINECODE5
- INLINECODE6
- INLINECODE7
- INLINECODE8
- 已安装 Chromium: INLINECODE9
首次登录
首次使用时,先让用户登录一次豆瓣:
CODEBLOCK0
规则:
- - 必须带 INLINECODE10
- 登录完成后,浏览器 profile 会保存在默认目录
- 后续加入「想读」时复用同一个 profile,不要换目录
默认 profile 目录:
CODEBLOCK1
正常使用
CODEBLOCK2
或者:
CODEBLOCK3
脚本会:
- 1. 搜索书名
- 解析第一本书详情页 URL
- 打开详情页
- 点击「想读」
- 输出 JSON 结果
推荐执行策略
已知用户没登录时
先执行:
CODEBLOCK4
等用户登录完成后,再执行:
CODEBLOCK5
已有登录态时
直接执行:
CODEBLOCK6
需要观察浏览器行为时
改成有头模式:
CODEBLOCK7
输出判断
脚本输出 JSON,重点看这些字段:
- -
subject_url: 命中的豆瓣图书详情页 - INLINECODE12 : 是否实际执行了点击
- INLINECODE13 : 是否需要先登录
- INLINECODE14 : 是否大概率成功
如果:
- -
needs_login=true → 先让用户登录 - INLINECODE16 → 页面结构变了,需要修脚本
- INLINECODE17 → 可向用户报告已完成或大概率完成
实现细节
搜索阶段
不要依赖豆瓣图书搜索页前端渲染。
直接请求:
CODEBLOCK8
从 HTML 里解析 .result .title a 或 .result .pic a,提取其中跳转到:
CODEBLOCK9
点击阶段
不要依赖 ref 编号。
豆瓣这里不是“一次点击就完成”的普通按钮,而是两段式交互:
- 1. 先点详情页上的 INLINECODE20
- 再点弹层表单里的 INLINECODE21
如果页面已经处于成功态,常见标志是:
- - 出现 INLINECODE22
- 出现 INLINECODE23
- 出现 INLINECODE24
登录态
必须使用持久化 context:
不要使用临时 browser context,否则豆瓣登录态会丢。
失败处理
如果失败:
- 1. 先看是否 INLINECODE26
- 再用
--headed 重跑一次观察页面 - 若点击控件失效,更新
add_wishlist.py 里的选择器 - 不要假装成功
操作准则
- - 优先使用自带脚本,不要临时拼一堆浏览器命令
- 优先复用默认 profile 目录
- 登录问题优先走 INLINECODE29
- 页面结构变化时,修改脚本,不要回退到 agent-browser
豆瓣图书 Bookmark 自动化
不要再使用 agent-browser。
统一使用本 skill 自带脚本:
- - scripts/addwishlist.py
- scripts/addwishlist.sh
这套方案分成两段:
- 1. 用 requests + BeautifulSoup 解析豆瓣搜索页,稳定拿到第一本书的详情页 URL
- 用 Playwright launchpersistentcontext 复用本地浏览器 profile,打开详情页并点击「想读」
前提
环境依赖:
- - python3
- requests
- beautifulsoup4
- playwright
- 已安装 Chromium:playwright install chromium
首次登录
首次使用时,先让用户登录一次豆瓣:
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py --login --headed
规则:
- - 必须带 --headed
- 登录完成后,浏览器 profile 会保存在默认目录
- 后续加入「想读」时复用同一个 profile,不要换目录
默认 profile 目录:
bash
~/.openclaw/browser-profiles/douban-playwright
正常使用
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py 金钱的艺术
或者:
bash
skills/douban-bookmark/scripts/add_wishlist.sh 金钱的艺术
脚本会:
- 1. 搜索书名
- 解析第一本书详情页 URL
- 打开详情页
- 点击「想读」
- 输出 JSON 结果
推荐执行策略
已知用户没登录时
先执行:
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py --login --headed
等用户登录完成后,再执行:
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py 书名
已有登录态时
直接执行:
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py 书名
需要观察浏览器行为时
改成有头模式:
bash
python3 skills/douban-bookmark/scripts/add_wishlist.py 书名 --headed
输出判断
脚本输出 JSON,重点看这些字段:
- - subjecturl: 命中的豆瓣图书详情页
- clicked: 是否实际执行了点击
- needslogin: 是否需要先登录
- success: 是否大概率成功
如果:
- - needs_login=true → 先让用户登录
- clicked=false → 页面结构变了,需要修脚本
- success=true → 可向用户报告已完成或大概率完成
实现细节
搜索阶段
不要依赖豆瓣图书搜索页前端渲染。
直接请求:
text
https://www.douban.com/search?cat=1001&q=<书名>
从 HTML 里解析 .result .title a 或 .result .pic a,提取其中跳转到:
text
https://book.douban.com/subject//
点击阶段
不要依赖 ref 编号。
豆瓣这里不是“一次点击就完成”的普通按钮,而是两段式交互:
- 1. 先点详情页上的 input[type=submit][value=想读]
- 再点弹层表单里的 input[type=submit][value=保存]
如果页面已经处于成功态,常见标志是:
登录态
必须使用持久化 context:
- - launchpersistentcontext(userdatadir=...)
不要使用临时 browser context,否则豆瓣登录态会丢。
失败处理
如果失败:
- 1. 先看是否 needslogin=true
- 再用 --headed 重跑一次观察页面
- 若点击控件失效,更新 addwishlist.py 里的选择器
- 不要假装成功
操作准则
- - 优先使用自带脚本,不要临时拼一堆浏览器命令
- 优先复用默认 profile 目录
- 登录问题优先走 --login --headed
- 页面结构变化时,修改脚本,不要回退到 agent-browser