写前废话

最近重新研究了一下离线下载,之前搭建过aria2的离线下载,用起来效果不错,可以实现aria2+rclone自动下载资源并上传到onedrive。最近又看到qbittorrent服务器版的,于是就有了这篇文章,下面将会详细记录踩过的坑和实现自动上传功能并自动删除种子及文件的过程


安装qBittorrent-nox

这里说一句,我下的是ubuntu[arm]版的,直接下的是可执行性程序,qbittorrent-nox4.5.1,点击下载

其他版本可以在下面链接下载对应的

https://github.com/userdocs/qbittorrent-nox-static/releases

可以直接在shell终端对应的目录下输入下列命令下载,也可以下载下来上传到服务器

wget "https://pan.imold.wang/aliyun/software/qbit/4.5.1/aarch64-qbittorrent-nox"


赋予qbit权限

chmod a+x aarch64-qbittorrent-nox


保留qbit后台

这里使用screen程序保持qbit后台活动

安装Screen

安装screen使qbittorrent保留后台

ubuntu输入命令

apt-get install screen


Screen创建会话

创建一个名为qbit的会话

screen -S qbit

创建了会话后回车,在这个会话中进入到下载qbit可执行程序的目录,输入下列命令启动qbittorrent

./aarch64-qbittorrent-nox

退出Screen会话窗口

按组合键:Ctrl+a+d, 即可退出screen窗口, 此时,程序仍在后台执行;


查看Screen会话

screen -ls


进入screen某个会话

输入:screen -r 程序进程ID/或者会话名, 返回程序执行进程;
例如,screen -r qbit

进入会话后可以按ctrl+c+k结束会话和窗口


窗口操作

Ctrl+a+w: 展示当前会话中的所有窗口;
Ctrl+a+c: 创建新窗口;
Ctrl+a+n: 切换至下一个窗口;
Ctrl+a+p: 切换至上一个窗口;
Ctrl+a+num: 切换至编号为num的窗口;
Ctrl+a+k: 杀死当前窗口;
Ctrl+a+k:关闭当前窗口,程序后台活动


删除某个会话

screen -S 进程号或者会话名 -X quit

qbit在后台运行后,就可以使用qbit的web ui了,默认端口8080,记得防火墙打开8080端口

默认地址为【http://你的ip:8080】,打开界面如下


修改语言

改成中文方式:左上角设置——>WEB UI——>Language改成中文简体后滑倒下面保存刷新即可


安装配置Rclone

关于rclone挂载的看我另一篇文章,点击直达


自动上传脚本

制作脚本

新建一个qb_auto.sh脚本,按照下面的修改成自己配置,可以下载我的脚本修改

#!/bin/bash
torrent_name=$1
content_dir=$2
root_dir=$3
save_dir=$4
files_num=$5
torrent_size=$6
file_hash=$7
qb_version="4.5.1"    # 改成你的qbit版本
qb_username="admin"    # qbit用户名
qb_password="adminadmin"    # qbit密码
qb_web_url="http://localhost:8080"    # qbit webui地址
leeching_mode="true"    # 吸血模式,true下载完成后自动删除本地种子和文件
log_dir="/root/qbauto"    # 日志输出目录
rclone_dest="onedrive"    # rclone配置的储存名
rclone_parallel="32"    # qbit上传线程,默认4
auto_del_flag="rclone"    # 添加标签或者分类来标识已上传的种子 v4.0.4+版本添加标签“rclone”,低版本通过添加分类“rclone”标识
# 改上面的那些参数即可

if [ ! -d ${log_dir} ]
then
        mkdir -p ${log_dir}
fi

version=$(echo $qb_version | grep -P -o "([0-9]\.){2}[0-9]" | sed s/\\.//g)

function qb_login(){
        if [ ${version} -gt 404 ]
        then
                qb_v="1"
                cookie=$(curl -i --header "Referer: ${qb_web_url}" --data "username=${qb_username}&password=${qb_password}" "${qb_web_url}/api/v2/auth/login" | grep -P -o 'SID=\S{32}')
                if [ -n ${cookie} ]
                then
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录成功!cookie:${cookie}" >> ${log_dir}/autodel.log

                else
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录失败!" >> ${log_dir}/autodel.log
                fi
        elif [[ ${version} -le 404 && ${version} -ge 320 ]]
        then
                qb_v="2"
                cookie=$(curl -i --header "Referer: ${qb_web_url}" --data "username=${qb_username}&password=${qb_password}" "${qb_web_url}/login" | grep -P -o 'SID=\S{32}')
                if [ -n ${cookie} ]
                then
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录成功!cookie:${cookie}" >> ${log_dir}/autodel.log
                else
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 登录失败" >> ${log_dir}/autodel.log
                fi
        elif [[ ${version} -ge 310 && ${version} -lt 320 ]]
        then
                qb_v="3"
                echo "陈年老版本,请及时升级"
                exit
        else
                qb_v="0"
                exit
        fi
}



function qb_del(){
        if [ ${leeching_mode} == "true" ]
        then
                if [ ${qb_v} == "1" ]
                then
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除成功!种子名称:${torrent_name}" >> ${log_dir}/qb.log
                elif [ ${qb_v} == "2" ]
                then
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                else
                        curl -X POST -d "hashes=${file_hash}&deleteFiles=true" "${qb_web_url}/api/v2/torrents/delete" --cookie ${cookie}
                        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除成功!种子文件:${torrent_name}" >> ${log_dir}/qb.log
                        echo "qb_v=${qb_v}" >> ${log_dir}/qb.log
                fi
        else
                echo "[$(date '+%Y-%m-%d %H:%M:%S')] 不自动删除已上传种子" >> ${log_dir}/qb.log
        fi
}

function rclone_copy(){
        if [ ${type} == "file" ]
        then
                rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file  ${log_dir}/qbauto_copy.log "${content_dir}" ${rclone_dest}:/qbit/)
        elif [ ${type} == "dir" ]
        then
                rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file ${log_dir}/qbauto_copy.log "${content_dir}"/ ${rclone_dest}:/qbit/"${torrent_name}")
        fi
}

function qb_add_auto_del_tags(){
        if [ ${qb_v} == "1" ]
        then
                curl -X POST -d "hashes=${file_hash}&tags=${auto_del_flag}" "${qb_web_url}/api/v2/torrents/addTags" --cookie "${cookie}"
        elif [ ${qb_v} == "2" ]
        then
                curl -X POST -d "hashes=${file_hash}&category=${auto_del_flag}" "${qb_web_url}/command/setCategory" --cookie ${cookie}
        else
                echo "qb_v=${qb_v}" >> ${log_dir}/qb.log
        fi
}

if [ -f "${content_dir}" ]
then
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型:文件" >> ${log_dir}/qb.log
   type="file"
   rclone_copy
   qb_login
   qb_add_auto_del_tags
   qb_del
#   rm -rf ${content_dir}
elif [ -d "${content_dir}" ]
then 
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型:目录" >> ${log_dir}/qb.log
   type="dir"
   rclone_copy
   qb_login
   qb_add_auto_del_tags
   qb_del
#   rm -rf ${content_dir}
else
   echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未知类型,取消上传" >> ${log_dir}/qb.log
fi

echo "种子名称:${torrent_name}" >> ${log_dir}/qb.log
echo "内容路径:${content_dir}" >> ${log_dir}/qb.log
echo "根目录:${root_dir}" >> ${log_dir}/qb.log
echo "保存路径:${save_dir}" >> ${log_dir}/qb.log
echo "文件数:${files_num}" >> ${log_dir}/qb.log
echo "文件大小:${torrent_size}Bytes" >> ${log_dir}/qb.log
echo "HASH:${file_hash}" >> ${log_dir}/qb.log
echo "Cookie:${cookie}" >> ${log_dir}/qb.log
echo -e "-------------------------------------------------------------\n" >> ${log_dir}/qb.log

默认上传到你挂在储存的/share/qbit目录下,例如我用的onedrive,文件下载完成后会自动下载到onedrive /share/qbit目录下,需要修改路径的修改脚本里的rclone_copy函数的下面两处内容,如下:

将脚本上传到你的服务器/root目录下,其他目录也可以,自己记住


赋予脚本执行权限

给脚本执行权限命令,下面命令中/root换成你脚本放置的位置

chmod a+x /root/qb_auto.sh

可以到脚本目录下执行一次脚本,日志log默认输出目录/root/qbauto

./qb_auto.sh


配置qbit自动上传

来到qbit设置,下载选项,找到torrent完成时运行外部程序,勾选,填入下面的命令,/root/qb_auto.sh是我脚本的地址,改成你自己的,最后保存即可

bash /root/qb_auto.sh  "%N" "%F" "%R" "%D" "%C" "%Z" "%I"


到此已经实现了自动上传的功能,可以下个磁力试试啦

qbit官方的web ui没有适配移动端,下面介绍一下如何给qbit换个web ui主题


qbit更换主题

这里推荐两款主题

一个vuetorrent,github地址,博客网盘直接点击下载

一个qb-web,github地址,博客网盘直接点击下载

建议qb-web吧,vuetorrent每次换个设备就要重新设置语言很麻烦

下载到服务器上,解压,进入public目录的父目录

然后复制路径,来到上面qbit设置,WEB UI这里,找到使用备用Web UI这里,勾选,然后文件路径改成刚刚复制的

改好的qb-web效果如下


ok,总算码完了,本章就到此结束了,希望给你带来帮助。


转载标明出处
本文链接:https://imold.wang/technology/server/2350.html