weread-export — 微信读书整本导出(Markdown / EPUB / PDF)
当用户说“把这本微信读书给我导出来”或近似表达时,将单本微信读书导出为 Markdown、EPUB、PDF,并生成核验报告。
When to Use
适用:
- 典型说法包括「把这本微信读书给我导出来」「帮我导出这本微信读书」「把这个微信读书链接导成 PDF / EPUB / Markdown」「微信读书导出」;
- 不要求用户说出技能名
weread-export,也不要求语句与上述示例完全一致; - 用户给出微信读书链接、
weread.qq.com链接或 book_id,并表达导出、保存或转成电子书的意图; - 需要复跑核验:对照平台逐章字数复核已有产物;
- 需要三格式交付:Markdown(图片内嵌)/ EPUB / PDF + 核验报告;
- 导出中断后续跑、图片缺失补齐(同一条命令重跑即可)。
不适用:
- 书架 / 书单批量导出 —— 本技能不提供,一次只导一本(见 Rules);
- 绕过验证码 / 会员 / 付费墙的内容 —— 不做。
前置条件
- 依赖:Python 3.10+、playwright、chromium、pandoc —— 安装命令见
README.md「5 分钟上手」。 - Windows 命令:优先在 PowerShell 使用
py -3;下文所有python3均替换为py -3,路径含空格或中文时必须加引号。 - 登录:首次运行会弹出浏览器要求扫码;登录态持久化在
~/.weread-export/profile/(不随项目走)。 - 脚本路径:
<skill>/scripts/(本项目中即.thincoder/skills/weread-export/scripts),下文的命令按该路径给出。 - 脚本路径解析:项目级优先(
<当前项目目录>/.thincoder/skills/weread-export/scripts/);若技能只装在 用户级~/.thincoder/skills/weread-export/scripts/,把命令里的路径替换为实际位置即可(两处脚本一致)。 - 状态目录:工作数据在
~/.weread-export/(环境变量WEREAD_EXPORT_HOME可覆盖);交付物在<当前项目目录>/<书名>/。 - 状态目录清理:macOS/Linux 的
rm -rf ~/.weread-export或 Windows PowerShell 的Remove-Item -Recurse -Force "$HOME\.weread-export"会连登录态一起清掉(下次运行需重新扫码)。
包结构(速览)
| 路径 | 内容 |
|---|---|
SKILL.md |
本文件:agent 入口(适用条件 / 停询触发点 / 合规 / 流程) |
README.md |
给人看的上手说明与故障对照表 |
references/playbook.md |
症状 → 判据 → 修法速查表(30 条实测坑) |
scripts/preflight.py |
预检:登录 / 可读性 / 端到端冒烟 / 平台逐章基线 |
scripts/export_precise.py |
导出引擎入口(含 --postprocess 离线后处理) |
scripts/download_images.py |
普通图片与 TAR 图片包下载 / 补齐(可重复运行) |
scripts/verify_export.py |
低 Token 核验并产出报告(含 --report-out、--verbose) |
scripts/make_formats.py |
三格式转换(md 内嵌 / epub / pdf) |
scripts/weread_*.py |
引擎模块(共享 / 切章 / 文本 / 抓取 / 导航 / 会话 / 后处理) |
scripts/tests/ |
回归测试(54 项,含包级检查) |
停询触发点(五条)
命中任一条:先停下、给建议;用户明确坚持时,按各条的「用户坚持时」执行。
触发点① 一次任务导 ≥2 本
- 条件:一次任务里要导 ≥2 本。
- 检测点:步骤 0(用户诉求)。
- 停询文案:「【停询】一次先导 1 本——同时导出多本会明显提高账号风控风险。我先做《X》,完成后再接下一本;确认连续导出请回复『确认连续导出』。」
- 用户坚持时:逐本串行继续,每本之间仍受本表第 4 条约束。
触发点② 想加速(低于默认间隔)
- 条件:用户想加速(要求低于默认的每页 1–2 秒)。
- 检测点:任一步(用户提出)。
- 停询文案:「【停询】默认节流(每页 1–2 秒)是防封底线,不建议加速。确认要加速请回复『确认加速』,我按你要求调低等待间隔(风险由你承担)。」
- 用户坚持时:设
WEREAD_SLEEP_SCALE<1并保留醒目警告横幅;默认值不得偏离 1.0。
触发点③ 想并发多会话
- 条件:用户想同账号并发 / 多会话导出。
- 检测点:任一步(用户提出)。
- 停询文案:「【停询】同账号并发 / 多会话是高风险特征,本技能不提供并发编排;建议单会话串行。若你坚持自行并发,请在知情风险下进行。」
- 用户坚持时:不提供并发入口;用户可自行另开终端(各自后果自负)。
触发点④ 单日累计 ≥3 本
- 条件:今天的导出本数已达 3 本(本次将成为第 4 本)。
- 检测点:步骤 0(读
~/.weread-export/runs.log数今日start行)。 - 停询文案:「【停询】今天已导出 N 本(见 ~/.weread-export/runs.log)。再导这本是今日第 N+1 本,接近风控红线,建议改天。继续请回复『确认继续』。」
- 用户坚持时:用户确认后继续(日志照记,供未来核对)。
触发点⑤ 异常信号(登录失效 / 验证码 / 访问受限 / 页面结构变化)
- 条件:各脚本输出
⛔标记行,或退出码为 2 / 3 / 4。 - 检测点:各步骤命令的退出码与标记行。
- 停询文案:「【停询】检测到异常信号:<具体信号>。已停止。建议:登录失效→扫码重登;验证码/受限→暂停一段时间,勿反复重试;结构变化→保留现场,等修复后重试。」
- 用户坚持时:登录类重登即可继续;受限 / 结构类不强行推进。
合规边界
- 仅导出账号已获阅读权限的书(无限卡 / 已购买);没有权限的书不做。
- 导出物仅个人使用:不传播、不上传、不分享给不特定人群。
- 不绕过验证码 / 会员 / 付费墙;受限信号出现时停下询问,不静默重试绕过。
- 导出物不搬离本机:本技能不提供上传 / 分享 / 外发功能。
Workflow
按顺序执行;每一步都有通过判据,未过判据不进入下一步。
步骤 0 开工前检查(agent 执行,不涉脚本)
- 书目数:这次要导几本?≥2 本 → 见「停询触发点(五条)」表第 1 条。
- 今日计数:读
~/.weread-export/runs.log,数今天的start行;≥3 本 → 见同表第 4 条。 - 依赖探测:macOS/Linux 检查
python3,Windows 检查py -3;同时检查 playwright / chromium / pandoc。缺 → 给出 README 对应系统的安装命令并停。
步骤 1 预检
python3 .thincoder/skills/weread-export/scripts/preflight.py "<链接或 book_id>"
通过判据:退出码 0 + 末尾 ✅ 预检通过;输出含「抓到首页字符」且数值 > 0;
~/.weread-export/books/<book_id>/_platform_chapterinfo.json 已生成。记下 book_id 与书名。
首次运行需要在弹出的浏览器窗口里扫码登录(等待扫码 = 正常流程,不是失败);登录态此后长期复用。
若用户要求重新登录,或旧登录态损坏,运行:
python3 .thincoder/skills/weread-export/scripts/preflight.py "<链接或 book_id>" --relogin
--relogin 会把旧 profile 改名备份,不删除书籍进度;Windows 将 python3 换成 py -3。
任一 ⛔ 标记 → 走下方「失败升级路径」。
步骤 2 导出
python3 .thincoder/skills/weread-export/scripts/export_precise.py "<链接或 book_id>"
长跑(实测量级 10–15 分钟;随书的长短线性变化);中断后重跑同一条命令自动续传(从已完成章节续起)。 图片缺失 → 补齐:
python3 .thincoder/skills/weread-export/scripts/download_images.py <book_id>
通过判据:退出码 0;退出码 4(未达书末)→ 见失败升级路径。
导出期间不要手动关闭浏览器窗口(关闭 = 会话中断;重跑同命令会从已完成章节续起,不重抓)。 浏览器由脚本自动开关;中途遇到验证码 / 受限提示,脚本会停下并按上表给出信号。
不重爬、只重跑后处理(如调整后处理规则后重建合并稿):
python3 .thincoder/skills/weread-export/scripts/export_precise.py --postprocess <book_id>
步骤 3 核验
python3 .thincoder/skills/weread-export/scripts/verify_export.py <book_id> \
--report-out "<当前项目目录>/<书名>/核验报告.txt"
通过判据:退出码 0 且报告含 核验结论: ✅ 达标。
未达标(退出码 5)→ 停下如实报告,不自动重跑,交用户裁决。
报告同时默认写一份到状态目录(books/<book_id>/_verify_report.txt);--report-out 是交付副本。
默认终端只打印结论和计数,逐章明细留在报告文件中;只有排错确有需要时才加 --verbose。
图片只在本机读取文件头和大小,不上传图片、不做 OCR,也不要把图片/base64 或整份漫画载入 Agent 上下文。
步骤 4 转格式
python3 .thincoder/skills/weread-export/scripts/make_formats.py \
~/.weread-export/books/<book_id>/<书名>.md "<当前项目目录>/<书名>/"
通过判据:输出 ✅ 构建断言通过(内嵌 md 无外部引用 / EPUB 内嵌图数 == 引用图数 / 打印 HTML 无外部资源)。
三件套(<书名>.md / <书名>.epub / <书名>.pdf)直接落在交付目录;配合步骤 3 的报告副本即四件齐全。
步骤 5 交付核对
- 四件套齐全:
<书名>.md/<书名>.epub/<书名>.pdf/核验报告.txt。 - 向用户报路径 + 合规提醒(仅个人使用,不传播不上传)。
失败升级路径
退出码与标记行一一对应(契约见下表)——按表处置,不自行猜测:
| 信号 | 退出码 | 动作 |
|---|---|---|
⛔ 登录失效 |
2 | 提示用户扫码重登后重跑当前步骤(等待扫码 = 正常流程,非失败) |
⛔ 访问受限 |
3 | 停下 + 说明 + 建议暂停一段时间,勿反复重试(见停询表第 5 条) |
⛔ 页面结构可能变化 |
4 | 停下 + 报告证据与根因初判 + 等修复(见停询表第 5 条) |
⛔ 未检测到书末 |
4 | 停下 + 报告不完整章节 + 用户裁决 |
⛔ 核验未达标 |
5 | 停下 + 列出不达标字段 + 用户裁决 |
| 输入缺失 | 6 | 回查前置步骤(预检 / 导出)是否已跑、产物是否在状态目录 |
| 构建失败 | 7 | 按错误行处理(如缺 pandoc → 给安装命令)并重跑本步 |
Rules
- 不提供书架批量(含书单)导出;用户要求时明确说明不支持(一次一本)。
- 不并发多会话、不自动重试受限类失败;不改默认节流(加速必须走停询表第 2 条流程)。
- 导出物仅个人使用:不传播、不上传、不分享。
- 不修改上游参考项目目录本体;包内副本才是交付物。
- 受限 / 结构类失败不静默绕过,不强行推进。
References
README.md—— 人类上手:5 分钟上手 / 手动路径 / 常见故障对照表。references/playbook.md—— 症状 → 判据 → 修法速查表(本轮全部坑的落点)。