nexus-reader - 微信读书飙升榜每日推荐
生成精美的每日读书推荐卡片,数据来源于微信读书飙升榜。
核心工作流程(四步)
Step 1:抓取榜单数据
python scripts/reader.py --fetch-only
脚本会自动:
- 抓取微信读书飙升榜(20本书)
- 保存原始数据到
data/weread_rising_YYYY-MM-DD.json - 输出榜单摘要(书名、作者、推荐值)
输出示例:
[抓取] 正在获取微信读书飙升榜...
[解析] 找到 20 个书籍项
[保存] 数据已缓存: data/weread_rising_2026-05-04.json
==================================================
飙升榜 TOP 20
==================================================
1. 《阿勒泰的角落》- 李娟 (推荐值: 88.4%)
2. ...
缓存机制:当天JSON文件 < 1小时自动跳过重新抓取,
--force强制刷新
Step 2:模型选书 + 创作内容
读取 data/weread_rising_YYYY-MM-DD.json,从TOP10中选一本书,然后自己创作以下内容(不要直接复制书籍简介):
| 字段 | 说明 | 字数建议 |
|---|---|---|
title | 金句标题,根据书籍主题提炼一句有深度、有力量的话 | 8-15字 |
yi | 宜××,结合书籍主题创作 | 4-6字 |
ji | 忌××,结合书籍主题创作 | 4-6字 |
book_desc | 推荐语,用温暖、有感染力的语言为这本书写一段推荐 | 50-100字 |
示例(推荐《百年孤独》):
{
"title": "每个人都在守护自己的孤独",
"yi": "静心阅读",
"ji": "浮躁焦虑",
"book_desc": "马尔克斯用一座虚构的小镇,写尽了人类共有的孤独与执念。每一次重读,都会在某个角色身上看见自己。适合在一个安静的下午,泡一杯咖啡,慢慢走进马孔多。"
}
重要:
book_desc是 LLM 的创作内容,不是书籍简介的截取!
Step 3:生成 card JSON 文件
将以下内容保存为 data/nexus-reader-YYYYMMDD.json:
{
"date": "2026/05/04",
"day": "04",
"weekday": "星期日",
"lunar_date": "农历 四月十八",
"yi": "静心品读",
"ji": "焦虑内耗",
"title": "有一分热就去发光",
"book_title": "阿勒泰的角落",
"book_author": "李娟",
"book_desc": "...(LLM创作的推荐语)",
"cover_url": "https://weread-1258476245.cos.ap-nanjing.myqcloud.com/...",
"book_url": "https://weread.qq.com/web/reader/...",
"rating": "88.4%",
"reading_count": "1486"
}
提示:
cover_url、book_url、rating、reading_count、book_title、book_author从weread_rising_YYYY-MM-DD.json中对应的书籍项获取。其余字段由 LLM 创作或计算。
Step 4:渲染卡片
# 只生成 HTML
python scripts/reader.py --card data/nexus-reader-2026-05-04.json
# 生成 HTML + PNG 图片
python scripts/reader.py --card data/nexus-reader-2026-05-04.json --png
输出:
data/nexus-reader-YYYYMMDD.html— 精美推荐卡片data/nexus-reader-YYYYMMDD.png— PNG 图片(需加--png)
然后用 preview_url 打开 HTML 卡片展示给用户。
命令行参数速查
| 命令 | 说明 |
|---|---|
--fetch-only | 阶段1:只抓取数据 |
--card JSON_PATH | 阶段2:渲染指定 JSON 的卡片 |
--png | 额外生成 PNG(需配合 --card) |
--output DIR | 指定输出目录 |
--force | 强制重新抓取 |
--cache-hours N | 缓存有效时间(小时,默认1) |
--fetch-only和--card互斥,必须指定其中一个
数据结构
原始榜单 JSON(weread_rising_YYYY-MM-DD.json)
从微信读书抓取的原始数据,包含20本书:
[
{
"index": "1",
"title": "阿勒泰的角落",
"author": "李娟",
"desc": "书籍简介...",
"cover_url": "https://...",
"book_url": "https://weread.qq.com/...",
"reading_count": "1486",
"rating": "88.4%",
"date": "2026-05-04"
}
]
卡片 JSON(nexus-reader-YYYYMMDD.json)
由 LLM 创作内容后生成的完整卡片数据,用于渲染:
{
"date": "2026/05/04",
"day": "04",
"weekday": "星期日",
"lunar_date": "农历 四月十八",
"yi": "静心品读",
"ji": "焦虑内耗",
"title": "有一分热就去发光",
"book_title": "阿勒泰的角落",
"book_author": "李娟",
"book_desc": "李娟用质朴的笔触...",
"cover_url": "https://...",
"book_url": "https://...",
"rating": "88.4%",
"reading_count": "1486"
}
卡片设计说明
卡片采用暖色调书卷风格:
- 背景:
#fdfcfa(米白色)+ 淡雅渐变 - 主色:
#9d7a58(古铜色)用于日期 - 字体:
Noto Serif SC(宋体风格衬线字体) - 结构:日期 → 宜忌 → 金句标题+推荐语+书名 → 分隔线 → 封面+详情+阅读按钮
农历日期计算
lunar_date 字段由 LLM 根据当天日期计算,格式为 农历 X月XX日。
示例中 LUNAR_MONTHS 为简化版本,实际农历需要专用库(lunarcalendar)或 LLM 直接计算。推荐让 LLM 直接计算,避免额外依赖。
注意事项
- 微信读书页面不需要登录即可查看飙升榜
- 封面图片来自 CDN,可能在某些网络环境下无法加载
--png需要安装html2image:pip install html2image- 推荐值和阅读人数是实时数据,每天不同
- 如果抓取失败,脚本会尝试使用旧缓存降级
定时推送场景
当用户要求每日定时推送读书推荐时,创建 automation(recurring):
- prompt 内容:运行
reader.py --fetch-only→ LLM 创作内容 → 生成 card JSON → 运行reader.py --card[--png] → 推送 - schedule 为每日固定时间(如
RRULE:FREQ=DAILY;BYHOUR=8;BYMINUTE=0)