把当前用户的微信读书数据渲染成一个 264px 宽的暗色小卡片(Material 3 配色),放在桌面上。
数据由一个本地小后台 server.py(127.0.0.1:47900)提供:它一边按 http 把卡片发给浏览器,一边每 30 分钟自动重抓一次微信读书数据,并接收卡片上手动改目标的请求写回 config.json。所以目标改了重启不丢、数据不用手动 update。
WEREAD_API_KEY 是否已设置:~/.claw/settings.json(Claude Code 用户为 ~/.claude/settings.json)的 env 字段wrk-xxxxxxxx,绑定用户身份(vid)https://cdn.weread.qq.com/skills/weread-skills.zip,解压后看 SKILL.md 的"鉴权"章节~/.claw/settings.json 的 env 字段(不要写进 shell rc,避免泄露到其它进程),格式:```json
{ "env": { "WEREAD_API_KEY": "wrk-xxxxxxxx" } }
```
python3 是否可用(which python3)。macOS 自带;如缺失提示装 Xcode Command Line Tools。~/Desktop/reading-widget/ 目录update.py → 抓数据+渲染template.html → 模板server.py → 本地小后台(发卡片 + 存目标 + 自动刷新)open-widget.sh → 一键打开脚本config.default.json → 重命名为 config.jsoncom.user.reading-widget.plist → launchd 模板(Step 4 用,先别动)WEREAD_API_KEY=xxx python3 ~/Desktop/reading-widget/update.py 生成首版 widget.html跑打开脚本,它会先确保本地小后台 server.py 起着(没起就拉起来),再用 Chrome --app 模式打开一个无边框小窗,指向 http://127.0.0.1:47900/widget.html:
bash ~/Desktop/reading-widget/open-widget.sh
走 http://127.0.0.1 而不是 file://,是为了让卡片上手动改目标能 POST 回 server.py 存进 config.json(file:// 下同源请求会被拦,目标改了重启就丢)。没装 Chrome 时脚本退化到默认浏览器;后台拉不起来时退化到 file://(此时改目标不持久)。
Step 3 是「打开时才拉起后台」。如果想让数据一直在后台每 30 分钟刷新(不用每次手动开卡片),把 server.py 设成开机自启。
> ⚠️ 这是给用户电脑加一个常驻 LaunchAgent,属于持久化系统改动。装之前必须明确问一句用户同不同意,不要默默 load。
com.user.reading-widget.plist 复制到 ~/Library/LaunchAgents/,并把里面的 USERNAME 换成真实用户名、/usr/bin/python3 换成 which python3 实际路径。launchctl load ~/Library/LaunchAgents/com.user.reading-widget.plist注意 plist 里不放 WEREAD_API_KEY——server.py → update.py 会自己从 ~/.claw/settings.json 的 env 读 key,别把 key 落进 plist。日志在 ~/Desktop/reading-widget/helper.log。
server.py 的 POST /set-goal 写回 config.json(重启不丢);也可以手动编辑 config.json 的 goal_hours。server.py 顶部的 REFRESH_INTERVAL(秒,默认 1800)。config.json 的 refresh_seconds(HTML meta refresh,默认 300)。template.html 的 CSS(Material 3 暗色 token 在 :root),重跑 update.py 生效。update.py 顶部的 QUOTE_BLOCKLIST,命中的热门划线会跳过换下一条。| 模块 | 数据源 |
|---|---|
| ------ | -------- |
| 连续阅读天数 | /readdata/detail weekly 桶往前翻,阈值 60 秒/天 |
| 今日分钟 + 日均(点开 → 本周时长 + 本周日均) | weekly 桶今天的值;本周合计 ÷ 已过天数 |
| 本月小时 + 上月对比(点开 → 今年累计 + 今年日均) | /readdata/detail monthly / annually |
| 本月目标进度 | config.json.goal_hours,卡片上可点数字直接改 |
| 正在读 + 进度% | /shelf/sync 找最近未读完的书,/book/getprogress 拿 progress |
| 今年读完本数 / 笔记数 | /readdata/detail annually 的 readStat |
| 金句 | /book/bestbookmarks 拿当前在读书的热门划线,按日期轮换,过 QUOTE_BLOCKLIST 脏词过滤 |
两个 stat 卡片可点击翻面看对比(今日↔本周、本月↔今年),靠 CSS .flipped class 切换,无需 JS 文件。
server.py / 没用 http://)launchctl unload ~/Library/LaunchAgents/com.user.reading-widget.plist 并删该 plist;删 ~/Desktop/reading-widget/;从 settings.json 拿掉 key共 2 个版本