So Novel 是一个 Java 21 编写的开源网络小说下载工具(7.6k+ stars,AGPL-3.0),内置 30+ 书源规则,支持 TUI/CLI/WebUI 三种模式,并发抓取章节并导出为 EPUB/TXT/PDF/HTML 电子书格式。项目地址:freeok/so-novel,最新版本 v1.11.0(2026-06-30)。
项目简介
So Novel(so-novel)定位是"通用的网页内容处理与导出工具":从网页中提取结构化信息(书搜索、详情、目录、正文),按规则解析后导出为标准电子文档。最初专注网文下载,现在也适用于学习采集、格式转换、电子书制作等场景。
- 语言/构建:Java 21 + Maven
- 许可证:AGPL-3.0
- 仓库规模:7654 stars / 687 forks(2026-08-11)
- 支持平台:Windows / Linux / macOS / NAS(Docker)/ 源码构建
三种运行模式
| 模式 | 说明 |
|---|---|
| TUI | 默认模式,终端交互界面,搜索 → 选择书源 → 下载 |
| CLI | 命令行批处理,配合 -Dmode=cli 使用 |
| WebUI | 浏览器界面(端口 7765),JAVA_OPTS="-Dmode=web" 启动,带搜索历史、搜索建议、书源列表、下载进度条 |
启动参数通过 JVM 系统属性控制:-Dmode=tui|cli|web、-Dconfig.file(配置文件路径,默认 ./config.ini)。
核心特性
- 多格式导出:EPUB、TXT、PDF、HTML;TXT 可指定 GBK 编码兼容旧设备
- 并发爬取:默认 50 线程,章节间隔 200-400ms,失败自动重试(最多 3 次),可调
- 书源规则体系:
rules/*.json定义每个书源的搜索/详情/目录/正文解析规则,支持自定义书源(模板见rule-template.json5) - JS 加密章节:内置 Javet(V8)引擎执行站点加密 JS,支持 96读书、燃文、万书网等加密章节
- 反爬对抗:内置 Cloudflare 绕过(cf-bypass 服务)、HTTP 代理、Cookie(起点封面)、请求限速
- 搜索结果过滤:相似度打分过滤低质量结果,每个书源限显示前 N 条
书源体系
书源按可用性分组存放,均在 bundle/rules/ 下:
- main.json(默认,11 个):香书小说、书海阁、梦书中文、鸟书网、笔趣阁22、笔尖中文、悠久小说网、阅读库、顶点小说、笔趣阁365、燃文小说网
- proxy-required.json(需代理/非大陆 IP):69书吧、全本小说网、大熊猫文学、101看书
- rate-limit.json(限流严苛):新天禧小说、零点小说、老幺小说网、速读谷
- non-search.json(不支持搜索,须输入详情页 URL):小说虎、天天看小说、小说之家
- cloudflare.json(有 CF 保护):黄易天地、96读书、东滩小说
注意事项:书源对 IP 属地有要求(大陆/非大陆),限流源建议调低线程数(≤5),被永久封 IP 时需更换 IP。完整清单见 BOOK_SOURCES.md。
安装方式
- Release 压缩包:https://github.com/freeok/so-novel/releases
- Windows:
irm https://raw.githubusercontent.com/freeok/so-novel/main/bin/windows-install.ps1 | iex - Linux:
bash <(curl -sSL https://raw.githubusercontent.com/freeok/so-novel/main/bin/linux-install.sh) - Homebrew:
brew tap ownia/homebrew-ownia && brew install so-novel - Scoop:
scoop bucket add freeok https://github.com/freeok/scoop-bucket && scoop install freeok/so-novel - Docker Compose(NAS 首选):
services:
sonovel:
image: ghcr.io/freeok/sonovel:latest
container_name: sonovel
ports:
- "7765:7765"
environment:
JAVA_OPTS: "-Dmode=web"
volumes:
- sonovel_data:/sonovel
restart: unless-stopped
volumes:
sonovel_data:
- 源码构建:需 git + JDK 21 + Maven,
git clone后执行sh bin/release-linux.sh [x64|arm64]
关键配置(config.ini)
[download]
download-path = downloads # 下载目录
extname = epub # 格式:epub|txt|html|pdf
txt-encoding = # txt 编码,GBK 兼容旧设备
[source]
active-rules = main.json # 激活的书源规则文件
source-id = # 指定书源 ID(搜索/批量下载)
search-limit = 30 # 每书源搜索条数上限
search-filter = 1 # 低相似度结果过滤
[crawl]
concurrency = # 并发上限,默认 50
min-interval = 200 # 章节请求最小间隔(ms)
enable-retry = 1 # 失败重试
max-retries = 3
[web]
enabled = 0 # Web 服务开关
port = 7765
[proxy]
enabled = 0 # HTTP 代理(给需要代理的书源)
host = 127.0.0.1
使用提示
- 不支持搜索的书源(non-search.json)只能粘贴书籍详情页 URL 下载
- 下载的 EPUB 若 WPS、掌阅打不开,参考 discussions/199 修复
- 推荐阅读器:桌面端 Readest、Koodo Reader、Calibre;移动端 Moon+ Reader、Apple Books、Kindle
- v1.11.0 曾修复路径穿越漏洞,建议及时升级