Rat's

VPS上传文件到OneDrive网盘脚本,可配合Aria2实现自动上传
说明:我们从VPS上传文件到OneDrive网盘的方法很多,包括Rclone挂载,OneIndex程序的上传功能,...
扫描右侧二维码阅读全文
19
2018/11

VPS上传文件到OneDrive网盘脚本,可配合Aria2实现自动上传

说明:我们从VPS上传文件到OneDrive网盘的方法很多,包括Rclone挂载,OneIndex程序的上传功能,不过2个在上传的时候都还是有点BUG,前者会出现丢文件的情况,后者也会出现上传失败,都不是很理想,这里博主再介绍个OneDrive上传脚本,几乎不会出现上传问题,很好用,由萌咖大佬制作,并将其适用于Aria2的自动上传,这里说下具体操作。

提示

【2019.11.28】
该版本不再维护和更新,请移植Go版的上传工具,更高效和快速,地址:https://www.moerats.com/archives/1006/

更新

【2018.12.16】
应一些同学需求,新增上传到指定文件夹的方法。
【2018.11.19】
OneDrive上传脚本BUG已被萌咖大佬修复,修复了空格处理不当,导致部分带空格的文件夹上传失败,从而影响Aria2上传脚本。
【2018.10.30】
修复Aria2上传脚本BUG,包括修复了不能上传文件夹功能,修复了不能正确上传文件名中包含空格的项目。
【2018.10.29】
优化OneDrive网盘脚本。优化认证步骤。
独家分享萌咖大佬的Aria2自动上传脚本,判断更加细节,支持单文件、文件夹里的单文件、文件夹里的多文件及文件夹上传。超过15G文件停止上传(onedrive限制)。

说明

【2018.11.19】
#目前脚本修复的差不多了,博主测试各种带空格的文件夹自动上传都没问题。

#如果依然出现有些文件上传不了?
出现这种情况的话,大概是文件虽然下载完成了,但一直卡在做种阶段,导致参数传不到自动上传脚本,从而文件夹也上传不了。
解决方法:在配置文件里加入seed-time=0参数(意思是停止做种),再重启Aria2即可。

方法

Github地址:https://github.com/0oVicero0/OneDrive

脚本特性:脚本支持文件夹上传,支持获取文件的匿名直链,且只适用于OneDrive非个人版。

1、安装脚本
安装curl,用于访问API

#Ubuntu和Debian系统
apt-get install -y curl

#Centos系统
yum install curl -y

运行命令安装脚本:

#为了方便小白,本脚本内置萌咖大佬永久有效的应用参数,可以直接使用,如果你不放心可以自己获取参数,不过可能会遇到很多坑,建议直接使用脚本默认的参数
wget --no-check-certificate -qO- "https://raw.githubusercontent.com/0oVicero0/OneDrive/master/OneDrive.sh" |bash

本脚本需要三个参数Client IDSecretReply URL,均需要在/usr/local/etc/OneDrive/onedrive.cfg文件里修改,参数获取看下面,当然你也可以不用管,直接进行步骤3

2、获取参数
先访问Microsoft Azure Management Portal,然后点击左侧菜单栏中的Azure Active Directorg,选择应用注册,再点击页面上方的新应用程序注册。
请输入图片描述
输入名称如:OneDrive for Linux,应用程序类型选择Web应用/API,填入登陆URLhttps://login.microsoftonline.com/,再点击创建。
请输入图片描述
然后点击刚刚创建的应用程序,复制应用程序ID,即脚本需要的Client ID参数,再点击左上角的设置。
请输入图片描述
然后进行如下修改:
请输入图片描述

#点击右边的回复URL,将其修改为:https://onedrive.live.com/about/business/,即脚本所需要的Reply URL参数。
#点击所需权限,点击Windows Azure Active Directory确认是否已选中Sign in and user profile,如果没有则选中并点击完成。
#点击上方的添加,点击选择API,选中Office 365 SharePoint Online,并点击选择。在选择权限中选中Read user files 和Read and write user files,并点击选择。点击完成按钮,并关掉此小窗口。
#点击密钥,填入密钥描述,如:OneDrive,选择年限1年,点击保存,再复制密匙,即脚本所需要的Secret参数。

不过这里说下密匙(Secret参数)填写的一个坑,由唯一度博主填平。就是当我们获取到带+号的密匙时候,我们需要使用编码符号,把+改成%2B,然后再填入脚本里,不然最后会出现Something went wrong, here is the API response的错误,导致验证失败。

3、运行账号认证程序
运行命令onedrive -a,将返回的网址复制到浏览器打开,再登陆你的OneDrive for Business账号,登陆成功后复制地址栏中的地址(复制包括localhost的所有链接地址),粘贴到SSH客户端里,敲回车键即可。
请输入图片描述
如果返回以下字段:It seems like we have a refresh token, so we are ready to go,那就恭喜你,设置成功!

提示:如果你遇到bash: onedrive: command not found错误,则需要找到/usr/local/etc/OneDrive文件夹,修改onedrive和onedrive-d脚本,在第二行都加上export PATH=/usr/local/bin:$PATH代码,再保存就行了。

使用

1、使用命令

onedrive --help
 
#####################################################################
Usage: onedrive [OPTIONS] file1 [file2...]
       onedrive-d folder
 
Options:
  -d, --debug        Enable debug mode
  -a, --authorize    Run authorization process
  -f, --folder       Upload files into this remote folder
  -c, --creat        Creat remote folder."
                     Directory names are separated with a slash, e.g.
                     rootFolder/subFolder
                     Do NOT use a trailing slash!
  -h, --help         Show this help
  -r, --rename       Rename the files during upload
                     For each file you specify you MUST also specify
                     the remote filename as the subsequent parameter
                     Be especially careful with globbing!
  -s, --silent       Silent mode for use in crontab scripts.
                     Return only exit code.
  -ls,--list         Show the itmes in this directory.
  -l, --link         Show the file share link.
      
#####################################################################

2、命令示范
如果我们要上传/root文件夹里面的moerats.txt,使用命令:

#此命令默认上传到OneDrive根目录
onedrive '/root/moerats.txt'

#如果上传到指定文件夹,就需要加-f参数
onedrive -f RATS '/root/moerats.txt'  #上传到OneDrive根目录的RATS文件夹
onedrive -f RATS/RATS '/root/moerats.txt'  #上传到OneDrive根目录RATS文件夹里的RATS文件夹

如果我们要将/root文件夹及里面的文件夹和文件一起上传,使用命令:

#此命令默认上传到OneDrive根目录
onedrive-d '/root'

#如果上传到指定文件夹,就需要加-f参数
onedrive-d -f RATS '/root'  #上传到OneDrive根目录的RATS文件夹
onedrive-d -f RATS/RATS '/root'  #上传到OneDrive根目录RATS文件夹里的RATS文件夹

如果我们想直接查看OneDrive网盘目录的文件,使用命令:

#此命令只查看根目录文件
onedrive -l
#如果我们要查看根目录root文件夹里的文件
onedrive -l /root

请输入图片描述

Aria2自动上传

上传方法参考:使用Aira2下载文件后自动上传到Google Drive网盘

上传代码如下:

#!/bin/bash

GID="$1";
FileNum="$2";
File="$3";
MaxSize="15728640"
RemoteDIR="";  #上传到Onedrive的路径,默认为根目录,如果要上传到指定目录,方法看文章最后面。
LocalDIR="/home/www/download/";  #Aria2下载目录,记得最后面加上/

if [[ -z $(echo "$FileNum" |grep -o '[0-9]*' |head -n1) ]]; then FileNum='0'; fi
if [[ "$FileNum" -le '0' ]]; then exit 0; fi
if [[ "$#" != '3' ]]; then exit 0; fi

function LoadFile(){
  IFS_BAK=$IFS
  IFS=$'\n'
  if [[ ! -d "$LocalDIR" ]]; then return; fi
  if [[ -e "$File" ]]; then
    if [[ $(dirname "$File") == $(readlink -f $LocalDIR) ]]; then
      ONEDRIVE="onedrive";
    else
      ONEDRIVE="onedrive-d";
    fi
    FileLoad="${File/#$LocalDIR}"
    while true
      do
        if [[ "$FileLoad" == '/' ]]; then return; fi
        echo "$FileLoad" |grep -q '/';
        if [[ "$?" == "0" ]]; then
          FileLoad=$(dirname "$FileLoad");
        else
          break;
        fi;
      done;
    if [[ "$FileLoad" == "$LocalDIR" ]]; then return; fi
    if [[ -n "$RemoteDIR" ]]; then
      Option=" -f $RemoteDIR";
    else
      Option="";
    fi
    EXEC="$(command -v $ONEDRIVE)";
    if [[ -z "$EXEC" ]]; then return; fi
    cd "$LocalDIR";
    if [[ -e "$FileLoad" ]]; then
      ItemSize=$(du -s "$FileLoad" |cut -f1 |grep -o '[0-9]*' |head -n1)
      if [[ -z "$ItemSize" ]]; then return; fi
      if [[ "$ItemSize" -ge "$MaxSize" ]]; then
        echo -ne "\033[33m$File \033[0mtoo large to spik.\n";
        return;
      fi
      eval "${EXEC}${Option}" \'"${FileLoad}"\';
      if [[ $? == '0' ]]; then
        rm -rf "$FileLoad";
      fi
    fi
  fi
  IFS=$IFS_BAK
}
LoadFile;

如果你想上传到指定的文件夹,修改如下:

#上传到Onedrive里的RATS目录,参数改为:RemoteDIR="RATS"; 
#上传到Onedrive里的RATS目录里的RATS目录,参数改为:RemoteDIR="RATS/RATS";

如果你觉得上传速度较慢,可以编辑/usr/local/etc/OneDrive/onedrive.cfg,修改threads线程数,默认2

#这里提供个快速修改线程数的命令,这里默认修改为5,建议别太高!
sed -i "s#max_upload_threads=2#max_upload_threads=5#g" '/usr/local/etc/OneDrive/onedrive.cfg'

文章参考:OneDrive for Business

Vultr新用户注册送100美元/16个机房按小时计费,支持支付宝,【点击查看】。
最后修改:2019 年 11 月 28 日 01 : 30 PM

发表评论

554 条评论

  1. 小曹

    可以了,换成默认的参数,虽然登录以后打不开网页,但是复制到ssh就可以了。

    1. Rat's
      @小曹

      网页打不开是正常的,你只需要复制浏览器地址就行了。

  2. 小曹

    AADSTS700016: Application with identifier 'f5d64b03-038a-4949-ad77-8f5' was not found in the directory 'ae474f59-7946-4b9b-95f7-**4a0e'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant 确认过应用程序id没问题,但是运行以后打开网页登录就提示这个,是不是帐号本身有问题?

    1. Rat's
      @小曹

      默认的api是没问题的,你多试几次。

      1. 小曹
        @Rat's

        就是说多打开几次这个连接么。。

        1. Rat's
          @小曹

          多认证几次,清空下缓存。

          1. 小曹
            @Rat's

            换了个账号成功了,但是上传的时候失败···
            上传文件夹显示“Could not create folder 'root' in 'root'”
            上传文件显示“An error has occurred while uploading 'ZBench-CN.sh' (Code: 000)”

            1. 小曹
              @小曹

              用默认的参数会打不开网页。。

  3. chem

    请问带空格的文件夹中还有带空格的文件,这样的能上传吗

    1. Rat's
      @chem

      可以,我试过带十几个空格的,一样能自动上传。

  4. Lexo

    谢谢博主

  5. chem

    脚本怎么更新呀,重新安装吗

    1. Rat's
      @chem

      可以重新安装,也可以重新去Github下载onedrive-d脚本,替换下就可以了,脚本目录/usr/local/etc/OneDrive

  6. hbin

    用脚本文件夹依旧不能上传啊,试了很多次了。连手动上传文件夹都不行,执行后会出现这提示
    ./onedrive -f '/usr/local/caddy/www/aria2/Download/哥布林'
    Please specify at least one file to upload

    1. Rat's
      @hbin

      你把目录层数减少点看看。

      1. hbin
        @Rat's

        不行,都是这样的提示;单文件没问题,就文件夹不行
        我下载好的bt文件夹名称是这样的
        [Sakurato.sub]Goblin Slayer07[720P]

        1. Rat's
          @hbin

          手动上传命令更新了,你用onedrive-d '/root'试试,后面为文件夹,前面命令之间无空格。

          1. hbin
            @Rat's

            这样可以了耶
            不知道能不能应用在脚本上呢?

            1. Rat's
              @hbin

              脚本早就用的这个命令,只是文章里的手动没更新过来。

              1. hbin
                @Rat's

                那我见鬼了?!!

                1. Rat's
                  @hbin

                  原因查出来了,已修复Onedrive脚本,记得重新安装下。

                  1. hbin
                    @Rat's

                    已经能正常上传文件夹了,感谢博主和大佬

                  2. hbin
                    @Rat's

                    好的,

  7. jvc2020

    大佬 设置后不会上传 日志显示

    [#c6ba2f 0B/0B CN:1 DL:0B]

    FILE: http://pic1.win4000.com/wallpaper/2018-11-06/5be123c5133f8.jpg

    [#c6ba2f 0B/0B CN:1 DL:0B]
    [#c6ba2f 0B/1.1MiB(0%) CN:1 DL:59KiB ETA:19s]
    [#c6ba2f 128KiB/1.1MiB(10%) CN:1 DL:111KiB ETA:9s]
    [#c6ba2f 272KiB/1.1MiB(22%) CN:1 DL:126KiB ETA:7s]
    [#c6ba2f 464KiB/1.1MiB(38%) CN:1 DL:144KiB ETA:5s]
    [#c6ba2f 656KiB/1.1MiB(54%) CN:1 DL:157KiB ETA:3s]
    [#c6ba2f 864KiB/1.1MiB(72%) CN:1 DL:165KiB ETA:1s]
    [#c6ba2f 1.1MiB/1.1MiB(99%) CN:1 DL:190KiB]

    11/16 11:26:56 [NOTICE] Download complete: /root/Download/5be123c5133f8.jpg
    Could not execute user command: /root/.aria2/autoupload.sh: No such file or directory

    11/16 11:27:06 [NOTICE] Serialized session to '/root/.aria2/aria2.session' successfully.

    还有个问题
    手动上传 单文件能上传,输入命令行 上传文件夹里的文件 onedrive -f /root/moerats.txt 文件没传过来 直接在OneDrive里新建了root moerats.txt 两个目录

    1. Rat's
      @jvc2020

      第一个问题显示脚本不存在,看你填的路径对不对;至于第二个问题是之前用的修改的脚本,现在又用了原版,但文中的命令没更新过来,所以。

      1. jvc2020
        @Rat's

        chmod +x /root/.aria2/autoupload.sh
        echo "on-download-complete=/root/.aria2/autoupload.sh" >>/root/.aria2/aria2.conf

        重启Aria2

        service aria2 restart
        最后还是显示Could not execute user command: /root/.aria2/autoupload.sh: No such file or directory

        1. Rat's
          @jvc2020

          有没有新建那个上传脚本?在/root/.aria2文件夹

          1. jvc2020
            @Rat's

            有新建autoupload.sh,放在/root/.aria2文件夹里的

            1. Rat's
              @jvc2020

              那就不清楚了,你这个错误提示文件不存在。

  8. xenon

    小白想问下加了这个脚本就能自动上传了吗?还是说要算上文章结尾的代码才可以自动

    1. Rat's
      @xenon

      首先需要安装这个脚本,配置好,然后再用Aria2结合下面的自动上传脚本才能自动上传。

  9. 9527

    博主,手动可以上传,能不能和这个网址一起用
    https://www.moerats.com/archives/700/
    有没有什么顺序步骤会不会把之前的覆盖掉,那个上传脚本文件取名有没有要求 autoupload.sh和oneindexup.sh都可以吗

    1. Rat's
      @9527

      可以一起用,文件取名和存放目录都无所谓,你只要在aria2配置文件填写参数的时候,后面文件的路径要填对还有名称,比如你放在/hone文件夹,文件名为xx.sh,那你在aria2里填的就是on-download-complete=/home/xx.sh

  10. 王七

    这个脚本有些上传不了,什么时候升级?可不可以指定后缀名来过滤掉一些不想上传的文件?

    1. Rat's
      @王七

      这个排查核心脚本工作量很大,看萌咔大佬啥时候抽空搞完吧,估计快了。至于你提的,只能待定,目前主要先解决上传问题。