![]()
流川千寻(Ryukawa Chihiro) - BRYBT小小刷流姬 - 只会下载(和删除)首页Top且Free的种子。
最初是想起来的时候手动刷新一下看看有没有新的top且free的种子,后面写了个小爬虫每121秒帮我看一次新种子,后面懒得手动增删种子了决定交给流川千寻来完成。
所以流川千寻是一只简单纯粹的佛系刷流姬。环境准备:
pip install -r requirements.txt这一步可以跳过。登录BYRBT,获取你的cookie:

开启BT客户端的Web用户界面,以qBittorrent为例(当前仅支持这一个客户端):
如果按图示设置ip则client_ip可以为http://127.0.0.1:8080

在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)
执行命令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删除种子及文件多少秒后文件仍在本地,才会强制删除本地文件。只有当forceDeleteFile为True时此项才会启用。默认值为15.0(s) |
15 |
当前支持两个策略,一个是佛系的TopAndFree策略(只下载TopAndFree)的种子,一个是狂暴模式的leechersAndSeeders策略(考虑所有免费的种子,更适合全站free一些)。
这两种策略不可共存。
每个种子都会依据其大小、是否Top、是否新Free、下载做种比得到一个评分。
依据种子评分动态增加或删除种子。
每个种子$s$都有一个评分,得分公式为:
\[score(s)=Size(s)\times Top(s)\times Time(s)\times Rate(s)\]其中$Size(s)$是种子大小得分,当前$Size(s)=1$(暂未考虑种子大小得分)。
其中$Top(s)$是种子TopFree情况的得分:
其中$Time(s)$是种子$s$的“Free时长”得分:
TopFree的种子很容易获取Free的时长(表现为网页端鼠标悬浮在置顶标签上就好);普通free的种子可以通过日志搜索获取(但目前发现的方法中一次只能搜索一个种子的相关信息,且需要用户达到一定的等级才能查看日志,因此决定抛弃)。
最终决定:
- 对于程序启动时的首次运行,$Time(s)=1$,此时程序会将“TopFree”、“Free”、“2xFree”这3类种子(每类最多一页)存入内存中;
对于后续的每次运行,
- 如果出现了不在内存中的Free新种:则$Time(s)=2$
- 如果出现了刚有做种者的种子(内存中信息为做种者为0,但现在有做种者了):则$Time(s)=2.5$
其中$Rate(s)$是种子$s$的下载做种比,计算公式为:
流川千寻会对所有她经手过的种子打上sc标签。流川千寻可以任意把玩带有sc标签的种子,包括“强制汇报”、“暂停下载”、“删除”等。
每次获取所有Free的种子(每个类别的种子最多一页)并计算其得分,若本地种子未在请求得到的页面里面则得分为$0$。
在未下载的种子中,得分$\geq 1$的种子将进入“待下载队列”。
待下载队列中的种子以得分高为优先、种子体积大为其次排序;本地具有sc标签的种子以得分低为优先、添加时间早为其次排序。
依次遍历待下载队列中的种子。对于待下载的种子$s$,删除尽可能少的得分不高于这个种子$\frac15$的种子。
流川千寻会对种子打上如下标签:
sc:所有的TopFree的(或流川千寻工作期间TopFree过的)种子都会被打上sc标签。这些种子将会被认为不是长期做种的种子,可能会随着过期策略被删除。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 一些基础工具(函数)
forceDeleteFile_maxWait秒后文件仍未被删除切手动删除失败,则启动一个后台进程监控文件的状态,当文件可以被释放时删除并结束这个线程