DeepSeek → 番茄「已发布章节」批量替换
把 DeepSeek 官网某个聊天会话里产出的整本书(N 章正文),替换到番茄小说作家后台已发布章节的正文与标题,按平台每日提交字数上限分批跑完。
> 只替换,不新建。发布新章走的是另一套页面流程,本 skill 不适用。
第一次使用:三步走
Step 1|装环境 + 登录 + 生成配置(一次性,约 10 分钟)
python scripts/setup_wizard.py
它会依次做三件事,全程有提示:
- 体检 —— Python 版本 / playwright 库 / Chromium 是否真的能启动
- 登录引导 —— 打开一个专用浏览器窗口,你在里面登录番茄作家后台 + DeepSeek 官网,回车后自动校验登录态
- 生成 book.json —— 问你 4 个值(书籍 ID、书名、DeepSeek 链接、总章数),自动截 UUID、自动建目录
只想检查环境、不打开浏览器:
python scripts/setup_wizard.py --check
Step 2|先跑 1 章,亲眼确认成功
python scripts/ds_fetch_history.py --config book.json
python scripts/ds_parse_chapters.py --config book.json
python scripts/clean_chapters.py --config book.json
python scripts/rewrite_chapters.py --config book.json --only 1
第 4 条必须打印出 => ok ... code=0 ai=True 才算通。看到 unverified 或 fail 就停下排查,别继续跑批(详见 references/tuning-guide.md 故障速查)。
Step 3|交给每日批次
python scripts/daily_run.py --config book.json
配成每天 06:00 的定时任务即可跑完剩下的章(07:00 前进入审核队列最稳)。撞到平台上限会自动停批,次日续跑。
更详细的图文步骤(含常见首次报错)见 references/quickstart.md。
何时使用 / 不适用
| 场景 | 是否适用 |
|---|---|
| 有 DeepSeek 聊天链接,要把其中书稿替换到番茄某本书的已发布章节 | ✅ |
已跑过一本书,换一本新书(改 book.json 即可) |
✅ |
| 续跑/调整每日批次、导出全书 txt | ✅ |
| 只想要 DeepSeek 里的稿子,不碰番茄 | ✅ 跑阶段 1-3 + 阶段 6 |
| 要在番茄发布新章 | ❌ 页面流程不同 |
| 没有 DeepSeek 登录态 / 没有番茄作家账号 | ❌ 先解决账号问题 |
环境要求
- Python ≥ 3.9
pip install playwright+playwright install chromium- 两个站点的登录态都保存到本机
browser_profile目录(番茄约 30 天有效,过期重登)
> 多 Python 环境的机器请用同一个解释器装包和跑脚本。setup_wizard.py --check 会直接打印当前解释器的绝对路径,装不上时照它给的命令执行。
配置(book.json)
复制 assets/book.template.json 改字段,或让 setup_wizard.py 生成。
| 字段 | 必填 | 说明 |
|---|---|---|
book_id |
✅ | 番茄书籍 ID:章节管理 URL /chapter-manage/<这串数字> |
book_title |
✅ | 书名,须与后台完全一致(含标点) |
chat_session_id |
✅(读稿阶段) | DeepSeek 聊天链接 /a/chat/s/ 后的 UUID,也接受整条链接 |
total_chapters |
✅ | 总章数,正整数(缺章检测依据) |
slug |
换书必改 | 工作目录名,不同书请用不同 slug |
use_ai |
否 | 发布设置是否勾「使用AI」,默认 true |
detect_mode |
否 | 内容检测方式,默认 basic(仅基础检测) |
batch_size |
否 | 每日批章数,默认 10(换算见 tuning-guide) |
min_chapter_chars |
否 | 正文字数下限,默认 800,防把大纲当正文 |
paths.work_dir |
否 | 稿件/进度目录,留空 = ~/.fanqie-rewriter/{slug} |
paths.browser_profile |
否 | 登录态目录,留空 = ~/.fanqie-rewriter/profile |
paths.chromium |
否 | 自定义浏览器路径;留空 = 用 Playwright 自带 Chromium |
--config 省略时会依次找 ./book.json 和 skill 根目录的 book.json。
六阶段流水线
# ① 拉 DeepSeek 全历史(token 在 localStorage,不依赖 Cookie)
python scripts/ds_fetch_history.py --config book.json [--cached]
# ② 解析成 N 章(只取 RESPONSE fragment,剔除 THINK / 下章预告)
python scripts/ds_parse_chapters.py --config book.json
# ③ 清洗 Markdown + 重复标题消歧(重名会被平台 -3011 拒)
python scripts/clean_chapters.py --config book.json [--rename "77=新标题,92=新标题"]
# ④ 试跑 1 章!必须看到 => ok ... code=0 ai=True 再继续
python scripts/rewrite_chapters.py --config book.json --only 1
# ⑤ 每日批次(定时任务每天 06:00 调它;--resume 断点续跑)
python scripts/daily_run.py --config book.json [--batch N]
# ⑥ 可选:导出全书 txt 供导入作家助手
python scripts/export_book_txt.py --config book.json --out 路径.txt
| 阶段 | 脚本 | 产出 | 人工核对点 |
|---|---|---|---|
| 1 读稿 | ds_fetch_history.py | <work_dir>/ds_history_raw.json |
消息条数正常、无 code=40002 |
| 2 分章 | ds_parse_chapters.py | chapters/ch_NNN.md + index |
[GOT] N/total 齐全;标题是正文标题不是策划文本 |
| 3 清洗 | clean_chapters.py | 原地更新 chapters/ | 输出里不再提示「标题仍然重复」 |
| 4 替换 | rewrite_chapters.py | progress.json / rewrite.log | 试跑 1 章看 code=0 ai=True,再去后台网页人工看一眼 |
| 5 批次 | daily_run.py | daily.log | 整批无进展会自动收工等次日 |
| 6 导出 | export_book_txt.py | 全书 txt | 标题行数 == 总章数且章号连续 |
核心铁律(都是踩坑换来的,细节在 references)
- 真值校验:只有收到
publish_article响应且code==0才算成功;没响应记unverified。页面「看起来成功」不算数——本流程最初连续 10 章假报 ok。 - 每日上限:实测约 6000-7000 字/天,超出返回
code=-1019。跑到 -1019 立即停批,剩余章节次日--resume续跑。 - 审核窗口:7:00-24:00。23:00 后提交会卡「审核中」无法修改,定时任务设 06:00。
- 编辑器:ProseMirror 必须
execCommand('insertText')分块写入;替换先清空;写完校验页面字数 ≥1000。 - 真实鼠标事件:「确认发布」按钮在
.arco-modal-footer,el.click()/ Enter 不触发 React onClick。 - 弹窗:「有刚刚更新的章节,是否继续编辑?」会遮挡编辑器导致点击超时,先清弹窗再等编辑器就绪。
- AI 单选:
.arco-modal-content label.arco-radio,以 label 文本「是/否」为准,点完必须回读 checked。
遇到问题看哪份
| 文件 | 内容 |
|---|---|
references/quickstart.md |
首次使用完整引导:从装环境到跑通,含第一次常见报错 |
references/tuning-guide.md |
换书微调指南:字段清单、每阶段核对点、批次换算、定时任务 prompt、故障速查、回滚安全 |
references/fanqie-rewrite-playbook.md |
番茄编辑页实测手册:item_id 定位、选择器、弹窗、真值校验、平台拒绝码表 |
references/deepseek-api-notes.md |
DeepSeek 接口笔记:localStorage token 鉴权、history_messages 端点、fragment 结构、切分/截断规则 |
状态文件(断点续跑)
<work_dir>/
├── progress.json # {"done":[...], "failed":{...}, "last_chapter":N} —— 只许脚本写
├── rewrite.log / daily.log
└── chapters/ # ch_NNN.md + chapters_index.json
失败章记 failed 不阻塞后续;--resume 跳过已完成。不要手改 progress.json 冒充成功——那会让真值校验彻底失效。
隐私与边界
- 本 skill 不含任何账号、书籍 ID、会话 ID 或他人本机路径;登录态只存在你本机
browser_profile目录,不上传、不读取密码。 - 只操作你自己账号下、你自己有权修改的章节。修改已发布内容会影响线上读者,首次务必试跑 1 章并人工复核,确认后再跑批。
- 自动化操作第三方平台存在被限流/风控的可能,请控制频率(本流程已按平台每日上限设计),不要并发多开。