嘟嘟社区

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


脚本是gpt-4o写的,虽然还有优化空间,但整体可用,我也就没再折腾。
有闲情的大佬可以再优化下。

具体功能是:
qbittorrent下载完成后调用BaiduPCS-Go上传到百度网盘,之前论坛里有rclone上传的脚本,不过微软网盘给的小气。还是百度就很大,就是会吃某些视频,懂得都懂,至于存什么。哎嘿~。

目前脚本已知bug:
1.会出现某些任务路径非法的提示,目测是BaiduPCS-Go的问题,暂时不知道怎么解决。
2.日志文件有点乱,反正能看。
3.没有上传完成后自动删除功能。(因为可能会因为上传出现上传失败的问题,所以种子留下了,等待人工效验。反正我是会大概看一下有没有上传失败的。)

运行命令是bash /downloads/up.sh "%F"  "<目标文件夹>"
使用方法:
上传脚本然后
qbittorrent设置-》启用“torrent 完成时运行外部程序”->输入“bash /downloads/up.sh "%F"  "<目标文件夹>"”->保存

<目标文件夹>替换为实际路径,注意用双引号保持数据完整性。

其他的,代码里面注释很多,自己看着改应该没问题吧?

  1. #!/bin/bash
  2. # 定义一些全局变量
  3. LOCK_FILE="/downloads/upload_script.lock"
  4. QUEUE_FILE="/downloads/upload_queue.txt"
  5. LOG_FILE="/downloads/upload_log.txt"
  6. ERROR_LOG_FILE="/downloads/upload_error_log.txt"
  7. CACHE_FILE="/downloads/upload_cache.txt"
  8. BAIDUPCS_GO_LOG="/downloads/BAIDUPCS-GO_LOG.txt"
  9. # 记录日志的函数
  10. log() {
  11.     echo "$(date ‘+%Y-%m-%d %H:%M:%S’) – $1" >> $LOG_FILE
  12. }
  13. # 记录带时间戳的日志到 BAIDUPCS_GO_LOG
  14. log_to_baidupcs_log() {
  15.     echo "$(date +"%Y-%m-%d %H:%M:%S") – $1" >> "$BAIDUPCS_GO_LOG"
  16. }
  17. # 记录错误日志的函数
  18. error_log() {
  19.     local error_message="$1"
  20.     local error_task="$2"
  21.     local error_step="$3"
  22.     local error_action="$4"
  23.     echo "$(date ‘+%Y-%m-%d %H:%M:%S’) – Task: ${error_task}, Step: ${error_step}, Error: ${error_message}, Action: ${error_action}" >> $ERROR_LOG_FILE
  24. }
  25. # 添加任务到队列的函数
  26. add_to_queue() {
  27.     local task="$1"
  28.     local path="$2"
  29.     echo ""${task}" "${path}"" >> $QUEUE_FILE
  30. }
  31. # 读取队列并缓存的函数
  32. load_cache() {
  33.     if [ -f $QUEUE_FILE ]; then
  34.         cat $QUEUE_FILE > $CACHE_FILE
  35.         > $QUEUE_FILE
  36.     fi
  37. }
  38. # 执行上传任务的函数
  39. execute_tasks() {
  40.     while [ -s $CACHE_FILE ]; do
  41.         local line=$(head -n 1 $CACHE_FILE)
  42.         local task=$(echo $line | awk -F" ‘{print $2}’)
  43.         local dest_path=$(echo $line | awk -F" ‘{print $4}’)
  44.         
  45.         log "开始上传 ${task} 到网盘 ${dest_path} 目录"
  46.         
  47.         # 执行上传任务 并将运行结果记录到BAIDUPCS-GO_LOG.txt当中
  48.         # /downloads/BaiduPCS-Go 为BaiduPCS-Go的绝对路径
  49.         /downloads/BaiduPCS-Go upload "${task}" "${dest_path}" 2>&1 | while IFS= read -r line; do log_to_baidupcs_log "$line"; done
  50.         
  51.         
  52.         #这里只记录BaiduPCS-Go最后一次的运行结果。
  53.         #所以对于文件夹,也是记录最后一个上传信息,详细的上传日志还得去BAIDUPCS_GO_LOG看
  54.         # 检查日志文件中是否包含“文件路径含有非法字符,已跳过!”
  55.         if grep -q "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG"; then
  56.             local skip_message=$(grep "文件路径含有非法字符,已跳过!" "$BAIDUPCS_GO_LOG" | tail -n 1)
  57.             log "$skip_message"
  58.         fi
  59.         
  60.         # 检查日志文件中是否包含上传成功的提示信息
  61.         if grep -q "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG"; then
  62.             local success_message=$(grep "上传文件成功, 保存到网盘路径:" "$BAIDUPCS_GO_LOG" | tail -n 1)
  63.             log "$success_message"
  64.         fi
  65.         
  66.         log "${task} 上传完成"
  67.         
  68.         # 移除已完成任务
  69.         sed -i ‘1d’ $CACHE_FILE
  70.     done
  71. }
  72. # 处理队列的函数
  73. process_queue() {
  74.     load_cache
  75.    
  76.     while [ -s $CACHE_FILE ]; do
  77.         execute_tasks
  78.         load_cache
  79.     done
  80.    
  81.     rm -f $CACHE_FILE
  82. }
  83. # 主函数
  84. main() {
  85.     if [ $# -ne 2 ]; then
  86.         echo "Usage: $0 <upload_task> <dest_path>"
  87.         exit 1
  88.     fi
  89.     local task="$1"
  90.     local dest_path="$2"
  91.    
  92.     # 尝试获取锁
  93.     exec 200>$LOCK_FILE
  94.     flock -n 200
  95.     if [ $? -ne 0 ]; then
  96.         error_log "Failed to acquire lock" "$task" "Acquiring lock" "Adding task to queue"
  97.         add_to_queue "$task" "$dest_path"
  98.         exit 0
  99.     fi
  100.     # 如果获取到了锁,处理任务
  101.     if [ -f $QUEUE_FILE ]; then
  102.         add_to_queue "$task" "$dest_path"
  103.     else
  104.         echo ""${task}" "${dest_path}"" > $QUEUE_FILE
  105.     fi
  106.     process_queue
  107.     release_lock
  108.     if [ -f $QUEUE_FILE ]; then
  109.         rm -f $QUEUE_FILE
  110.     fi
  111. }
  112. release_lock() {
  113.     flock -u 200
  114.     rm -f $LOCK_FILE
  115. }
  116. main "$@"

复制代码

头像也是ai制作吗
谢谢分享,没准哪天就用上了呢
Claude写可以用,GPT4o写就需要掂量掂量了