LetMeFly666 / BYRBT_RyukawaChihiro

流川千寻(Ryukawa Chihiro) - BRYBT小小刷流姬 - 只会下载首页TopFree的种子
https://ryukawachihiro.letmefly.xyz/
MIT License
2 stars 0 forks source link
Logo

BYRBT_RyukawaChihiro

流川千寻(Ryukawa Chihiro) - BRYBT小小刷流姬 - 只会下载(和删除)首页Top且Free的种子。

前言

BYRBT是什么? 大概就是一个只有教育网/外网的ipv6可以访问的种子网站,里面有很多ZiYuan。
为什么要刷流?
  1. 有上传量才能愉快地下载;
  2. 上传量达4T可永久保留账号;
  3. 看着上传量蹭蹭往上涨,それでいい。
为何重造轮子?

最初是想起来的时候手动刷新一下看看有没有新的top且free的种子,后面写了个小爬虫每121秒帮我看一次新种子,后面懒得手动增删种子了决定交给流川千寻来完成。

所以流川千寻是一只简单纯粹的佛系刷流姬。
为什么起这个名字? 因为我想(bushi

如何使用

  1. 环境准备:

    1. 安装好Python:python.org直接下载无脑安装即可
    2. 安装所需包:pip install -r requirements.txt
    3. 下载源代码
    4. 安装qBittorrent(当前支持≥v4.1.x,低版本可能有部分api无法得到完全支持,推荐v4.6.5)
  2. 这一步可以跳过。登录BYRBT,获取你的cookie:

    获取cookie

  3. star本仓库,要不然,要不然流川千寻就哭给你看!star数

  4. 开启BT客户端的Web用户界面,以qBittorrent为例(当前仅支持这一个客户端):

    如果按图示设置ip则client_ip可以为http://127.0.0.1:8080

    qbittorrent web settings

  5. config目录下新建文件secret.py,输入以下内容(可参考配置说明部分进行配置):

    byrbt_username = 'Tisfy'             # BYRBT的账号
    byrbt_password = 'letmefly.xyz'      # BYRBT的密码
    client_ip = 'http://127.0.0.1:8080'  # 被控制的客户端的web ip
    client_username = 'RyukawaChihiro'   # bt客户端web的用户名
    client_password = '666'              # bt客户端web的密码
    maxDiskUsage = 525.25                # 最大磁盘空间使用量(单位GB)
  6. 执行命令python main.py,开始愉快地刷流吧。

配置说明

参数 类型 描述 示例
cookie 可选 string byrpt网页端的cookie,可参考如何使用第2步获取。指定cookie可以减少一次登录,若不指定或所指定cookie已过期,流川千寻会依据账号密码登录并将cookie保存在配置文件中 'eyJ0eXA45454jkjsiu...'
byrbt_username string BYRBT的账号 'Tisfy'
byrbt_password string BYRBT的密码 'letmefly.xyz'
client_ip string qBittorrent客户端web ui的地址,可参考如何使用第4步进行配置 'http://127.0.0.1:8080'
client_username string qBittorrent客户端web ui的用户名,可参考如何使用第4步进行配置 'RyukawaChihiro'
client_password string qBittorrent客户端web ui的密码,可参考如何使用第4步进行配置 '666'
maxDiskUsage float 为TopFree的种子预留的最大空间(超过此空间的种子将依据一定的策略进行下载或增删),单位GB。请确保预留足够的空间 525.25
savePath 可选 string 文件要保存到的位置。若不选,则将保存在客户端中设置的默认位置 ''
refreshTime 可选 integer 每隔多长时间查询一次是否有新种子,单位秒。若不选,则默认121s访问一次byrpt 121
forceDeleteFile 可选 boolean 是否监控文件是否删除成功。如果True,则forceDeleteFile_maxWait秒后文件仍然在磁盘上的话,开始调用系统命令强制删除本地文件。原因见#3。若勾选,请确保种子文件在本机;默认值为True True
forceDeleteFile_maxWait 可选 float 调用种子客户端api删除种子及文件多少秒后文件仍在本地,才会强制删除本地文件。只有当forceDeleteFileTrue时此项才会启用。默认值为15.0(s) 15

运行逻辑

当前支持两个策略,一个是佛系的TopAndFree策略(只下载TopAndFree)的种子,一个是狂暴模式的leechersAndSeeders策略(考虑所有免费的种子,更适合全站free一些)。

这两种策略不可共存。

leechersAndSeeders(做种下载比)

策略总述

每个种子都会依据其大小、是否Top、是否新Free、下载做种比得到一个评分。

依据种子评分动态增加或删除种子。

评分策略

每个种子$s$都有一个评分,得分公式为:

$$score(s)=Size(s)\times Top(s)\times Time(s)\times Rate(s)$$

其中$Size(s)$是种子大小得分,当前$Size(s)=1$(暂未考虑种子大小得分)。

其中$Top(s)$是种子TopFree情况的得分:

  1. 若种子$s$不是free,则$Top(s)=0$;
  2. 若种子$s$是free,则$Top(s)=1$;
  3. 若种子$s$是2xfree,则$Top(s)=2$;
  4. 若种子$s$是Topfree,则$Top(s)=5$;
  5. 若种子$s$是Top2xfree,则$Top(s)=10$;

其中$Time(s)$是种子$s$的“Free时长”得分:

TopFree的种子很容易获取Free的时长(表现为网页端鼠标悬浮在置顶标签上就好);普通free的种子可以通过日志搜索获取(但目前发现的方法中一次只能搜索一个种子的相关信息,且需要用户达到一定的等级才能查看日志,因此决定抛弃)。

最终决定:

  • 对于程序启动时的首次运行,$Time(s)=1$,此时程序会将“TopFree”、“Free”、“2xFree”这3类种子(每类最多一页)存入内存中;
  • 对于后续的每次运行,

    1. 如果出现了不在内存中的Free新种:则$Time(s)=2$
    2. 如果出现了刚有做种者的种子(内存中信息为做种者为0,但现在有做种者了):则$Time(s)=2.5$

其中$Rate(s)$是种子$s$的下载做种比,计算公式为:

增删策略

流川千寻会对所有她经手过的种子打上sc标签。流川千寻可以任意把玩带有sc标签的种子,包括“强制汇报”、“暂停下载”、“删除”等。

每次获取所有Free的种子(每个类别的种子最多一页)并计算其得分,若本地种子未在请求得到的页面里面则得分为$0$。

在未下载的种子中,得分$\geq 1$的种子将进入“待下载队列”。

待下载队列中的种子以得分高为优先、种子体积大为其次排序;本地具有sc标签的种子以得分低为优先、添加时间早为其次排序。

依次遍历待下载队列中的种子。对于待下载的种子$s$,删除尽可能少的得分不高于这个种子$\frac15$的种子。

TopAndFree

标签判定

流川千寻会对种子打上如下标签:

  1. sc:所有的TopFree的(或流川千寻工作期间TopFree过的)种子都会被打上sc标签。这些种子将会被认为不是长期做种的种子,可能会随着过期策略被删除。
  2. toDel:在TopFree过的种子中,由于免费时长到期等原因,已经不是TopFree的种子。这些种子将优先被删除。如果你不想要某个种子了,你可以手动将其添加toDel标签,流川千寻会在合适的时间删除它。

种子判定

种子判定每隔refreshTime秒进行一次。

判定时访问一次byrpt,返回所有的TopFree种子,包括:种子id、free剩余时长、种子大小、做种者数、下载者数、种子hash。

依据TopFree种子的hash,筛选客户端中的种子。对客户端中所有已经存在的TopFree的种子打一次sc标签。

筛选客户端中所有具有sc标签的种子。如果已经不在TopFree中,则将被打上toDel标签。对于所有具有sc标签的种子,统计总磁盘占用。

筛选客户端中所有具有toDel标签的种子。

若有TopFree的种子还未下载,则进入种子下载

种子下载

对所有待下载的种子,执行下面操作:

当前磁盘总占用, 需下载种子, 具有toDel标签的种子 = 种子判定()
需下载种子.sortBy(有做种者的优先,无做种者的其次。对于有做种者:下载者数/做种者数越大越优先)
具有toDel标签的种子.sortBy(种子添加时间)  # 下载较早的种子优先
for seed in 需下载种子:
    tryToDownload(seed)

def tryToDownload(seed):
    if maxDiskUsage - 当前磁盘总占用 + sum(thisSeed.size for thisSeed in 具有toDel标签的种子) < seed.size:
        return  # “最大占用 - 已经使用 + 可释放” 仍然小于待下载种子,放弃下载
    # 假如按照下载时间从早到晚的顺序种子大小为[1G, 2G, 7G, xxx],需要释放的空间为8G
    # 则(1+2+7)=10≥8,之后从后往前回滚,10-7<8,10-2=8≥8(不删2),8-1<8,最终决定删除[1G, 7G]的种子
    真正要被删除的种子 = 下载早的优先_直至释放足够空间_从后往前回滚_移除可以不被删的种子()
    for 这次被删除的种子 in 真正要被删除的种子:
        当前磁盘总占用 -= 这次被删的种子.size
        控制客户端删除种子(这次被删的种子)
    reallyDownload(seed)

def reallyDownload(seed):
    当前磁盘总占用 += seed.size
    控制客户端下载种子_并_打上sc标签(seed)

开发文档

如果你想成为流川千寻的一部分(想贡献代码),你可以阅读开发文档,流川千寻会非常地高兴。

.
├─config                配置目录
├─docs                  文档
└─src                   源码
    ├─client            控制种子客户端的行为
    │  └─qBittorrent    控制qBittorrent下载、删除种子等。如果你想写一个能控制LetBittorrent客户端的功能,可以参考qBittorrent的api接口写一个
    ├─configer          读取和处理配置文件
    ├─controller        策略。当前策略是Readme中所说的FreeTop策略。你也可以新写一个策略
    ├─getter            获取种子信息
    │  └─getBYR         获取BYRBT的种子信息。如果你想获取TJUPT等的种子信息,你也可以参考getBYR的api接口写一个
    ├─logger            日志处理
    └─utils             一些基础工具(函数)

TODO

总体需求

具体细节

End