让gpt写了个qbittorrent下载完成后自动上传百度网盘的脚本

查看 30|回复 0
作者:aoki   
脚本是gpt-4o写的,虽然还有优化空间,但整体可用,我也就没再折腾。
有闲情的大佬可以再优化下。
具体功能是:
qbittorrent下载完成后调用BaiduPCS-Go上传到百度网盘,之前论坛里有rclone上传的脚本,不过微软网盘给的小气。还是百度就很大,就是会吃某些视频,懂得都懂,至于存什么。哎嘿~。
目前脚本已知bug:
1.会出现某些任务路径非法的提示,目测是BaiduPCS-Go的问题,暂时不知道怎么解决。
2.日志文件有点乱,反正能看。
3.没有上传完成后自动删除功能。(因为可能会因为上传出现上传失败的问题,所以种子留下了,等待人工效验。反正我是会大概看一下有没有上传失败的。)
运行命令是bash /downloads/up.sh "%F"  ""
使用方法:
上传脚本然后
qbittorrent设置-》启用“torrent 完成时运行外部程序”->输入“bash /downloads/up.sh "%F"  ""”->保存
替换为实际路径,注意用双引号保持数据完整性。
其他的,代码里面注释很多,自己看着改应该没问题吧?
[ol]#!/bin/bash
# 定义一些全局变量
LOCK_FILE="/downloads/upload_script.lock"
QUEUE_FILE="/downloads/upload_queue.txt"
LOG_FILE="/downloads/upload_log.txt"
ERROR_LOG_FILE="/downloads/upload_error_log.txt"
CACHE_FILE="/downloads/upload_cache.txt"
BAIDUPCS_GO_LOG="/downloads/BAIDUPCS-GO_LOG.txt"
# 记录日志的函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 记录带时间戳的日志到 BAIDUPCS_GO_LOG
log_to_baidupcs_log() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" >> "$BAIDUPCS_GO_LOG"
}
# 记录错误日志的函数
error_log() {
    local error_message="$1"
    local error_task="$2"
    local error_step="$3"
    local error_action="$4"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Task: ${error_task}, Step: ${error_step}, Error: ${error_message}, Action: ${error_action}" >> $ERROR_LOG_FILE
}
# 添加任务到队列的函数
add_to_queue() {
    local task="$1"
    local path="$2"
    echo ""${task}" "${path}"" >> $QUEUE_FILE
}
# 读取队列并缓存的函数
load_cache() {
    if [ -f $QUEUE_FILE ]; then
        cat $QUEUE_FILE > $CACHE_FILE
        > $QUEUE_FILE
    fi
}
# 执行上传任务的函数
execute_tasks() {
    while [ -s $CACHE_FILE ]; do
        local line=$(head -n 1 $CACHE_FILE)
        local task=$(echo $line | awk -F" '{print $2}')
        local dest_path=$(echo $line | awk -F" '{print $4}')
        
        log "开始上传 ${task} 到网盘 ${dest_path} 目录"
        
        # 执行上传任务 并将运行结果记录到BAIDUPCS-GO_LOG.txt当中
        # /downloads/BaiduPCS-Go 为BaiduPCS-Go的绝对路径
        /downloads/BaiduPCS-Go upload "${task}" "${dest_path}" 2>&1 | while IFS= read -r line; do log_to_baidupcs_log "$line"; done
        
        
        #这里只记录BaiduPCS-Go最后一次的运行结果。
        #所以对于文件夹,也是记录最后一个上传信息,详细的上传日志还得去BAIDUPCS_GO_LOG看
        # 检查日志文件中是否包含“文件路径含有非法字符,已跳过!”
        if grep -q "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG"; then
            local skip_message=$(grep "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG" | tail -n 1)
            log "$skip_message"
        fi
        
        # 检查日志文件中是否包含上传成功的提示信息
        if grep -q "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG"; then
            local success_message=$(grep "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG" | tail -n 1)
            log "$success_message"
        fi
        
        log "${task} 上传完成"
        
        # 移除已完成任务
        sed -i '1d' $CACHE_FILE
    done
}
# 处理队列的函数
process_queue() {
    load_cache
   
    while [ -s $CACHE_FILE ]; do
        execute_tasks
        load_cache
    done
   
    rm -f $CACHE_FILE
}
# 主函数
main() {
    if [ $# -ne 2 ]; then
        echo "Usage: $0 "
        exit 1
    fi
    local task="$1"
    local dest_path="$2"
   
    # 尝试获取锁
    exec 200>$LOCK_FILE
    flock -n 200
    if [ $? -ne 0 ]; then
        error_log "Failed to acquire lock" "$task" "Acquiring lock" "Adding task to queue"
        add_to_queue "$task" "$dest_path"
        exit 0
    fi
    # 如果获取到了锁,处理任务
    if [ -f $QUEUE_FILE ]; then
        add_to_queue "$task" "$dest_path"
    else
        echo ""${task}" "${dest_path}"" > $QUEUE_FILE
    fi
    process_queue
    release_lock
    if [ -f $QUEUE_FILE ]; then
        rm -f $QUEUE_FILE
    fi
}
release_lock() {
    flock -u 200
    rm -f $LOCK_FILE
}
main "$@"
[/ol]复制代码

上传, 函数, 脚本

您需要登录后才可以回帖 登录 | 立即注册

返回顶部