将 GitHub Actions 的禁漫功能本地化,支持:
- 下载本子 - 批量下载禁漫本子到本地
- 导出收藏夹 - 导出收藏夹数据为 CSV 文件
- Web 界面 - 现代化的 Web 界面,更直观易用
- Rust 高性能下载器 - 🚀 降低 CPU/内存占用 70-90%,速度提升 2-3 倍
web_server.py- Web 服务器web/- 前端页面和静态资源requirements-web.txt- Web 依赖
local_download.py- 下载脚本local_download.yml- 下载配置文件
local_export_favorites.py- 导出脚本local_export_favorites.yml- 导出配置文件
jmcomic-downloader/- Rust 下载器源代码bin/- 编译好的二进制文件(Windows/Linux)
- Python 侧:负责 API 调用、认证、URL 解析(使用 jmcomic 库)
- Rust 侧:负责图片批量下载(异步 IO + 内存优化)
- 自动切换:Rust 下载器不可用时自动降级到 Python 下载器
如果需要重新编译(已提供预编译二进制,通常无需重新编译):
Windows:
cd jmcomic-downloader
cargo build --release
copy target\release\jmcomic-downloader.exe ..\bin\jmcomic-downloader-windows.exeLinux (交叉编译):
rustup target add x86_64-unknown-linux-gnu
cd jmcomic-downloader
cargo build --release --target x86_64-unknown-linux-gnu
cp target/x86_64-unknown-linux-gnu/release/jmcomic-downloader ../bin/jmcomic-downloader-linux详细说明请参阅 jmcomic-downloader/README.md
💡 网络优化提示
如果您在中国大陆地区使用,可能会遇到网络访问慢或安装依赖失败的问题。建议先更换系统软件源和 pip 镜像源:
更换 Linux 系统软件源(推荐):
bash <(curl -sSL https://linuxmirrors.cn/main.sh)更换 pip 镜像源:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements-web.txtpython web_server.py日志系统支持通过环境变量调优,不修改接口行为,仅影响日志保留与压缩策略。
| 变量名 | 默认值 | 作用 |
|---|---|---|
MAX_LOGS_PER_TASK |
200 |
每个任务最多保留多少条日志 |
MAX_LOGS_ON_DISK |
20000 |
磁盘总日志最大保留条数 |
WAL_COMPACT_BATCH_SIZE |
100 |
写入多少条增量日志后触发一次压缩合并 |
示例(macOS/Linux):
export MAX_LOGS_PER_TASK=300
export MAX_LOGS_ON_DISK=50000
export WAL_COMPACT_BATCH_SIZE=200
python web_server.py建议:
- 磁盘空间紧张:减小
MAX_LOGS_ON_DISK - 需要更长排障历史:增大
MAX_LOGS_PER_TASK - 写入频率很高:适当增大
WAL_COMPACT_BATCH_SIZE
以上变量在服务启动时读取,修改后需重启服务生效。
打开浏览器访问:http://localhost:5000
自动化功能使用 Cron 表达式设置同步间隔,格式:分 时 日 月 星期
常用示例:
0 */6 * * *- 每6小时执行0 2 * * *- 每天凌晨2点执行0 0 * * 0- 每周日凌晨执行0 0 1 * *- 每月1号凌晨执行*/30 * * * *- 每30分钟执行
在线生成器: crontab.guru
-
安装 Python(3.7+,推荐 3.9+)
- 下载:https://www.python.org/downloads/
- 安装时勾选 "Add Python to PATH"
-
安装依赖
pip install jmcomic -U
编辑 local_download.py,在配置区域填写本子 ID:
# ==================== 配置区域 ====================
# 要下载的本子ID(一行一个,支持JM前缀)
ALBUM_IDS = """
422866
123456
JM789012
"""
# 单独下载章节ID(可选)
PHOTO_IDS = """
"""
# 禁漫账号(可选,不登录也能下载大部分本子)
JM_USERNAME = ""
JM_PASSWORD = ""
# 下载目录
DOWNLOAD_DIR = "./download/"
# 客户端类型:api(推荐)或 html
CLIENT_IMPL = "api"
# 图片格式:.jpg 或 .png 或 .webp(留空表示不转换)
IMAGE_SUFFIX = ""
# ==================== 配置区域结束 ====================python local_download.py下载完成后,本子会保存在 download/ 目录,按以下结构组织:
download/
├── [本子ID]_[作者]_[标题]/
│ ├── 第1话/
│ │ ├── 00001.jpg
│ │ ├── 00002.jpg
│ │ └── ...
│ └── 第2话/
│ └── ...
方式一:代码中配置(推荐)
编辑 local_export_favorites.py,在配置区域填写:
# ==================== 配置区域 ====================
JM_USERNAME = "你的账号"
JM_PASSWORD = "你的密码"
ZIP_PASSWORD = "压缩密码" # 可选
ENABLE_ZIP = True # 是否压缩
# ==================== 配置区域结束 ====================方式二:运行时输入
直接运行脚本,按提示输入账号密码。
python local_export_favorites.py导出完成后,你会得到:
export/- CSV 文件目录,每个收藏夹一个 CSV 文件export_favorites.7z- 压缩包(如果启用压缩)
CSV 文件可用 Excel 或任何文本编辑器打开,包含:
- 本子 ID、标题、作者、标签、分类等信息
命令行版本 - 在 local_download.py 中配置 DIR_RULE:
# 默认规则(推荐)
DIR_RULE = "Bd_Aauthor_Atitle_Pindex"
# 结果:基础路径/作者/标题/章节索引
# 例如:./download/MANA/[MANA] 神里绫华 1/1/
# 只用标题
DIR_RULE = "Bd_Atitle_Pindex"
# 结果:基础路径/标题/章节索引
# 更多规则说明
# _ 表示目录层级分隔(相当于 /)
# Bd = 基础路径标记(必须在最前面,不可移动)
# Aauthor = 作者
# Atitle = 标题
# Pindex = 章节索引
# 更多变量请参考 jmcomic 文档Web 界面版本 - 在创建/编辑任务时配置:
- 手动下载:在下载表单的"目录层级规则"输入框中配置
- 自动化任务:在创建/编辑自动化任务表单中配置
使用 / 分隔目录层级(Web 界面),使用 _ 分隔目录层级(命令行配置文件)。
基本格式:
Axxx # 表示本子(Album)的属性xxx
Pxxx # 表示章节(Photo)的属性xxx
| 字段 | 说明 | 示例 |
|---|---|---|
Aid |
本子ID | 422866 |
Atitle |
本子标题 | [MANA] 神里绫华 1 |
Aauthor |
第一作者 | MANA |
Aauthors |
所有作者 | ['MANA'] |
Aauthoroname |
作者+原标题 | [MANA] 本子名 |
Aidoname |
ID+原标题 | [422866] 本子名 |
Aoname |
原标题(未净化) | [MANA] 神里绫华 1 |
Atags |
标签列表 | ['同人誌', '原神'] |
Aworks |
作品列表 | ['原神'] |
Aactors |
登场人物 | ['神里绫华'] |
Adescription |
描述 | - |
Apub_date |
发布日期 | 2023-01-01 |
Aupdate_date |
更新日期 | 2023-01-01 |
Alikes |
点赞数 | 1K |
Aviews |
观看数 | 40K |
Acomment_count |
评论数 | 123 |
Apage_count |
总页数 | 25 |
| 字段 | 说明 | 示例 |
|---|---|---|
Pid |
章节ID | 422866 |
Ptitle / Pname |
章节标题 | 第一话 |
Pindex |
章节索引(从1开始) | 1 |
Pindextitle |
"第X話 标题"格式 | 第1話 第一话 |
Psort |
排序值 | 1 |
Pauthor |
作者 | MANA |
Ptags |
标签 | ['同人誌'] |
# 常用组合
Aauthor/Atitle/Pindex # 作者/标题/章节索引(默认)
Atitle/Pindex # 标题/章节索引(简化版)
Aid/Pindex # 本子ID/章节索引
Aauthor/Aid/Pindex # 作者/本子ID/章节索引
# 详细组合
Aauthor/Aworks/Atitle/Pindex # 作者/作品/标题/章节索引
Aworks/Aactors/Atitle/Pindex # 作品/角色/标题/章节索引
# 使用特殊字段
Aauthoroname/Pindextitle # [作者]标题/第X話 章节名
Aidoname/Pindex # [ID]标题/章节索引
# f-string 语法(高级)
(JM{Aid})-{Aauthor}/{Pindex} # (JM422866)-MANA/1
{Aauthor}-{Atitle}/{Pindex} # MANA-神里绫华 1/1
- 使用
/分隔目录层级(Web 界面) - 使用
_分隔目录层级(命令行配置文件) - 字段名区分大小写:
Atitle✓atitle✗ - 支持 f-string 语法:用
{}包裹字段名可以自由组合 - 更多详情请参考 jmcomic 文档
Web 界面版本:在手动下载或自动化任务中勾选"下载完成后自动压缩"
配置选项:
- 压缩格式:ZIP 或 7z
- 压缩级别:
- 整本压缩:将整个本子压缩为一个文件
- 分章压缩:每个章节单独压缩
- 压缩密码:可选,为压缩包设置密码保护
- 压缩后删除原文件:节省磁盘空间
依赖库:
pip install pyzipper py7zr使用场景:
- 节省磁盘空间(通常可节省 30-50%)
- 方便整理和分享
- 加密保护隐私内容
# 转换为 PNG(高质量,文件大)
IMAGE_SUFFIX = ".png"
# 转换为 WebP(高压缩,文件小)
IMAGE_SUFFIX = ".webp"
# 不转换(保持原始格式)
IMAGE_SUFFIX = ""# API 客户端(推荐,速度快,免登录)
CLIENT_IMPL = "api"
# HTML 客户端(慢但稳定)
CLIENT_IMPL = "html"本项目已内置高级重试机制,自动优化域名选择策略:
工作原理:
- 记录每个域名的失败次数
- 自动将成功率高的域名排在前面
- 跳过失败次数过多的域名
- 多轮轮询确保最大成功率
配置说明(已在 local_download.yml 中配置,无需手动设置):
plugins:
after_init:
- plugin: advanced_retry
kwargs:
retry_config:
retry_rounds: 3 # 最多轮询3轮所有域名
retry_domain_max_times: 5 # 单个域名失败5次后跳过效果:
- 自动学习哪些域名好用
- 减少在不稳定域名上浪费的时间
- 提高下载成功率
编辑 local_export_favorites.yml 配置文件:
plugins:
main:
- plugin: favorite_folder_export
kwargs:
save_dir: ./export/ # 导出目录
zip_enable: true # 是否压缩
zip_filepath: ./export.7z # 压缩文件路径
zip_password: ${ZIP_PASSWORD} # 压缩密码
delete_original_file: false # 压缩后是否删除原文件- GitHub: https://github.com/hect0x7/JMComic-Crawler-Python
- 文档: https://jmcomic.readthedocs.io/
- 教程: 查看原项目的
assets/docs/sources/tutorial/目录
- LinuxMirrors - GNU/Linux 更换软件源脚本
- GitHub: https://github.com/SuperManito/LinuxMirrors
- 官网: https://linuxmirrors.cn
- 一键更换系统软件源和 Docker 镜像源
- 支持 30+ 种主流 Linux 发行版
详细的配置文件语法说明: https://jmcomic.readthedocs.io/zh-cn/latest/option_file_syntax/
本工具基于 JMComic-Crawler-Python 项目开发。
感谢原作者 hect0x7 提供的优秀框架!
本工具基于原项目开发,遵循原项目的许可证。