概况

家里的NAS是我主要文件存储系统,Aria2作为日常常用下载工具也一同部署在上面。

该Aria2以docker容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过openwrt对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把Aria2设置为直连方式下载。

aria2NG
aria2NG

直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到Aria2,是无法被正确下载的。每次遇到这种情况,我只能先通过浏览器把种子文件下载下来后,再通过Aria2NG发种子发送到Aria2进行下载,显得比较繁琐。Aria2NG也有一个问题:每次只能上传一个种子。如果有多个种子文件,操作就显得相当机械繁琐而无趣。我想,能不能一步到位直接把下载好的种子文件统一推送到Aria2自行下载呢?搜索了一下,果然有老哥为此建了个项目,该项目是通过xmlrpc的方式管理Aria2,但缺少密钥验证功能。因此我拿该大佬的项目改了一下,以支持密钥验证方式。有需要的朋友可以直接抄下作业。

实现我需求的思路主要是两个部分,第一部分是脚本处理,第二部分是系统快捷键的部署(我的是MacOS,win部分可能需要一些系统快捷键软件支持才能实现)。

批量提交BT文件到Aria2

脚本

import xmlrpc.client
import xmlrpc
import os
import argparse

def handle(s, btFile, token):
    print('handle bittorrent file: ', str(btFile))
    token = "token:" + token
    ret=s.aria2.addTorrent(token,xmlrpc.client.Binary(open(btFile, mode='rb').read()),[],{'pause':'true'})
    print("add bt: ",str(ret))
    waiting = s.aria2.tellWaiting(token,0, 1000,
                              ["gid", "totalLength", "completedLength", "uploadSpeed", "downloadSpeed", "connections",
                               "numSeeders", "seeder", "status", "errorCode", "verifiedLength",
                               "verifyIntegrityPending", "files", "bittorrent", "infoHash"])
    for w in waiting:
        gid=w['gid']
        if gid!=ret:
            continue
        #print(w['gid'],w['files'])
        # max-selection strategy
        maxLen=0
        maxFPath=''
        maxFIndex='0'
        for f in w['files']:
            #print(f['length'],f['path'])
            if int(f['length'])>maxLen:
                maxLen=int(f['length'])
                maxFPath=f['path']
                maxFIndex=f['index']
        print('max file: ',str(maxLen),maxFIndex,str(maxFPath))
        # max-selection strategy end
        cret=s.aria2.changeOption(token,gid,{'select-file':maxFIndex})# select multiple files example: 'select-file':'5,6,7,8'
        print('select file: ',cret)
        tret=s.aria2.tellStatus(token,gid)
        print('after selection: ', tret['files'][int(maxFIndex)-1])
        uret=s.aria2.unpause(token,gid)
        print('unpause: ',uret)
    print('over: ',str(btFile))



if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.description = 'bt批量导入aria2,并选择文件大小最大的文件进行下载'
    parser.add_argument("server", help="like: http://192.168.3.99:6800", type=str)
    parser.add_argument("token", help="验证密钥", type=str)
    parser.add_argument("dir", help="存放种子目录", type=str)
    args = parser.parse_args()
    s = xmlrpc.client.ServerProxy(args.server+"/rpc")
    flist=os.listdir(args.dir)
    for i in range(0, len(flist)):
        if flist[i].endswith(".torrent"):
            btFile = os.path.join(args.dir, flist[i])
            if os.path.isfile(btFile):
                handle(s,btFile, args.token)
    print("Done")

使用方法

把上述代码保存为bb2a.py,需要使用Python3运行。

帮助(Help):

python3 bb2a.py --help

启动(Start to Add):

python3 bb2a.py <server> <token> <bt-dir>

参数(parameters):

server      如(like): http://192.168.3.99:6800
token       验证密钥:设置在Aria2配置文件的密钥
bt-dir      bt文件的目录(the dir of your bittorrents)

例子(example):

python3 /path/to/bb2a.py http://192.168.1.100:6800 123456 /home/root/bts/

MacOS增加快捷指令

command + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。

新增快速指令1.png
新增快速指令1.png

按照下图方式创建快捷指令内容

新增快速指令2.png
新增快速指令2.png

参考shell内容如下,请按照自己配置情况修改相关参数。sleep 3是暂停3秒。后面的rm命令是顺便删除下载目录中的bt种子文件。

python3 /Users/ccchen/autobt/bb2a.py http://192.168.12.5:6800 123456 /Volumes/FAT12T/down2025/
sleep 3
rm -f  /Volumes/FAT12T/down2025/*.torrent

按窗口右上角的详情按钮,设置快捷指令的允许执行shell权限。

新增快速指令3.png
新增快速指令3.png

最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。

新增快速指令4.png
新增快速指令4.png

完结

到此,所有配置已完成。只要下载bt种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到aria2进行下载。同时会把下载目录中对应的种子清理掉。