基于 RSS 订阅自动监控剧集更新,磁力链接自动离线到 115 网盘,带 Web 管理界面。
- RSS 监控 — 定时抓取 RSS 源,自动识别新剧集(支持集数/季数/清晰度提取)
- 115 离线下载 — 磁力链/ED2K 自动提交到 115 网盘,支持目录归类
- 智能过滤 — 关键词包含/排除、集数范围、正则匹配、自动跟进最新集数
- 失败重试 — 指数退避重试,超限后自动放弃并通知
- Telegram 通知 — 离线成功/失败、RSS 源失效时推送到 Telegram
- Web 管理界面 — 响应式深色主题 SPA,支持源管理、任务查看、配置管理
- RSS 源导入/导出 — 支持 JSON 格式批量导入导出源配置
- Windows 桌面版 — PyQt6 窗口 + 系统托盘(可选)
| 项目 | 要求 |
|---|---|
| Python | 3.12+(p115client 强制要求) |
| 操作系统 | Linux / macOS / Windows(桌面版) |
| 磁盘 | 至少 100MB(不含下载文件) |
| 网络 | 能访问 115.com、RSS 源 |
# 1. 克隆项目
git clone <仓库地址> Zhui115
cd Zhui115
# 2. 启动
docker compose up -d
# 3. 查看日志
docker logs zhui115 -f --tail 50看到以下输出说明启动成功:
🚀 Zhui115 启动 (Web端口 8300)
Cookie 已配置: ❌
浏览器打开 http://你的服务器IP:8300
# 1. 创建虚拟环境
python3.12 -m venv .venv
source .venv/bin/activate
# 2. 安装依赖
pip install -r requirements.txt
# 3. 启动
python3 main.py打开 Web 界面 → 设置 页面,填入 115 网盘的登录 Cookie。
格式:UID=xxx; CID=xxx; SEID=xxx; KID=xxx
获取方法:
- 浏览器登录 115.com
- 按 F12 打开开发者工具 → 网络(Network) 标签
- 刷新页面,点击任意请求,在请求头中找到
Cookie:字段
安全提示: Cookie 等同账号密码,代码会使用 cryptography 加密存储。建议通过
docker-compose.yaml中的ZHUI115_SECRET_KEY环境变量设置自定义加密密钥。
打开 Web 界面 → RSS 源 页面 → 点击"添加源"。
推荐 RSS 源:
| 名称 | 地址 |
|---|---|
| 动漫花园-动画 | https://share.dmhy.org/topics/rss/sort_id/2/rss.xml |
| 动漫花园-日剧 | https://share.dmhy.org/topics/rss/sort_id/6/rss.xml |
| 萌番组 | https://bangumi.moe/rss/latest |
添加 RSS 源时可配置:
| 字段 | 说明 |
|---|---|
| 包含关键词 | 标题必须包含这些词(支持逗号分隔) |
| 排除关键词 | 标题不能包含这些词 |
| 正则过滤 | 开启后关键词按正则匹配 |
| 集数从/到 | 只下载指定范围的集数 |
| 季数 | 只下载指定季的内容 |
| 自动跟进 | 自动记住已下载的最新集数,下次从此集数开始 |
# 默认:Web + 调度
python3 main.py
# 调试模式
python3 main.py --debug
# 仅启动 Web 界面
python3 main.py --web-only
# 仅启动定时调度(无 Web)
python3 main.py --scheduler-only
# 单次检查所有 RSS 源
python3 main.py --check-now
# 指定端口
python3 main.py --port 8300
# 环境变量控制日志级别
ZHUI115_LOG_LEVEL=DEBUG python3 main.pyZhui115/
├── main.py # 入口:启动 Web + 调度
├── desktop.py # Windows 桌面版入口(PyQt6)
├── Zhui115.spec # PyInstaller 打包配置
├── BUILD_WINDOWS.md # Windows 桌面版构建说明
├── DOCKER.md # Docker 部署指南
├── requirements.txt # Python 依赖
├── Dockerfile # Docker 构建
├── docker-compose.yaml # Docker 编排
├── icon.ico / icon.png # 应用图标
│
├── app/
│ ├── __init__.py # 空
│ ├── config.py # 配置管理(JSON 读写 + 敏感字段加密)
│ ├── db.py # 数据库层(SQLite,6 张表)
│ ├── rss.py # RSS 抓取与解析(cloudscraper + UA 池)
│ ├── offline115.py # 115 离线下载封装(p115client)
│ ├── scheduler.py # 定时调度(APScheduler)
│ ├── notifier.py # Telegram 通知模块
│ │
│ └── web/
│ ├── __init__.py # 空
│ ├── server.py # HTTP 服务器(ThreadingHTTPServer)
│ ├── api.py # RESTful API(23+ 接口)
│ └── static/ # 前端 SPA
│ ├── index.html # 入口页面
│ ├── style.css # 深色主题样式
│ └── app.js # 前端逻辑
│
└── data/ # 运行时数据(Docker volume 挂载点)
├── global.json # 全局配置(Cookie、端口等)
├── sources.json # RSS 源列表
└── zhui115.db # SQLite 数据库
各模块职责:
| 文件 | 职责 |
|---|---|
main.py |
应用入口,解析命令行参数,启动 Web + 调度器 |
desktop.py |
Windows 桌面版入口,PyQt6 窗口嵌入 Web 界面 |
app/config.py |
JSON 配置读写,敏感字段加密(cryptography Fernet),原子写入 |
app/db.py |
SQLite 数据库管理(6 张表),线程安全连接池,自动迁移 |
app/rss.py |
RSS 抓取解析,磁力/ED2K 链接提取,集数/季数/清晰度识别 |
app/offline115.py |
115 网盘离线下载,客户端缓存,目录创建,配额查询 |
app/scheduler.py |
定时调度,源级失败跳过策略,指数退避重试,内存诊断 |
app/notifier.py |
Telegram Bot 通知,HTML 消息构建,封面图发送 |
app/web/server.py |
HTTP 服务器,静态文件服务,路径穿越防护,登录认证 |
app/web/api.py |
RESTful API 路由,23+ 接口 |
| 接口 | 方法 | 说明 |
|---|---|---|
/api/global |
GET/PUT | 全局配置读写 |
/api/cookie |
GET/PUT | 115 Cookie 单独读写 |
/api/sources |
GET/POST | RSS 源列表 / 添加源 |
/api/sources/{name} |
GET/PUT/DELETE | 单个源操作 |
/api/sources/export |
GET | 导出所有源为 JSON |
/api/sources/import |
POST | 从 JSON 导入源 |
/api/sources/test |
POST | 测试 RSS 源地址 |
/api/tasks |
GET | 离线任务列表(分页) |
/api/tasks/stats |
GET | 任务统计 |
/api/retry |
GET | 重试队列 |
/api/history |
GET | 操作日志 |
/api/115/status |
GET | 115 连接状态与配额 |
/api/115/offline-list |
GET | 115 端离线任务列表 |
/api/scheduler/status |
GET | 调度器状态 |
/api/scheduler/run-now |
POST | 立即触发检查 |
/api/notify/test |
POST | 测试 Telegram 通知 |
/api/data/vacuum |
POST | 数据清理 |
/api/debug/memory |
GET | 内存诊断(tracemalloc) |
/api/login |
POST | Web 登录认证 |
支持离线成功/失败、RSS 源失效时自动推送到 Telegram。
- 在 Telegram 中搜索 @BotFather,创建 Bot,获取 Token
- 向你的 Bot 发送一条消息,访问
https://api.telegram.org/bot<你的Token>/getUpdates获取 Chat ID - 在 Web 界面 → 设置 → 通知设置 中填入 Token 和 Chat ID
可配置的通知类型:
- ✅ 离线成功通知
- ❌ 离线失败通知(重试耗尽后触发)
⚠️ RSS 源失效通知
通知消息会尝试附带封面图(来自 RSS 源的 media:thumbnail),无图时仅发送文字。
敏感字段(Cookie、Bot Token、密码)使用 cryptography Fernet 对称加密存储。
设置加密密钥(强烈建议):
# docker-compose.yaml
environment:
- ZHUI115_SECRET_KEY=$(openssl rand -hex 32)密钥未配置时使用机器固定兜底密钥加密(仍比明文存储安全,但建议设置自定义密钥)。
Web 登录认证(可选):
environment:
- ZHUI115_WEB_USERNAME=admin
- ZHUI115_WEB_PASSWORD=你的密码启用后所有 API 请求需要 Bearer Token 认证,Token 24 小时过期。
| 页面 | 功能 |
|---|---|
| 总览 | 统计概览、调度器状态、115 连接状态、配额 |
| RSS 源 | 添加/编辑/删除源,测试源解析,过滤规则,导入/导出 |
| 离线任务 | 4 种状态:等待提交 / 已提交 / 失败 / 已完成 |
| 重试队列 | 查看待重试的任务 |
| 操作日志 | 所有操作记录 |
| 设置 | Cookie、保存目录、检查间隔、Telegram 通知、Web 登录 |
data/
├── global.json # 全局配置(敏感字段加密存储)
├── sources.json # RSS 源列表
└── zhui115.db # SQLite 数据库(WAL 模式)
| 表名 | 用途 |
|---|---|
episodes |
已处理的剧集(去重用) |
offline_tasks |
离线任务状态跟踪 |
retry_queue |
失败重试队列 |
history |
操作日志 |
gap_log |
断集检测日志 |
meta |
元数据键值存储 |
# 通过 API 删除超过保留天数的记录
curl -X POST http://localhost:8300/api/data/vacuum \
-H "Content-Type: application/json" \
-d '{"keep_days": 60}'- 源间随机延迟 2-6 秒,避免同时请求
- 定时器加入随机抖动(±20%),避免整点触发
- 源级失败计数,连续 5 次失败跳过整轮
- 连续 3 次 Cloudflare 拦截跳过整轮并发送通知
- 连接池失效时自动重建 scraper 实例
- 重新从浏览器获取最新的 Cookie
- 115.com 的 Cookie 会定期过期,需重新登录获取
- 源站可能被 Cloudflare 阻挡,系统有自动重试机制
- 检查日志中是否有 Cloudflare 相关错误
- 表示该磁力已经在 115 离线任务中,系统会自动视为成功
- 调度器每 10 分钟同步一次 115 任务状态
- 检查日志是否有
获取115离线任务列表失败的提示
# 1. 克隆
git clone <仓库地址> Zhui115
cd Zhui115
# 2. 虚拟环境
python3.12 -m venv .venv
source .venv/bin/activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 启动(开发模式)
python3 main.py --debug# 测试 RSS 解析
python3 -c "from app.rss import parse_rss; print(parse_rss('https://share.dmhy.org/topics/rss/sort_id/2/rss.xml')[:2])"
# 测试 115 连接(需配置 Cookie)
python3 -c "from app.offline115 import get_client, query_quota; print(query_quota())"本项目代码仅供个人学习研究使用。使用前请确保遵守 115 网盘的服务条款。