qbittorrent配合rclone的自动上传googledrive或者onedrive的方案 使用标签标记 with tag
我们知道qbittorrent在使用的时候有时候是用来玩pt的，有时候是为了拿来下载一些视频的，但是有些视频想要传到googledrive上去，有些我们只是想要做个pt玩玩，因此不是所有的视频都想要上传 ::aru:cheer:: 本文就基于这个做了一个小的shell脚本，对于没有特殊标记tag的种子不上传，有特殊标记tag的种子就可以上传，然后更换标记tag为完成，你可以对所有完成的数据种子进行删除或者其他操作，不占用硬盘空间 ::aru:knife::1.配置方法安装依赖环境jq - 一般都有装# debian 或者是 ubuntu下 apt-get install -y jq # centos下 yum install -y jq找一个地方存放脚本 ::aru:discovertruth::我一般选择的是/home/qb_auto_rclone.sh脚本内容如下 -- 需要自己修改前面的一部分配置数据 -- 点击展开：或者使用这个 qb_auto_rclone.zip 下面代码好像格式化之后有问题，最好还是用压缩包吧[collapse status="false" title="qb_auto_rclone.sh"]#!/bin/sh qb_version="4.2.1" qb_username="用户名" qb_password="密码" qb_web_url="http://127.0.0.1:2017" log_dir="/home/tujidu/data/qbauto" rclone_dest="BG:" # rclone destination关键字 运行rclone config查看name字段即可 rclone_parallel="32" # rclone上传线程 默认4 from_dc_tag="/Upload" # 上传后的相对根目录，可为空 # 下面的也可以自定义，但是推荐不改动 unfinished_tag="【待上传云端】" # 这个是手动设置某些tag，因为有用才上传 uploading_tag="【正在上传】" finished_tag="【结束】" noupload_tag="无效-不上传" 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 } # 先移除指定tag，后增加自己的tag function qb_change_hash_tag(){ file_hash=$1 fromTag=$2 toTag=$3 if [ ${qb_v} == "1" ] then # 这里是添加某些tag的方法 curl -s -X POST -d "hashes=${file_hash}&tags=${fromTag}" "${qb_web_url}/api/v2/torrents/removeTags" --cookie "${cookie}" curl -s -X POST -d "hashes=${file_hash}&tags=${toTag}" "${qb_web_url}/api/v2/torrents/addTags" --cookie "${cookie}" elif [ ${qb_v} == "2" ] then curl -s -X POST -d "hashes=${file_hash}&category=${fromTag}" "${qb_web_url}/command/removeCategories" --cookie ${cookie} curl -s -X POST -d "hashes=${file_hash}&category=${toTag}" "${qb_web_url}/command/setCategory" --cookie ${cookie} else echo "qb_v=${qb_v}" fi } function rclone_copy(){ torrent_name=$1 torrent_hash=$2 torrent_path=$3 # tag = 待上传 # 这里执行上传程序 if [ -f "${torrent_path}" ] then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型：文件" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型：文件" >> ${log_dir}/qb.log type="file" elif [ -d "${torrent_path}" ] then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型：目录" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 类型：目录" >> ${log_dir}/qb.log type="dir" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未知类型，取消上传" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未知类型，取消上传" >> ${log_dir}/qb.log # tag = 不上传 qb_change_hash_tag ${torrent_hash} ${unfinished_tag} ${noupload_tag} return fi # tag = 上传中 qb_change_hash_tag ${torrent_hash} ${unfinished_tag} ${uploading_tag} # 执行上传 if [ ${type} == "file" ] then # 这里是rclone上传的方法 rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file ${log_dir}/qbauto_copy.log "${torrent_path}" ${rclone_dest}/${from_dc_tag}) elif [ ${type} == "dir" ] then rclone_copy_cmd=$(rclone -v copy --transfers ${rclone_parallel} --log-file ${log_dir}/qbauto_copy.log "${torrent_path}"/ ${rclone_dest}/${from_dc_tag}/"${torrent_name}") fi # tag = 已上传 qb_change_hash_tag ${torrent_hash} ${uploading_tag} ${finished_tag} } function file_lock(){ $(touch qbup.lock) } function can_go_lock(){ lockStatus=$(ls | grep qbup.lock) if [ -z "${lockStatus}" ] then noLock="1" return fi noLock="0" } function file_unlock(){ $(rm -rf qbup.lock) } function doUpload(){ torrentInfo=$1 i=$2 echo $2 echo ${i} torrent_name=$(echo ${torrentInfo} | jq ".[$i] | .name" | sed s/\"//g) torrent_hash=$(echo ${torrentInfo} | jq ".[$i] | .hash" | sed s/\"//g) save_path=$(echo ${torrentInfo} | jq ".[$i] | .save_path" | sed s/\"//g) torrent_path="${save_path}${torrent_name}" # 这里就是他的本地实际路径，尝试将这里上传上去 can_go_lock if [[ ${noLock} == "1" ]] # 厕所门能开 then file_lock # 锁上厕所门 echo '执行上传没事的~~~'; echo ${torrent_name} echo ${torrent_hash} echo ${torrent_path} rclone_copy ${torrent_name} ${torrent_hash} ${torrent_path} else echo '已有程序在上传，退出' return # 打不开门，换个时间来 fi file_unlock # 打开厕所门，出去 } # 每次只查询一条数据，！！上传一条数据！！ function qb_get_status(){ qb_login if [ ${qb_v} == "1" ] then completed_torrents_num=$(curl -s "${qb_web_url}/api/v2/torrents/info?filter=completed" --cookie "${cookie}" | jq '.[] | length' | wc -l) echo "任务数：".${completed_torrents_num} for((i=0;i<${completed_torrents_num};i++)); do curtag=$(curl -s "${qb_web_url}/api/v2/torrents/info?filter=completed" --cookie "${cookie}" | jq ".[$i] | .tags" | sed s/\"//g | grep -P -o "${unfinished_tag}") if [ -z "${curtag}" ] then curtag="null" fi if [ ${curtag} == "${unfinished_tag}" ] then torrentInfo=$(curl -s "${qb_web_url}/api/v2/torrents/info?filter=completed" --cookie "${cookie}") doUpload "${torrentInfo}" ${i} # 每次只上传一个数据，否则的话，可能会导致多线程的争用问题 return fi done elif [ ${qb_v} == "2" ] then completed_torrents_num=$(curl -s "${qb_web_url}/query/torrents?filter=completed" --cookie "${cookie}" | jq '.[] | length' | wc -l) for((i=0;i<${completed_torrents_num};i++)); do curtag=$(curl -s "${qb_web_url}/query/torrents?filter=completed" --cookie "${cookie}" | jq ".[$i] | .category" | sed s/\"//g) if [ -z "${curtag}" ] then curtag="null" fi if [ ${curtag} == "${unfinished_tag}" ] then torrentInfo=$(curl -s "${qb_web_url}/query/torrents?filter=completed" --cookie "${cookie}") doUpload "${torrentInfo}" ${i} # 每次只上传一个数据，否则的话，可能会导致多线程的争用问题 return fi done echo "啥事都不干"; else echo "获取错误" echo "qb_v=${qb_v}" fi } qb_get_status [/collapse]存放好了，别忘了给执行权限 ::aru:knife::chmod +x /home/qb_auto_rclone.sh最后设一个定时任务去执行就是了 ::aru:flower::# 宝塔可以用 bash /home/qb_auto_rclone.sh 系统自带的可以用 */1 * * * * bash /home/qb_auto_rclone.sh最好还是先测试能用与否，测试见下2.使用方法如下:正常下载某个种子，没有大姐姐 ::aru:blood::对这个下载的种子进行特定的标记：【待上传云端】慢慢等待下载完成，就会自动上传 ::aru:flower::或者你可以手动执行脚本进行测试，下载完成后执行bash /home/qb_auto_rclone.sh看看种子有没有上传成功，脚本有没有什么错误信息提示之类的的，具体慢慢研究吧最后附图一张成功的qb的上传结果在线网盘的结果 ::aru:tongue:: 如果遇到上传中直接重启系统了导致的之后脚本都无法生效的问题，需要手动删除脚本同目录下的一个qbup.lock的文件