说明:我们从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 ID
、Secret
、Reply URL
,均需要在/usr/local/etc/OneDrive/onedrive.cfg
文件里修改,参数获取看下面,当然你也可以不用管,直接进行步骤3
。
2、获取参数
先访问Microsoft Azure Management Portal,然后点击左侧菜单栏中的Azure Active Directorg
,选择应用注册,再点击页面上方的新应用程序注册。
输入名称如:OneDrive for Linux
,应用程序类型选择Web应用/API
,填入登陆URL
:https://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脚本也要重新来,和之前不一样。
想问一下。同样的路径的相同文件可以做判断不重复上传吗?现在发现一个文件夹中上传的话,相同的文件还会重新上传一遍。有没有可能重复文件就跳过呢?
上传命令运行一次后,直接删掉文件夹?
我的意思是vps和onedrive相同路径下的文件重复上传到话。可以跳过吗?比如vps 有 a/b/test.txt文件。onedrive也有相同的a/b/test.txt。能不能在上传到时候已存在的文件可以跳过,不需要再重新上传一次。
这个没办法,上传命令只运行了一次,会不会是一个文件下了几次?
[#9d2c64 0B/9.7MiB(0%) CN:1 DL:0B]
FILE: /usr/local/caddy/www/aria2/Download/WinSCP-5.13.4-Setup.exe[#9d2c64 0B/9.7MiB(0%) CN:1 DL:0B] [FileAlloc:#9d2c64 0B/9.7MiB(0%)]
[#9d2c64 336KiB/9.7MiB(3%) CN:1 DL:333KiB ETA:28s]
[#9d2c64 2.3MiB/9.7MiB(23%) CN:1 DL:1.1MiB ETA:6s]
10/30 12:11:22 [[1;32mNOTICE[0m] Download complete: /usr/local/caddy/www/aria2/Download/WinSCP-5.13.4-Setup.exe
Could not execute user command: /root/GDupload.sh: No such file or directory
这上传错误啥意思?
上传脚本不存在,或者没给root权限。
已解决,谢谢博主
大佬。脚本是不是更新了。重新走了一遍流程安装了一遍,然后这次bt下载完后不会自动删除上传完的文件了。而且脚本好像和以前不一样了
脚本和网上公开的的都不一样了,不过做了很多细节判断,刚刚改了下脚本参数,应该可以上传文件夹了?
重新设置过后会删除了,应该是我操作不当的原因!感谢你的脚本!
我刚刚测试也是删除不了文件,请问你是怎么设置的?
你好,在用了29号更新的脚本后,下载完东西可以上传到oneindex,但是却不会自动删除VPS里的文件,请问是脚本的问题还是设置的问题?
脚本应该是没问题的,只是强化了细节。
我是带有一层文件夹。可以正常上传。但是vps里文件没有删除。单个文件上传和删除正常。博主有遇到吗
已修改,你再试试文件夹能不能上传?
博主,刚刚测试。百度云下载一个文件,带一层文件夹。aria2下载完成之后,在下载目录中该文件是放在一个文件夹中的。文件夹和文件都能成功上传到onedrive,但是vps中aria2下载目录下,文件和文件夹都还在。没有删除掉。
你是用的我今天更新的脚本?这个理论上mv成功后,就会自动rm。
大佬,我也用的30号的脚本,和他的情况一样,种子,下好所有文件能上传,但是不会自动删除vps硬盘里的文件。
脚本逻辑是没问题的,或者你把后面这行判断代码删掉if [[ $? == '0' ]]; then,就是不管上传成功与否,文件都给删掉。
大佬, 这个脚本下载单个文件上传onedrive没有问题, 用bt 下载的时候, onedrive里面没有文件, vps 里面下载完的文件也被删掉了. 这个应该是什么问题? 可以查log 吗? 需要去哪看log 呢?
补充下, 下载小文件没问题, 就是好像超过3g 的文件就上传不了?
用的什么Aria2脚本?你可以查看Aria2日志
就是教程里的逗比的aira2 脚本, aira2 日志应该要去哪里查看?
这个运行一键脚本的时候善于观察,你直接运行他的脚本的时候,有查看日志选项。
找到日志了. 貌似还没上传就被删掉了? 我现在把删文件那段注释掉再试试
10/27 12:45:20 [[1;32mNOTICE[0m] Download complete: /download/屋顶探险家.Look.Up.2017.1080p.WEB-DL.X264.AAC.CHT-BTxiaba
10/27 12:45:20 [[1;32mNOTICE[0m] Your share ratio was 2.3, uploaded/downloaded=4.3GiB/1.8GiB
An error has occurred while uploading '/download/屋顶探险家.Look.Up.2017.1080p.WEB-DL.X264.AAC.CHT-BTxiaba' (File does not exist)
当BT下载只有一个文件夹,文件夹里只有一个文件,这个上传脚本就会出错了
num=1
path='/download/a/1.a'
downloadpath='/download' #下载目录
文章所有脚本已更新,你再看看。
自己改了下之前的脚本 现在上传没问题了,懒得再折腾了
可以试试现在这个脚本,加强版。
需要更新onedrive, 还是只需要换上传脚本就可以?
还有个问题, 输入框的狗年吉祥对手机很不友好, 把输入框都遮住了.
全部更新。
[OK] SSL 证书生成脚本安装成功
[Sun Oct 28 02:42:20 CST 2018] Standalone mode.
[Sun Oct 28 02:42:21 CST 2018] Registering account
[Sun Oct 28 02:42:22 CST 2018] Registered
[Sun Oct 28 02:42:22 CST 2018] ACCOUNT_THUMBPRINT='RY4tuAQX0ce-xByOiRX4HSfPUw73QmqCRVa6-F00bV4'
[Sun Oct 28 02:42:22 CST 2018] Creating domain key
[Sun Oct 28 02:42:22 CST 2018] The domain key is here: /root/.acme.sh/120.78.80.232_ecc/120.78.80.232.key
[Sun Oct 28 02:42:22 CST 2018] Single domain='120.78.80.232'
[Sun Oct 28 02:42:22 CST 2018] Getting domain auth token for each domain
[Sun Oct 28 02:42:22 CST 2018] Getting webroot for domain='120.78.80.232'
[Sun Oct 28 02:42:22 CST 2018] Getting new-authz for domain='120.78.80.232'
[Sun Oct 28 02:42:23 CST 2018] The new-authz request is ok.
[Sun Oct 28 02:42:23 CST 2018] new-authz error: {"type":"urn:acme:error:malformed","detail":"Error creating new authz :: Issuance for IP addresses not supported","status": 400}
[Sun Oct 28 02:42:23 CST 2018] Please add '--debug' or '--log' to check more details.
[Sun Oct 28 02:42:23 CST 2018] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
[Error] SSL 证书生成失败
大佬。这个怎么解决啊,阿里云的只有公网ip
Aria2+Aria2Ng+OneIndex一键安装脚本,下载后自动上传至OneDrive
是这篇文章里的
看着提示不支持ip地址的能不能跳过这个ssl证书安装啊,谢谢大佬了
IP不支持签发SSL证书,可以跳过,但需要修改脚本,不过一个域名不贵啊,两三块钱一年。
试了下 拿掉删除文件的部分还是出现同样的错误,好像是脚本把文件夹路径当成了文件上传,所以找不到文件?大佬能不能看下脚本会不会有这个问题?
脚本全部更新了,你再看看?
按照步骤操作已经提示了It seems like we have a refresh token, so we are ready to go
上传还报错
[root@centos-s-1vcpu-1gb-blr1-01 OneDrive]# ./onedrive /root/moerats.txt
An error has occurred while uploading '/root/moerats.txt' (Code: 000)
你测试上传的时候有moerats.txt这个文件?
有的,上传其他文件也失败
这个问题,我只在这三个参数Client ID、Secret、Reply URL有误的情况下出现过,我提供的应该没啥问题,你先检查下,有空我自己测试下。
博主你好,能不能在自动上传脚本里添加个命令,上传完成后执行更新PyOne的缓存呢?应该怎么添加?
添加到上传命令后面,比如/usr/local/etc/OneDrive/onedrive "$1"的下面一排。
大佬,如果做到上传文件夹自己文件夹里面的文件?
什么意思。
不好意思,有错别字。
怎么做到上传文件夹以及文件夹里面的文件到OneDrive上面?