Skip to content

Repository files navigation

Zhui115 — 自动追剧 RSS 监控 + 115 离线下载

基于 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 源

快速开始

方式一:Docker 部署(推荐)

# 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

方式三:Windows 桌面版

详见 BUILD_WINDOWS.md


首次配置

1. 配置 115 Cookie

打开 Web 界面 → 设置 页面,填入 115 网盘的登录 Cookie。

格式:UID=xxx; CID=xxx; SEID=xxx; KID=xxx

获取方法:

  1. 浏览器登录 115.com
  2. 按 F12 打开开发者工具 → 网络(Network) 标签
  3. 刷新页面,点击任意请求,在请求头中找到 Cookie: 字段

安全提示: Cookie 等同账号密码,代码会使用 cryptography 加密存储。建议通过 docker-compose.yaml 中的 ZHUI115_SECRET_KEY 环境变量设置自定义加密密钥。

2. 添加 RSS 源

打开 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

3. 过滤规则

添加 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.py

项目结构

Zhui115/
├── 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+ 接口

Web 界面 API

接口 方法 说明
/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 登录认证

Telegram 通知配置

支持离线成功/失败、RSS 源失效时自动推送到 Telegram。

  1. 在 Telegram 中搜索 @BotFather,创建 Bot,获取 Token
  2. 向你的 Bot 发送一条消息,访问 https://api.telegram.org/bot<你的Token>/getUpdates 获取 Chat ID
  3. 在 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 小时过期。


Web 界面页面

页面 功能
总览 统计概览、调度器状态、115 连接状态、配额
RSS 源 添加/编辑/删除源,测试源解析,过滤规则,导入/导出
离线任务 4 种状态:等待提交 / 已提交 / 失败 / 已完成
重试队列 查看待重试的任务
操作日志 所有操作记录
设置 Cookie、保存目录、检查间隔、Telegram 通知、Web 登录

数据存储

数据目录(data/

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}'

防 Cloudflare 策略

  • 源间随机延迟 2-6 秒,避免同时请求
  • 定时器加入随机抖动(±20%),避免整点触发
  • 源级失败计数,连续 5 次失败跳过整轮
  • 连续 3 次 Cloudflare 拦截跳过整轮并发送通知
  • 连接池失效时自动重建 scraper 实例

常见问题

Cookie 无效?

  • 重新从浏览器获取最新的 Cookie
  • 115.com 的 Cookie 会定期过期,需重新登录获取

RSS 源无法抓取?

  • 源站可能被 Cloudflare 阻挡,系统有自动重试机制
  • 检查日志中是否有 Cloudflare 相关错误

磁力链接提交失败(错误码 20004)?

  • 表示该磁力已经在 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 网盘的服务条款。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages