qBittorrent RSS 自动下载规则如何配置与克隆?
【免费下载链接】qBittorrentqBittorrent BitTorrent client项目地址: https://gitcode.com/GitHub_Trending/qb/qBittorrent
qBittorrent 内置了 RSS 自动下载器:它监听你添加的 RSS 订阅源,当新文章的标题匹配某条自动下载规则(auto-download rule)时,自动把文章里的 torrent 链接加入下载队列。这篇文章基于仓库中的 WebAPI 实现和变更说明,讲一条可以照着执行的路径:通过 WebUI 的api/v2接口完成「添加订阅源 → 配置规则 → 启用自动处理 → 验证匹配」,并演示如何用rss/cloneRule端点克隆一条现有规则。前提是你已经能访问 qBittorrent 的 WebUI(默认端口 8080,见 preferences.cpp 中WebUI/Port的默认值),并且已具备 WebUI 的登录凭据:auth/login成功后使用会话 Cookie,或使用 Basic auth(WebAPI_Changelog.md 2.15.0 起支持),下文以curl的-c/-b保存和携带 Cookie 为例。
所有端点的实现集中在 rsscontroller.cpp,接口前缀固定为/api/v2/(见 webapplication.cpp 中的API_PATH)。下文每条命令里http://127.0.0.1:8080需要替换为你实际的 WebUI 地址。
1. 先添加 RSS 订阅源
规则通过affectedFeeds字段与订阅源 URL 绑定,所以第一步是确保目标源已经存在于 RSS 会话中。
curl -c /tmp/qb.txt -d "username=你的WebUI用户名" -d "password=你的WebUI密码" \ http://127.0.0.1:8080/api/v2/auth/login curl -b /tmp/qb.txt -X POST -d "url=https://example.org/feed.rss" \ http://127.0.0.1:8080/api/v2/rss/addFeedrss/addFeed接受url、path、refreshInterval三个参数(见 rsscontroller.cpp 中addFeedAction)。path为空时订阅项以 URL 本身作为显示路径;refreshInterval为刷新间隔的秒数,小于 0 时按 0 处理。订阅源 URL 变化后(rss/setFeedURL),rss_autodownloader.cpp 中handleFeedURLChanged会自动把各规则和待处理任务里记录的旧 URL 替换成新 URL,不需要手动改规则。
如果只需要按名称列出当前已有的订阅源,也可以调rss/items端点,它返回以订阅源树为结构的 JSON。
2. 创建规则:rss/setRule 的完整字段
rss/setRule只要求两个参数:ruleName与ruleDef,其中ruleDef是一段 JSON 字符串,由RSS::AutoDownloadRule::fromJsonObject解析(rss_autodownloadrule.cpp)。JSON 的键名与序列化逻辑一一对应:
| 键 | 含义(按源码行为) |
|---|---|
enabled | 规则是否启用,未启用的规则在匹配阶段被跳过 |
priority | 优先级,规则列表按该值排序 |
useRegex | 匹配表达式使用正则;为false时表达式按通配符(*/?)处理 |
mustContain | 多个表达式用空格分隔,标题命中其中任一个即算命中 |
mustNotContain | 标题必须全部不命中这些表达式,任一命中即拒绝 |
episodeFilter | 剧集过滤,格式count x episode,源码中用^(\\d{1,4})x(...;$)解析,如10 x *表示“已匹配 10 集之后不再匹配” |
affectedFeeds | 该规则作用的订阅源 URL 列表 |
ignoreDays | 忽略最近 N 天内的文章,克隆出的规则会重置该状态 |
lastMatch | 上次匹配时间(RFC 2822 格式),一般不用手工指定 |
smartFilter | 是否使用智能剧集过滤,默认按s01e01、01x01、2017.01.01、01.01.2017四种剧集编号格式去重(见computeSmartFilterRegex) |
previouslyMatchedEpisodes | 已匹配过的剧集列表,用于去重,一般不用手工指定 |
torrentParams | 命中后下载任务的参数,按torrents/add的参数结构填写,例如savePath、category、addStopped |
下面是一个可直接执行的示例:规则名为ShowA,只作用于https://example.org/feed.rss这一个订阅源,标题含ShowA且不含Sample时命中,下载进Series分类、以暂停状态添加(addStopped: true):
curl -b /tmp/qb.txt -X POST \ -d 'ruleName=ShowA' \ --data-urlencode 'ruleDef={"enabled":true,"priority":0,"useRegex":false,"mustContain":"ShowA","mustNotContain":"Sample","episodeFilter":"10 x *","affectedFeeds":["https://example.org/feed.rss"],"ignoreDays":0,"smartFilter":true,"torrentParams":{"category":"Series","savePath":"/downloads/series","addStopped":true}}' \ http://127.0.0.1:8080/api/v2/rss/setRule注意ruleDef里必须用--data-urlencode传,避免 JSON 中的空格和引号破坏表单编码。规则写入后,rss_autodownloader.cpp 中setRule会立即持久化(新规则同步store()),并重置处理队列。
3. 克隆规则:rss/cloneRule
当第二条规则与现有规则大部分字段相同、只是匹配词或下载目录不同时,可以用rss/cloneRule复制而不是重新填一遍ruleDef。该端点自 WebAPI 2.15.4 加入(见 WebAPI_Changelog.md),要求sourceName和cloneName两个参数:
curl -b /tmp/qb.txt -X POST \ -d "sourceName=ShowA" -d "cloneName=ShowB" \ http://127.0.0.1:8080/api/v2/rss/cloneRule克隆的行为由 rss_autodownloader.cpp 中AutoDownloader::cloneRule定义,有四个固定结果,写下来方便你验证:
- 源规则的所有匹配与下载参数被完整复制,新规则名为
cloneName; - 克隆出的规则默认禁用(
setEnabled(false)),源码注释说明这是为了避免误下载; - 清空
previouslyMatchedEpisodes,让新规则可以对所有集数重新匹配; - 清空
lastMatch,让新规则可以匹配旧文章。
两个失败条件(函数直接返回false,HTTP 层仍返回空结果):sourceName不是已存在的规则,或cloneName与现有规则重名。克隆成功后,用第 4 步的rss/rules确认新规则存在且enabled为false,然后按你的需要重新setRule打开。
除克隆外,同一控制器还提供rss/renameRule(ruleName+newRuleName)和rss/removeRule(ruleName),可用于克隆后清理不需要的原规则。
4. 启用自动处理并验证
规则匹配本身不需要额外开关,但自动下载任务由AutoDownloader的“处理”开关控制(源码中为EnableProcessing设置项)。GUI 用户在 RSS 面板的自动下载器里勾选“启用处理”;WebUI 对应入口在 RSS 自动下载器页面。处理开启后,AutoDownloader会在 torrent 会话恢复完成后自动启动,开始消费处理队列。
验证分两层:
- 确认规则与状态。调用
rss/rules(无参数,返回{规则名: 规则定义}的 JSON 对象):
curl -b /tmp/qb.txt http://127.0.0.1:8080/api/v2/rss/rules检查输出中是否包含ShowA、ShowB,以及enabled、affectedFeeds、torrentParams是否与你写入的一致。
- 确认规则能命中现有文章。
rss/matchingArticles要求ruleName参数,对规则绑定的每个订阅源逐篇比对标题,返回{订阅源名: [命中的文章标题]}:
curl -b /tmp/qb.txt -d "ruleName=ShowA" http://127.0.0.1:8080/api/v2/rss/matchingArticles如果返回对象为空,说明当前文章标题不满足mustContain/mustNotContain条件,或affectedFeeds里的 URL 与实际订阅源 URL 不一致;此时回到第 2 步调整表达式即可。命中后,实际下载发生在订阅源刷新拉取到新文章时:AutoDownloader会向日志输出RSS article '<标题>' is accepted by rule '<规则名>'. Trying to add torrent...,任务按torrentParams加入下载列表,对应文章随后被标记为已读。你可以用 RSS 面板查看“已读”状态,或用torrents/info确认新任务。
5. 备份与迁移:rss/exportRules / rss/importRules
同一套规则需要在另一台 qBittorrent 上复用时,走 JSON 导出/导入(自 WebAPI 2.16.2 加入,见 WebAPI_Changelog.md):
curl -b /tmp/qb.txt http://127.0.0.1:8080/api/v2/rss/exportRules -o rules.json curl -b /tmp/qb.txt -X POST \ -F "rulesFile=@rules.json" \ http://127.0.0.1:8080/api/v2/rss/importRulesrss/exportRules返回application/json文件(文件名rss-downloader-rules.json),内容结构与rss/rules相同;rss/importRules只接受POST,且要求请求中恰好一个规则文件(参数名rulesFile),文件内容不是合法 JSON 时返回 400 级别的 BadParams 错误(由RSS::ParsingError抛出)。导入会把文件中的每条规则写入目标实例,同名规则会被覆盖。注意affectedFeeds里记录的是订阅源 URL,导入前如果目标机上的订阅源 URL 不同,规则不会命中,需要先rss/addFeed或调整规则的affectedFeeds。
限制与边界
- 匹配只针对文章标题(
AutoDownloadRule::matches比较的是文章 data 中的标题字段),正文内容不参与规则匹配; - 处理开关关闭时,队列不会被消费,规则仍然存在但不会触发下载;
rss/setRule对已有同名规则是覆盖更新而不是新增,误操作前建议先rss/rules备份当前定义,或用rss/exportRules整体导出;rss/cloneRule不提供“覆盖已有克隆名”的选项,目标名已存在即失败;- 旧版本(WebAPI 2.15.4 之前)没有
rss/cloneRule端点,需要升级后使用,或手工setRule复制定义。
除 API 路径外,GUI 的 RSS 面板(automatedrssdownloader.cpp)和 WebUI 的 RSS 自动下载器页面(rssDownloader.html)提供同样的规则管理操作:右键菜单中的重命名/克隆入口(见 contextmenu.js)与本文的 API 端点一一对应,克隆入口只在选中单条规则时显示。
【免费下载链接】qBittorrentqBittorrent BitTorrent client项目地址: https://gitcode.com/GitHub_Trending/qb/qBittorrent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考