Flexget 配置自动获取 free 种子

一、需求

上次文章中配置好 Flexget 自动获取种子之后,笔者并没有长期使用,其中的一个原因的就是 RSS 获取到的种子难以控制与筛选,很难获得想要的结果(免费种子),如果一直开着的话很容易下载量暴增却鲜有上传,长期下来会导致被站点因分享率不合格而封号。显然,这是个很严重的问题,因此,经过一段时间的摸索,笔者决定重新配置 Flexget 来高效地从站点获得免费种子。

二、Nexusphp 插件

Nexusphp 插件是笔者在各个教程中最常见的用来获取免费种子的插件,其原理是通过 RSS 链接获取来自服务器提供的种子列表,然后依次爬取列表中的各个种子的详情页面,通过对获得的 html 页面的解析自动判断该种子是否为免费种子(当然不仅仅这一个,nexusphp 提供了非常多的功能),最后将过滤出的满足条件的种子提交给下载客户端自动下载。

然而笔者在实际使用 nexusphp 部署之后效果并不好,往往数天时间(甚至数周)都无法获得一个免费种子。经过排查,发现并不是 nexusphp 没有正常工作,而是通过 RSS 连接获得种子列表中,服务器几乎不会提供任何免费种子,自然 nexusphp 也无法从中选出我们所希望的种子,而一些站点(如馒头)并不会在 RSS 链接中增加免费种子的选项,因此通过 RSS 链接自动获取免费种子的方式就显得非常低效,甚至可以说是完全不可用。

三、html_rss 插件

html_rss 插件 是 madwind 开发的 flexget_qbittorrent_mod 中的一个插件,该插件不同于 nexusphp 的地方在于采用解析指定 html 页面的方式来获取种子,最常见的用法就是解析站点默认的种子页面(torrents.php),许多站点在这个页面上都会默认置顶热种、免费种、促销种等等,对于筛选种子非常有帮助。缺点就是解析 html 页面的方式较为复杂,在 Flexget 中每个种子的 entry 也需要手动添加属性,相较于 rss 直接解析 XML 文件的方式麻烦了许多,需要我们手动编写 CSS 选择器来获得想要的种子属性便于筛选。

3.1 安装

首先,安装该插件的过程就相对比较复杂,因此负责该项目 madwind 的仓库中给出了 docker 镜像以及生成镜像的文件,可以直接无缝拉取到 docker 中运行,然而笔者个人不是很喜欢为了 flexget 一个程序单独建立一个那么重的虚拟环境,因此还是采取手动安装的方法。

通过分析镜像文件,我们很容易就可以大致分析出要运行该插件的所需的依赖。类似上一篇文章,笔者仍然使用 conda 来新建一个 python 环境:

conda create -n python-3-10 python=3.10.4

然后切换到刚刚新建的环境,安装 pip 和一些工具:

conda activate python-3-10
python -m pip install -U pip setuptools

接着,根据我们在 Dockerfile 中得到的依赖,逐个安装包:

pip install flexget chardet deluge-client python-telegram-bot==12.8 baidu-aip pillow pandas matplotlib fuzzywuzzy python-Levenshtein

并非所有包都是必须的,比如你已使用了 qb,就不必再安装 deluge-client。

如果安装环境是 python 3.10.4,那么安装过程应该不会报错。接着,为了测试 flexget 能否正常运行,在命令行键入 flexget check,笔者此处报告了如下的 Warning:

C:\Users\Username\anaconda3\envs\python-3-10\lib\site-packages\requests\__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.9) or chardet (5.0.0)/charset_normalizer (2.0.12) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "

根据警告信息可以 urllib3 或 chardet 或 charset_nomalizer 版本与所需的不一致,因此需要安装合适的版本,此处可以直接阅读发生警告的源代码处,其中有版本要求相关的信息。经查,是 chardet 版本过高(源代码中要求小于 5.0),因此重新安装 4.0 版本的 chardet:

pip install chardet==4.0.0

完成之后可以重新执行 flexget check,如果 flexget 的配置文件与环境均没有问题即可通过测试,命令行显示 Config passed check。至此,对 flexget 的安装完成。

3.2 配置 Flexget

为了让 Flexget 能够正确地筛选免费种子,需要手动编写 CSS 选择器选择促销标签。html_rss 编写的整体框架与 nexusphp 以及其他插件类似,下面是对其各个字段的详细介绍:

首先,url 字段为获取站点种子的网页链接(一般为torrents.php,不要和 RSS 链接的 torrentrss.php 混淆)。user-agent 字段为浏览器标识。cookie 即为登录站点所需的 cookie。此外相较于 nexusphp ,多了一个字段 param,该字段用于往种子的下载链接后附加 passkey。

tasks:
  M-Team-1:
    # 馒头站任务 1
    html_rss:
      url: https://kp.m-team.cc/torrents.php
      user-agent: '{? headers.user_agent ?}'
      cookie: 'your-cookie'
      #以 "&" 开头时附加在下载链接之后,否则使用 urljoin 方式拼接
      params: '&passkey=xxxxxxxxxxxxxxxxxxxxx'

html_rss 插件会根据上述信息自动访问指定站点,并得到一个包含种子列表的网页文件,下面我们就需要编写 CSS 选择器来解析网页,选择我们所需要的种子。

首先是根组件选择器,它将对网页文件进行第一次匹配,一般用来选中网页中的种子表项(右键网页->检查 可以对照 CSS 选择器的描述找到网页中对应的内容)。关于 CSS 选择器的内容不在此赘述,互联网上有很多详细的介绍。

      #组件选择器
      root_element_selector: '#form_torrent > table > tbody > tr.sticky_top'

在根组件选择器之后我们得到的是一系列匹配成功的种子表项,下面我们还需要从这些表项中获得种子的标题,下载链接,以及促销信息,这一过程可以通过检查网页的 CSS 嵌套顺序来完成,比如说在每个表项中,种子的促销信息按从外向内的顺序如图所示:

css 选择器顺序

在下述配置文件的 promotion 部分,可以看到选择器的选择顺序是和上图中层次分析的顺序是一一对应的,在配置文件中我们一共分析了三种信息,分别为标题(title),下载链接(URL)以及促销信息(promotion):

      fields:
        #标题(必选)
        #为 entry 增加 title 属性 值为 匹配到的组件下的 title 属性
        title:
          #二次选择器
          element_selector: 'a[href*="details.php"]'
          #提取属性
          attribute: title
        #链接(必选)
        #为 entry 增加 url 属性 值为 匹配到的组件下的 href 属性
        url:
          element_selector: 'a[href*="download.php"]'
          attribute: href
        #除title url属性为必选,其它可自由添加用于过滤
        #示例 增加促销信息
        #为 entry 增加 promotion 属性 值为 匹配到的组件下的 alt 属性
        promotion:
          element_selector: 'td.torrenttr > table.torrentname > tbody > tr.sticky_top > td.embedded > img.pro_free'
          attribute: alt

对网页分析完成之后,最困难的部分就已经结束了,接下来只需要过滤出免费种子,然后自动下载即可:

    #如果 promotion 带有 Free 则接受
    if:
      - promotion in ['Free']: accept
    seen:
      fields:
        - url
    template:
      - qb

    download: path

至此,Flexget 的配置完成。执行 Flexget execute 即可进行一次对免费种子的自动过滤和下载,配合计划任务即可实现全自动对免费种子的下载。

四、总结

笔者花了相当一段时间才成功拉取出免费种子,中间踩了不少坑(比如如何避免馒头站触发 CF 五秒盾),虽然现在能够成功拉取免费种子了,但由于非 RSS 获得的种子信息实在是太少,尚不能进行一些细化的操作(如选择指定大小的种子下载),还需要后续的适配与优化。工作中间也考虑过是不是因为笔者自己操作 nexusphp 插件有误才导致不能获取免费种子,这一点尚未得到结论,如果有建议欢迎提出与指正。

发表回复

您的电子邮箱地址不会被公开。