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 曾修复路径穿越漏洞,建议及时升级

原文:freeok/so-novel