Rat's

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

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

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

方法

Github地址:https://github.com/iiiiiii1/OneDrive

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

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

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

#Centos系统
yum install curl -y

运行命令安装脚本:

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

本脚本需要三个参数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账号,登陆成功后复制地址栏中的地址,并提取code的字段(就是code=后面至&前面),粘贴到SSH客户端里,敲回车键即可。
请输入图片描述
如果返回以下字段:It seems like we have a refresh token, so we are ready to go,那就恭喜你,设置成功!

使用

1、使用命令

onedrive --help

Usage: onedrive [OPTIONS] file1
       onedrive-d floder

Options:
  -d, --debug        Enable debug mode
  -a, --authorize    Run authorization process
  -f, --folder       Upload files into this remote folder
  -u, --update       Upload files into this remote folder after aria2 download complete
  -c, --creat        Creat remote folder.
                     Directory names are separated with a slash,
            echo  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、命令示范
以下命令均需要在/usr/local/etc/OneDrive文件夹进行,先使用命令:

cd /usr/local/etc/OneDrive

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

#此命令默认将moerats.txt文件上传到OneDrive根目录
./onedrive /root/moerats.txt
#此命令会将文件夹和文件一起上传,但只上传文件夹里的moerats.txt文件
./onedrive -f /root/moerats.txt

请输入图片描述

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

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

请输入图片描述

Aria2自动上传

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

上传代码如下:

#!/bin/bash
num="$2"
path="$3" 
downloadpath='/home' #下载目录

if [ $num -eq 0 ]
    then
      exit 0
fi

function getdir(){
IFS=$'\n';for file in `ls "$1"`
    do
        if [ -d "$1/$file" ]  
        then
            getdir "$1/$file"
        else
            if [ "${1%/*}" = "$downloadpath" ] && [ $num -eq 1 ]
            then
                /usr/local/etc/OneDrive/onedrive "$1"
            elif [ $num -eq 1 ] 
            then
                /usr/local/etc/OneDrive/onedrive "$1/$file"
            else
                /usr/local/etc/OneDrive/onedrive -u "$downloadpath" "$1/$file"
                fi
        fi
    done
}

while true; do
filepath=$path 
path=${path%/*};   
if [ "$path" = "$downloadpath" ] 
    then  
      getdir "$filepath"
      if [ -d $filepath ]
      then
        rm -r "$filepath"
      else
        rm  "$filepath"
      fi
      echo 3 > /proc/sys/vm/drop_caches
      swapoff -a && swapon -a
      exit 0
fi
done

文章参考:OneDrive for Business

搬瓦工年付$187机房套餐补货了,电信联通优化,512M内存/500G流量/1G带宽,建站稳定,优惠码:BWH1ZBPVK,【点击购买】!
搬瓦工年付$28CN2高速线路,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快,建站稳定,优惠码同上,【点击购买】!
Vultr最新活动,充$5$33,可以用$2.5的服务器一年多,活动随时结束,快上车【点击查看】!
最后修改:2018 年 08 月 24 日 10 : 31 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论

65 条评论

  1. 一起走吧

    请问这个脚本创建在哪个目录下面啊 downloadpath这个参数是不是aria的下载目录

    1. Rat's
      @一起走吧

      对,就是指的下载目录。

  2. lin

    VJmSptRZciy8d2q_iWRMwoiTXWuBjhRPKE866X06Sl-KjZzbGixZXWhWvfVJSAA

    It seems like we have a refresh token, so we are ready to go.

    [root@dm1 OneDrive]# ./onedrive -l
    [root@dm1 OneDrive]# ./onedrive -l
    [root@dm1 OneDrive]# ls
    json-parser onedrive onedrive-authorize onedrive-base onedrive-d onedrive.cfg
    [root@dm1 OneDrive]# touch 2.txt
    [root@dm1 OneDrive]# ./onedrive -f 2.txt
    Could not create folder '2.txt' in ''
    为啥还是不能上传呢

    1. Rat's
      @lin

      建议使用默认参数,如果你用的默认参数,那就检查下你认证程序填的code看看。

  3. stone5

    大佬 你好,我想用aria2自动上传文件到onedrive的根目录下的文件夹中,上传代码要怎么样修改?谢谢

    1. Rat's
      @stone5

      编辑/usr/local/etc/OneDrive/onedrive.cfg配置文件,修改参数export api_root_folder=”root”,root就是指根目录,不过修改的文件夹名称有规定,你可以参考这个:https://docs.microsoft.com/zh-cn/onedrive/developer/rest-api/api/drive_get_specialfolder。

      1. 一起走吧
        @Rat's

        我用的是本文的这种方法,想把文件传到子文件夹应该怎么做?是修改脚本里面的参数吗

        1. Rat's
          @一起走吧

          对,步骤已经给你了,子文件夹命名需要规范。

  4. 小志

    为啥就是自动不上传呢?手动上传可以

    1. Rat's
      @小志

      检查下Aria2配置问题,还有上传脚本授权,脚本我测试是没问题的,再不行你可以换系统试试。

      1. 小志
        @Rat's

        直接能调用第三个上传脚本用?
        还是先把挂载弄上?
        还有第三个脚本出了目录还有别的参数要修改吗

        1. Rat's
          @小志

          你用的是oneindex?用这个不需要挂载,可以参考https://www.moerats.com/archives/482/设置上传脚本,上传代码用本文的,最后记得重启Aria2。

  5. starixk

    bash 错误/root/.aria2/oneindexup.sh: line 5: [: -eq: unary operator expected
    ./onedrive 可正常上传
    更改为双等号也提示错误
    /root/.aria2/oneindexup.sh: line 5: [: ==: unary operator expected

    环境 LNMP。python2.6,centos6.10 宝塔面板

    1. Rat's
      @starixk

      你直接用我那个一键脚本吧https://www.moerats.com/archives/693/。

      1. starixk
        @Rat's

        难受。。。我主机有网络环境的。。。而且还是centos

        1. Rat's
          @starixk

          没事,我那个脚本2分钟就安装好了,很快。

          1. starixk
            @Rat's

            郁闷的是,用你那个脚本安装的话,之前的网站啊之类的需要我重新配置一遍。。。感觉超级麻烦唉。。。

            1. Rat's
              @starixk

              脚本需要纯净的系统,也就是没安装过web环境的系统,不然会有冲突。

              1. starixk
                @Rat's

                我还是好奇这个bash 错误/root/.aria2/oneindexup.sh: line 5: [: -eq: unary operator expected
                这个错误为啥会出现

                1. Rat's
                  @starixk

                  你可以理解成语法的问题。百度很多,你可以自己看看,基本就是改单双等号,或加中括号解决。

  6. 小志

    已经认证成功但是上传就提示
    An error has occurred while uploading '/root/autoupload.sh' (Code: 000)

    1. Rat's
      @小志

      这个好像使用自己创建的应用会出现的问题,如果是的,你就用我给的默认参数。

  7. 小志

    downloadpath='/home' #下载目录
    这个必须加目录必须加HOMe吗

    1. Rat's
      @小志

      可以不用是,这里只做个例子,不过最好是一级目录,目录名随意。

  8. John

    发现,用aria下载BT的时候,会一下多无用的文件图片之类的,然后就没法自动上传了,而直接下一个https://xxx.xxx.com.ddd.mp4之类的,就可以自动上传

  9. John

    我的Directory Lister站是a.xxx.com,然后在a.xxx.com下挂载了Onedrive, onedrive指定的文件夹/share,发现这个自动上传是直接传到onedrive根目录的,可以直接传到我指定的Share文件夹吗,这样又可以在线观看下载了

    1. Rat's
      @John

      指定目录是有规定的,不是想传哪个文件夹就哪个,所以我一般没说明,直接根目录。

      1. John
        @Rat's

        嗯嗯,谢博主!我其他目录有私人文件,想做个共享站来着,都转移了,放根目录了

        1. Rat's
          @John

          如果用的oneindex的话,是可以给文件夹加密的。

          1. John
            @Rat's

            嗯嗯,了解那个了,不过是在我部署好之后,懒得搞了,对了博主你这个https://down.moerats.com资源站用的什么?

            1. John
              @John

              Directory Lister吗?

              1. Rat's
                @John

                对的,教程在博客自行搜索。

  10. John

    感谢!搞定自动上传问题了!

    1. 小志
      @John

      怎么搞定的我的怎么不上传

  11. AA

    ./onedrive /root/1.txt
    An error has occurred while uploading '/root/1.txt' (Code: 000)

    一直这个错误

    1. Rat's
      @AA

      你用的自己申请的参数?

      1. AA
        @Rat's

        是的,跟教程里完全一样啊,密钥也没有出现+号,为什么呢。

        1. Rat's
          @AA

          出现+几率是随机的,你直接用默认的参数,我就是看见很多新申请的API有问题,就留了个默认的。

  12. 布丁

    我想问下 就是这个支持免费申请的edu 5T onedrive不 不会是要全局管理员帐号吧

    1. Rat's
      @布丁

      不要管理员账号,非个人账号就行。

  13. AA

    安装脚本没反应!
    wget --no-check-certificate -q -O /tmp/OneDrive.sh "https://raw.githubusercontent.com/iiiiiii1/OneDrive/master/OneDrive.sh" && chmod +x /tmp/OneDrive.sh && bash /tmp/OneDrive.sh

    1. Rat's
      @AA

      是这样的。

  14. CC

    报错
    /root/.aria2/oneindexup.sh: line 5: [: -eq: unary operator expected
    大佬求解答

    1. CC
      @CC

      一键脚本报错,./onedrive手动上传正常

      1. Rat's
        @CC

        脚本在我这测试正常的,你可以把脚本里的 -eq 改成 ==双等号。

  15. Adee

    怎么直接把文件夹内所有文件上传到ONEDRIVE呢?

    1. Rat's
      @Adee

      好像不能直接,要么手动,要么用for写个脚本。

  16. L

    登录
    抱歉,登录时遇到问题。

    AADSTS90014: The request body must contain the following parameter: 'client_id'.

    1. Rat's
      @L

      你重新下载脚本,就在前2到3分钟我修复了下脚本,使用rm -rf /usr/local/etc/OneDrive/*删除下。

  17. Quarter

    上传显示错误为 Previous code: 000,一直上传失败,看不懂错误是什么,请大佬指教

    1. Rat's
      @Quarter

      用的是脚本提供的参数还是自己的?

      1. Quarter
        @Rat's

        aria2.sh 脚本的log日志显示的是这个错,自己直接 onedrive -d /root/test,也是报这个错,看不懂这个错在哪里

        1. Rat's
          @Quarter

          抱歉,之前脚本里有个路径填错了,现在修复了,你重新下载脚本吧。

  18. 君柯

    好麻烦,头好大,为了小姐姐不值得。。。

    1. Rat's
      @君柯

      参数都已经提供了,就不麻烦了。

  19. KK

    没有权限

    1. Rat's
      @KK

      具体哪里没权限。

      1. KK
        @Rat's

        打开最后那个onedrive -a页面,就提示返回或者使用管理员账号。

        1. Rat's
          @KK

          这不需要管理员账号的,你重新安装脚本再试试,我修改了点东西。

          1. KK
            @Rat's

            Something went wrong, here is the API response:

            我已经把+改成了%2B

            1. Rat's
              @KK

              就用脚本默认的参数吧。

              1. KK
                @Rat's

                /usr/local/etc/OneDrive/onedrive-authorize: line 14: curl: command not found Something went wrong, here is the API response

                同样的问题,然后发现教程中少了一步,应该安装curl,然后解决了

                1. Rat's
                  @KK

                  这个失误,我测试的时候都自带curl就没太注意这个,这个是验证API必需的。

                  1. KK
                    @Rat's

                    博主,这个脚本是不是上传完了不自动删除?

                    1. Rat's
                      @KK

                      自动删除。