因为白嫖到了微软的开发人员E5订阅,有了一个Office365账号,于是心想着拿来搞搞事,就开始了长达一天的徒劳的折腾。
搭建aria2下载自动上传OneDrive!
目标
其实在以前我就试着搭建但是失败了……
Oneindex的搭建
在很久以前的某一天看到了搭建Oneindex的教程,就是把自己的OneDrive塞进你网页里面,可以更方便地分享使用网盘。于是我就按照网盘的步骤慢慢来。
首先新建网站,从GitHub下载Oneindex解压到网站目录。
然后在微软的一个控制台登入了自己的账户:
点击新注册
- 名称我就随便填了;
- 选择“任何组织目录中的账户和个人Microsoft账户”;
- 重定向URL可以不填,填的话可以是:https://pyoneauth.github.io/

在这里可以看到自己的应用程序(客户端吧)ID,复制保存。然后在左侧点击API权限,选择添加权限:Microsoft Graph - > 委派的权限 -> Files -> Files.ReadWrite和Files.ReadWrite.All -> 添加权限

回到概述页面,点击证书和密码,选择新客户端密码,添加密钥,说明随便填了一个。然后截止期限我选了永久,怕到时候到期了失效,自己却不知道是哪的问题。然后复制密钥。

打开网站,填写刚刚得到的ID和密钥,下一步就会自动跳转到微软授权。到这里我就卡住了,无论怎么样怎么样都会登入失败。

原因就是我用的是学校的账户,我用学校教育邮箱注册的微软账户虽然是教育A1订阅,但是学校没有专门的管理员,所以我没有权限来开放这个API等等等等,所以失败了。
warning 警告
一般大学教育邮箱注册的微软账户是无法使用pyone或者Oneindex的。
后来我不死心,花一块钱淘宝把自己个人OneDrive升级到了15G然后做成了网盘。这次成功了。注意,上面说了那么多其实有简单的方法。解压完Oneindex以后直接打开网站,点击上面的获取应用ID和机密,登入自己的微软账户可以直接获得密钥,然后回到微软控制台往下翻就能翻到ID,复制一下就可以了,之后照旧。
aria2
当时我怎么搭建的我都快忘记了。下面给出了doub制作的脚本,在ssh上直接输入回车,根据提示安装aria2,设置密码即可。
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/aria2.sh && chmod +x aria2.sh && bash aria2.sh
后期如果要对aria进行一些操作,可以在ssh输入:
sudo bash aria2.sh
回到这个页面(好傻)。记得开放6800端口。然后新建网站,下载AriaNg解压到目录,然后打开网站。

这里由于开始安装是http协议所以有些不同但是应该都差不多。然后就连接成功了。之后再Aria2设置里面调整一些细节,比如安装目录和一些下载行为。
自动上传(失败)
根据大部分网友提供的脚本,一般是在/root/.aria/aria2.conf文件末端加上:
on-download-compelet=/目录/脚本.sh
为了方便我就直接把脚本放在了root目录下,即:
on-download-compelet=/root/upload2one.sh
脚本内容是:
#!/bin/bash
path=$3
downloadpath='下载目录'
if [ $2 -eq 0 ]
then
exit 0
fi
while true; do
filepath=$path
path=${path%/*};
if [ "$path" = "$downloadpath" ] && [ $2 -eq 1 ]
then
/www/server/php/版本号/bin/php /Oneindex安装目录/one.php upload:file "$filepath" /upload/
rm -rf "$filepath"
exit 0
elif [ "$path" = "$downloadpath" ]
then
/www/server/php/版本号/bin/php /Oneindex安装目录/one.php upload:folder "$filepath"/ /upload/"${filepath##*/}"/
rm -rf "$filepath"/
exit 0
fi
done
把上面的中文改成自己实际的数据就可以了。然后要把这个脚本的权限改成755,以便aria2可以调用。
至此应该就结束了,讲道理利用aria2下载文件后会临时保存到服务器,然后慢慢上传到OneDrive,然后删除服务器上的文件,但是我试了好多次都无效,直接用ssh运行脚本发现语法错误,可是核对多遍都没错啊?我就去询问一个大佬@viger,原来编辑脚本的时候由于环境问题,里面的换行符错了。一般的Windows操作系统使用CRLF换行符但是Linux使用LF,导致脚本出错。
所以用vim打开脚本,输入:
:set fileformats=unix
回车之后保存文档就不会出错了。使用ssh直接运行却出现了新的错误,第四行的“-eq”出现问题,查证是因为没有参数传递导致运算符出错。一般的解决办法是用:
[[ $2 -eq 0 ]]
代替:
[ $2 -eq 0 ]
但是没必要。于是抱着这次总该成了吧的心态下载了一个东西却发现完全没有上传啊……然后我换了一个脚本。在Oneindex的wiki页面有一个aria2的文档,里面有另一种脚本,分为两步。
首先当然是把aria2.conf里的执行脚本改一下,然后在/root目录创建aria2-one.sh,内容是:
#!/bin/bash
SRC=$3
downloadpath='下载目录'
cd $downloadpath
if [ "$2" == "0" ]; then
echo $1'没有文件'$SRC>> upload.log
exit 0
else
# 删掉些BT中的冗余文件
find "$SRC" -regextype posix-extended -regex ".*\.(chm|torrent|htm|html|url|nfo|jpg|bmp|png|ico|gif)" -exec rm -f {} \;
path=${SRC##*$downloadpath}
echo $1'准备上传'$path>> upload.log
cd $downloadpath
bash upload.sh $path
exit $3
fi
然后再在下载目录创建upload.sh文件,内容是:
#!/bin/bash
function getdir(){
if [ -f $1 ]
then
/www/server/php/版本号/bin/php /Oneindex安装目录/one.php upload:file $1 /share/$1>> upload.log
rm -rf $1
echo '删除上传完成'$1 >> upload.log
exit 0
fi
for element in `ls $1`
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ]
then
getdir $dir_or_file
else
i=`expr $i + 1`
echo $i
echo $dir_or_file
/www/server/php/版本号/bin/php /Oneindex安装目录/one.php upload:file $dir_or_file /share/$dir_or_file >> upload.log
rm -rf $dir_or_file
echo '删除完成.'$dir_or_file >> upload.log
if [ "$i" == "$length" ]
then
rm -rf $root_dir
echo "上传完成">> upload.log
exit 1
fi
fi
done
}
root_dir="$1"
length=` ls -lR $1|grep "^-"|wc -l`
i=0
getdir $root_dir
缩进对脚本没有影响(大概)
这个脚本有一步就是向upload.log文件中写入日志,这样就可以稍微细致一点发现在哪出了问题。为什么要在下载目录里面放置脚本呢,因为第一个脚本的末端:
cd $downloadpath
bash upload.sh $path
就是进入下载目录后才运行上传脚本。然后日志也会放在下载目录里面,这里我就产生了好奇,为什么它不会把脚本和日志一起上传呢?带着这份心情我又用ssh测试了一下,因为没有传参所以失败。但是看aria2.conf里面也没有传参啊,可能是有些不同吧,毕竟里面也没有bash。
然后我下载了一首很小的歌,关掉所有页面,等了十分钟,然后看了看我的OneDrive……空空如也。打开后台,发现下载的文件静静躺在目录没有动,上传日志里面也没有信息,说明脚本没有被运行过。到这里我就累死了。
于是放弃。
总结
最后虽然没有达成目标但是也取得了相当多的成就。现在我可以利用网页预览我的网盘,方便地下载和分享网盘里面的数据。也可以利用下载器快速下载文件到服务器。aria2是有密码的,不知道密码的人即使访问网站也没办法下载东西。
aria2的SSL其实也不难。将网站开启证书后,还要去aria2.conf里面修改一些东西:
# 是否启用 RPC 服务的 SSL/TLS 加密,
# 启用加密后 RPC 服务需要使用 https 或者 wss 协议连接
rpc-secure=true
# 在 RPC 服务中启用 SSL/TLS 加密时的证书文件(.pem/.crt)
rpc-certificate=/证书地址
# 在 RPC 服务中启用 SSL/TLS 加密时的私钥文件(.key)
rpc-private-key=/证书地址
好像还要去AriaNg里面设置一下,具体我也忘记了,详情百度。
闲聊
现在正在家里顶着巨大的压力和网课磨合着,而且也要开始搬家了。和我爸一起拆了半堵墙,从六楼运了大堆砖和水泥碎片到楼下,搬了五箱书到新家……四肢酸痛。
坚强点吧……
对了,我把上课要用的资料都传到网盘里了,而且会一直更新,可以去看看哦。
发表评论