Playwright-powered Fanqie novel publishing skill with guides and thin adapters for OpenClaw, Hermes Agent, Claude Code, Codex CLI, and Cline.
Overview
本工具**官方番茄小说 SDK 或公开 API 封装。后台改版可能导致自动化中断;正式发布前请务必使用安全模式验证。 - 解析 Markdown 章节,自动拆分章节编号、标题和正文 - 支持单章或批量发布本地目录中的章节 - 对中文、Emoji 及 Unicode 字符提供可靠的输入支持(基于重新设计的番茄编辑器及往返读取验证) - 会话过期时引导二维码登录,支持浏览器会话复用 - 即时发布及平台原生定时发布 - 拦截并处理错词警告、内容风险检测及最终发布设置弹窗 - 发布后返回章节管理页面,确认状态为「审核中」或「已发布」 - 安全的 --fill-only 模式——仅填写编辑器字段,不提交任何内容 - 清晰的阶段区分:预览(preview-only)→ 仅填写(fill-only)→ 到达最终弹窗(at-final-modal)→ 已提交未验证(submitted-but-unverified)→ 已验证发布(verified publication) 除 OpenClaw/Hermes 外,每个薄适配层**。业务逻辑、选择器和安全规则均位于 SKILL.md、references/ 和 scripts/ 中。任何适配层均不重复实现发布逻辑。 - 及 npm - - 浏览器(可通过 Playwright CDP 控制) - 一个具备后台访问权限的** - 首次使用前在仓库根目录执行 npm install 1. 将章节准备为 .md 文件(一个文件 = 一个章节) 2. 预览解析结果:python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview 3. 通过 CDP 连接已登录的浏览器:node scripts/login_fanqie.js --cdp http://127.0.0.1:9222 4. 安全填充测试:node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only 5.
README
Fanqie Publisher Skill
通过浏览器自动化(Playwright + CDP),将本地 Markdown 章节发布到番茄小说网作者后台。
本工具并非官方番茄小说 SDK 或公开 API 封装。后台改版可能导致自动化中断;正式发布前请务必使用安全模式验证。
🌐 简体中文 · English
功能特性
- 解析 Markdown 章节,自动拆分章节编号、标题和正文
- 支持单章或批量发布本地目录中的章节
- 对中文、Emoji 及 Unicode 字符提供可靠的输入支持(基于重新设计的番茄编辑器及往返读取验证)
- 会话过期时引导二维码登录,支持浏览器会话复用
- 即时发布及平台原生定时发布
- 拦截并处理错词警告、内容风险检测及最终发布设置弹窗
- 发布后返回章节管理页面,确认状态为「审核中」或「已发布」
- 安全的
--fill-only模式——仅填写编辑器字段,不提交任何内容 - 清晰的阶段区分:预览(preview-only)→ 仅填写(fill-only)→ 到达最终弹窗(at-final-modal)→ 已提交未验证(submitted-but-unverified)→ 已验证发布(verified publication)
平台支持
| 平台 | 状态 | 入口文件 | 说明 |
|---|---|---|---|
| OpenClaw | ✅ 已验证 | SKILL.md |
原生技能格式,含 YAML 前置元数据、命令和规则。注入的提示文件:AGENTS.md、SOUL.md、TOOLS.md。 |
| Hermes Agent | ✅ 已验证 | SKILL.md(复用) |
复用同一份 SKILL.md。通过 hermes claw migrate(官方迁移路径)导入。详见 Hermes Agent 教程。 |
| Claude Code | ✅ 已验证 | CLAUDE.md |
薄适配层——引用共享的 SKILL.md 和 references/ 获取业务逻辑。 |
| OpenAI Codex CLI | ✅ 已验证 | AGENTS.md |
薄适配层。所有业务逻辑来源于 SKILL.md、references/ 和 scripts/。 |
| Cline | ✅ 已验证 | .clinerules |
薄适配层。所有业务逻辑来源于 SKILL.md、references/ 和 scripts/。 |
除 OpenClaw/Hermes 外,每个薄适配层仅作为轻量入口。业务逻辑、选择器和安全规则均位于
SKILL.md、references/和scripts/中。任何适配层均不重复实现发布逻辑。
环境要求
- Node.js 及 npm
- Python 3
- Chromium/Chrome 浏览器(可通过 Playwright CDP 控制)
- 一个具备后台访问权限的番茄小说作者账号
- 首次使用前在仓库根目录执行
npm install
请勿声称可以自动安装依赖或假定这些环境已自动就绪。每个依赖均需手动安装或配置。
快速开始
git clone https://github.com/amm10090/fanqie-publisher-skill.git
cd fanqie-publisher-skill
npm install
基本工作流程:
- 将章节准备为
.md文件(一个文件 = 一个章节) - 预览解析结果:
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview - 通过 CDP 连接已登录的浏览器:
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222 - 安全填充测试:
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only - 验证内容和页面状态无误后,先获得用户当轮明确确认,再**移除
--fill-only**并添加--confirm-publish进行真实发布
章节格式
每个 .md 文件代表一个章节:
第001章_标题.md
# 第001章 标题
正文第一段。
第二段。
解析器会将第一个 Markdown 标题从正文中剥离,将 第001章 标题 拆分为序号 1 和显示标题 标题,并填入番茄编辑器对应字段。序号中的前导零在实际数值输入时会被移除。
平台教程
OpenClaw
将克隆后的仓库目录放入 OpenClaw 工作区的 skills 文件夹中,或将 OpenClaw 指向此目录。SKILL.md 文件作为完整的技能定义,包含:
- YAML 前置元数据(
name、description),用于自动技能发现 - 完整的
commands部分,涵盖所有入口点 rules部分,包含安全上限、登录处理和平台限制- 经过验证的逐步发布工作流
OpenClaw 还会在工作区级别注入 AGENTS.md、SOUL.md 和 TOOLS.md 作为全局提示文件。
# 技能加载后,可用的命令:
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
关于批量发布、定时发布、分卷选择和重试,请阅读 SKILL.md。
Hermes Agent
Hermes Agent 使用与 OpenClaw 相同的 SKILL.md 文件。通过官方迁移命令导入。
前提条件
- 已安装 Hermes Agent(官方仓库:NousResearch/hermes-agent)
- 已在本地检出此仓库
迁移路径(官方方式)
Hermes 提供 hermes claw migrate 命令,用于将 OpenClaw 技能导入到 ~/.hermes/skills/openclaw-imports/。其 --source 选项需要一个 OpenClaw 根目录,而非直接指向此仓库。
步骤 1 — 检查命令和 dry-run 标志:
hermes claw migrate --help
应显示 --source 指向一个 OpenClaw 目录路径,以及 --dry-run 的描述为「仅预览——展示将要迁移的内容后停止」。
步骤 2 — 将此仓库组装为 OpenClaw 兼容的源目录布局:
在仓库根目录下执行以下命令:
OPENCLAW_SOURCE="$(mktemp -d "${TMPDIR:-/tmp}/fanqie-openclaw-source-XXXXXX")"
SKILL_SOURCE="$OPENCLAW_SOURCE/workspace/skills/fanqie-publisher"
mkdir -p "$SKILL_SOURCE"
cp SKILL.md package.json "$SKILL_SOURCE/"
cp -R references scripts "$SKILL_SOURCE/"
此操作仅将技能定义和共享运行时文件复制到临时源目录中。不会复制 .git、state/、登录令牌、截图或章节文件。
步骤 3 — 使用 --dry-run 预览迁移:
hermes claw migrate --source "$OPENCLAW_SOURCE" --dry-run
dry-run 输出将列出将被迁移和将被跳过的内容。在进行任何更改之前务必仔细检查。 源路径必须解析为临时的 OpenClaw 根目录,而计划的技能目标应为 ~/.hermes/skills/openclaw-imports/fanqie-publisher/。
步骤 4 — 确认预览结果后执行实际迁移:
hermes claw migrate --source "$OPENCLAW_SOURCE"
迁移成功后,验证已导入的文件,如果你不再需要临时目录,可以删除 OPENCLAW_SOURCE 中存储的临时目录。切勿在递归清理命令中使用未经核实的路径。
⚠️ 重要安全提示:
- 务必先执行
--dry-run,检查输出后再进行任何实际迁移 - 迁移仅导入
SKILL.md、package.json、references/和scripts/——不会复制.git、state/、登录令牌或用户章节文件 - 实际的
publish_fanqie.js脚本在迁移过程中不会执行——仅进行文件复制 - 保护你的真实配置:如在隔离环境中测试,务必确认你的真实
~/.hermes和~/.openclaw目录绝不会被用作迁移目标。保护用户真实数据是最优先事项。 - 迁移后,
~/.hermes/skills/openclaw-imports/fanqie-publisher/中的技能包含指向references/和scripts/的有效相对引用
在 Hermes 中加载后,使用相同的命令:
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
Claude Code
Claude Code 从项目根目录读取 CLAUDE.md。该薄适配层指导 Claude:
- 读取
SKILL.md、references/workflow.md、references/selectors.md和scripts/publish_fanqie.js(仅标志说明) - 使用来自
SKILL.md入口点的共享命令 - 遵循相同的安全规则(每天 50,000 字符上限、定时编辑 30 分钟窗口、显式设置
是否使用AI → 否)
# 预览章节解析
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
# 登录或重连
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222
# 安全填充测试
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
真实发布时,使用相同的已审查参数,移除 --fill-only,添加 --confirm-publish。
Codex CLI
Codex CLI 从项目根目录读取 AGENTS.md。该薄适配层:
- 引用
SKILL.md获取所有业务逻辑和安全规则 - 引用
references/获取选择器和工作流详情 - 引用
scripts/publish_fanqie.js作为唯一的发布入口 - 不会声称自动安装、自动登录或绕过人工确认
命令与其他平台相同:
# 语法检查及编辑器测试
npm run test:all
# 预览章节
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
# 登录
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222
# 安全填充
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
Cline
Cline 从项目根目录读取 .clinerules。该薄适配层遵循相同设计:引用共享文件,使用共享命令,强制执行共享安全规则。
命令:
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
真实发布示例(注意:移除了 --fill-only,不得与 --confirm-publish 同时使用):
node scripts/publish_fanqie.js \
--cdp http://127.0.0.1:9222 \
--file "/path/to/chapter.md" \
--mode immediate \
--confirm-publish
安全发布工作流
请始终按以下阶段推进,切勿跳过步骤。
阶段 1:仅预览(Preview Only)
python3 scripts/prepare_chapters.py --dir "/path/to/chapters" --preview
验证章节编号、标题和正文是否解析正确。
阶段 2:仅填写(Fill Only,安全模式)
node scripts/publish_fanqie.js --cdp http://127.0.0.1:9222 --file "/path/to/chapter.md" --mode immediate --fill-only
编辑器中的字段被填写。不提交任何内容。 验证章节编号、标题、正文、分卷选择和页面状态。
阶段 3:到达最终弹窗(At Final Modal)
使用 --fill-only 时,脚本会填写字段并依次通过错词/风险检测弹窗,最终到达发布确认对话框前停止,不会点击「确认发布」。这确认了所有中间关卡均可通行。
阶段 4:已提交未验证(Submitted But Unverified)
使用 --confirm-publish 进行真实发布后,提交按钮已点击,但尚未检查管理页面。这不代表验证成功。
阶段 5:已验证发布(Verified Publication)✅
脚本返回章节管理页面,确认目标行存在且状态为「审核中」或「已发布」。仅此阶段确认发布成功。
正确真实发布示例: 使用与填充测试相同的参数,移除
--fill-only,并添加--confirm-publish。请勿同时使用--fill-only和--confirm-publish。
安全边界
- 在任何真实发布之前,先测试单章或使用
--fill-only - 提交前验证目标作品、分卷、章节编号、标题和正文
- 每天 50,000 字符是实用的安全上限(并非官方配额)
- 定时章节在发布前约 30 分钟变为不可编辑——请勿在此时尝试最后的修改
- 切勿提交登录令牌、浏览器会话、截图、二维码或临时状态文件
- 番茄小说后台更新时选择器会变动——在使用前检查,不要假设选择器一直稳定
- 在最终发布弹窗中,始终将「是否使用AI」设置为「否」
故障排查
中文 / Emoji / Unicode 输入问题
重新设计的番茄编辑器对非 ASCII 字符需要特殊处理:
- 脚本采用逐字符输入加往返读取验证的方式处理中文、Emoji 和特殊 Unicode 字符
- 如果输入验证失败,脚本会报告
input-validation-failed——请修正原文后重试,不要将其报告为发布成功 - 空的编辑器装饰节点会被自动处理;如果正文字段无响应,请先确认编辑器已完全加载后再填写
登录问题
- 如果会话过期,脚本会引导你进行二维码登录(需手动扫码)
- 使用
node scripts/login_fanqie.js --cdp http://127.0.0.1:9222重新连接 - 对于需要获取二维码路径的程序,请改用
scripts/login_fanqie_notify.js - 不执行自动登录——始终需要人工与二维码交互
选择器 / 页面状态问题
如果某一步意外失败:
- 手动检查当前页面状态
- 查看
references/selectors.md获取最新的语义选择器 - 查看
references/workflow.md获取已验证的发布流程 - 查看
references/editor-recon.md获取编辑器探查笔记 - 如果后台发生变更,更新
scripts/publish_fanqie.js中的选择器
弹窗 / 对话框处理
发布流程中可能遇到以下几种中间对话框:
| 对话框 | 触发条件 | 操作 |
|---|---|---|
| 错词/拼写检查警告 | 点击「下一步」后 | 点击「提交」继续 |
| 内容风险检测 | 错词检查通过后 | 点击「确定」继续 |
| 引导/新手教程 | 首次进入编辑器 | 尝试「知道了」/「我知道了」/「下一步」/「跳过」 |
| 最终发布设置 | 提交之前 | 将「是否使用AI」设为「否」,选择即时或定时发布,点击「确认发布」 |
常见问题
问:支持定时发布吗?
答:支持——使用 --mode schedule 配合 --scheduled-time。此功能通过番茄后台原生定时发布界面实现,而非外部 cron 任务。
问:可以一次发布多个章节吗?
答:可以——使用 --dir 替代 --file,还可选配 --volume 进行分卷选择。
问:超过每日限制会怎样?
答:脚本以每天 50,000 字符作为实用的安全上限。在高产量日,可传入 --already-published-chars 让脚本在接近疑似上限时停止。
问:番茄后台改版后还能用吗?
答:自动化依赖 CSS 选择器和 DOM 结构。后台改版可能破坏特定选择器——请更新 references/selectors.md 并使用 --fill-only 先行测试。
问:可以不打开浏览器使用吗? 答:不行——需要通过 CDP 控制的 Chromium/Chrome 浏览器会话是必需的。
参考文件
| 文件 | 用途 |
|---|---|
SKILL.md |
完整的技能定义、命令、安全规则和发布流程 |
references/workflow.md |
经过验证的逐步发布工作流 |
references/selectors.md |
番茄后台页面的语义 CSS 选择器 |
references/editor-recon.md |
编辑器探查及弹窗处理笔记 |
references/data-format.md |
章节源文件格式规范 |
scripts/publish_fanqie.js |
主发布入口(单一事实来源) |
scripts/prepare_chapters.py |
Markdown 章节解析器及预览 |
scripts/login_fanqie.js |
登录与会话管理 |
scripts/editor_input.js |
Unicode 输入及往返读取验证 |
CHANGELOG.md |
发布历史 |
开发与测试
npm run test:all
执行 JavaScript 语法检查及编辑器输入测试。核心源文件:
scripts/publish_fanqie.js—— 发布主流程scripts/editor_input.js—— Unicode 输入及读取验证scripts/login_fanqie.js—— 登录与会话管理scripts/prepare_chapters.py—— Markdown 章节解析
贡献指南
欢迎贡献。请遵循以下准则:
- 先提交 issue 讨论变更
- 保持薄适配层的轻量化——业务逻辑应放在
SKILL.md、references/和scripts/中 - 番茄后台变更时更新
references/selectors.md - 所有变更在提交前使用
--fill-only测试 - 不要提交登录令牌、浏览器会话、截图或用户数据
- 保持 UTF-8 编码;编辑器变更后测试中文和 Emoji 输入
许可证
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add amm10090/fanqie-publisher-skill