前言
使用 Rclone 给 OneDrive 传输文件时可能会遇到速度非常慢、断联等一些问题,其根源是触发了 OneDrive API 的限制,而默认的 Rclone 内置 API 由于非常多人在同时在使用所以这些问题也就愈发明显。使用自建的私有 API 连接 OneDrive 可大幅改善这些情况,而且对于三个月的 Office 365 E5 开发者试用版,平时偶尔用用 Rclone 还会有自动续订的可能性,比起刻意刷 API 的方式更为安全和稳定。此外自建的 API 还可以给其它的账号和其它应用使用。
TIPS: Google Drive 自建 API 参见 GoIndex 教程。
速度测试
前者为使用 Rclone 自带 API ,后者为自建 API ,可以很明显的看出速度相差了 10 多倍。
创建 OneDrive API
获取 Client ID
- 进入 Microsoft Azure 应用注册页面。点击
新注册
。
- 名称随意,账户类型选择最后一个,重定向 URL 填写
http://localhost
。
- 创建成功后你会看到 Client ID(客户端 ID),复制并保存好。
获取 Client secret
- 点击
证书和密码
,按照图中序号的顺序操作添加密码。
- 然后你会看到 Client secret(客户端密码),复制并保存好。
设置 API 权限
- 点击
API 权限
,按照图示进行操作,添加Files.Read
、Files.ReadWrite
、Files.Read.All
、Files.ReadWrite.All
、offline_access
、User.Read
这些权限。
- 最后确认下权限是否添加完整。
获取 token
- 在本地电脑上下载 rclone。
- 以 Windows 为例子,解压并进入
rclone.exe
所在文件夹,在资源管理器地址栏输入cmd
,回车就会在当前路径打开命令提示符。 - 替换以下命令中的
Client_ID
、Client_secret
并执行。
rclone authorize "onedrive" "Client_ID" "Client_secret"
接下来会弹出浏览器,要求你登录账号进行授权。授权完后命令提示符窗口会出现以下信息:
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
{"access_token":"xxxxxxxxxxxxxxxxxx","expiry":"2020-02-22T21:18:39.5036298+08:00"}
<---End paste
{"access_token":"xxxxxxxxxxxxxxxxxx","expiry":"2020-02-22T21:18:39.5036298+08:00"}
整个内容(包含括号)就是 token ,复制并保存好。
Rclone 连接 OneDrive
输入 rclone config
命令,会出现以下信息,参照下面的注释进行操作。
点击查看
TIPS: 因为 RCLONE 会时不时进行更新,当你看到这篇教程时菜单选项可能已经发生了略微的改动,但大致思路不会变,不要无脑照搬操作。
$ rclone config
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n # 输入 n,新建
name> od-e5-api # 输入网盘名称,类似于标签,用于区分不同的网盘。
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
1 / 1Fichier
\ "fichier"
2 / Alias for an existing remote
\ "alias"
3 / Amazon Drive
\ "amazon cloud drive"
4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
\ "s3"
5 / Backblaze B2
\ "b2"
6 / Box
\ "box"
7 / Cache a remote
\ "cache"
8 / Citrix Sharefile
\ "sharefile"
9 / Dropbox
\ "dropbox"
10 / Encrypt/Decrypt a remote
\ "crypt"
11 / FTP Connection
\ "ftp"
12 / Google Cloud Storage (this is not Google Drive)
\ "google cloud storage"
13 / Google Drive
\ "drive"
14 / Google Photos
\ "google photos"
15 / Hubic
\ "hubic"
16 / JottaCloud
\ "jottacloud"
17 / Koofr
\ "koofr"
18 / Local Disk
\ "local"
19 / Mail.ru Cloud
\ "mailru"
20 / Mega
\ "mega"
21 / Microsoft Azure Blob Storage
\ "azureblob"
22 / Microsoft OneDrive
\ "onedrive"
23 / OpenDrive
\ "opendrive"
24 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
\ "swift"
25 / Pcloud
\ "pcloud"
26 / Put.io
\ "putio"
27 / QingCloud Object Storage
\ "qingstor"
28 / SSH/SFTP Connection
\ "sftp"
29 / Transparently chunk/split large files
\ "chunker"
30 / Union merges the contents of several remotes
\ "union"
31 / Webdav
\ "webdav"
32 / Yandex Disk
\ "yandex"
33 / http Connection
\ "http"
34 / premiumize.me
\ "premiumizeme"
Storage> 22 # 选择 Microsoft OneDrive ,截止2020年2月23日序号为 22
** See help for onedrive backend at: https://rclone.org/onedrive/ **
Microsoft App Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id> # 输入 Client Id (客户端 ID)
Microsoft App Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret> # 输入 Client Secret (客户端密码)
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n # 输入 n
Remote config
Make sure your Redirect URL is set to "http://localhost:53682/" in your custom config.
Use auto config?
* Say Y if not sure
* Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n # 输入 n
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine (same rclone version recommended) :
rclone authorize "onedrive" "client_id" "client_secret"
Then paste the result below:
result> {"access_token":"XXXXXXXXX","expiry":"2020-02-22T21:18:39.5036298+08:00"} # 输入 token
Choose a number from below, or type in an existing value
1 / OneDrive Personal or Business
\ "onedrive"
2 / Root Sharepoint site
\ "sharepoint"
3 / Type in driveID
\ "driveid"
4 / Type in SiteID
\ "siteid"
5 / Search a Sharepoint site
\ "search"
Your choice> 1 # # 这里问你要选择的类型,因为是使用 OneDrive ,所以输入 1
Found 1 drives, please select the one you want to use:
0: OneDrive (business) id=xxxxxxxxxxxxxx
Chose drive to use:> 0 # 检测到了网盘,这里编号是 0 ,所以输入 0
Found drive 'root' of type 'business', URL: https://p3terx-my.sharepoint.com/personal/xxxxxx/Documents
Is that okay?
y) Yes
n) No
y/n> y # 问你是否确认,如果没问题则输入 y
--------------------
[od-e5-api]
type = onedrive
client_id = xxxxxxxxxx
client_secret = xxxxxxxxxxxxxxxx
token = {"access_token":"xxxxxxxxxxxxxxxxxx","expiry":"2020-02-22T21:18:39.5036298+08:00"}
drive_id = xxxxxxxxxxxxxxxxxxxxxxxxx
drive_type = business
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y # 最后会显示网盘的配置信息并询问你是否正确,如果没问题则输入 y
Current remotes:
Name Type
==== ====
od-e5-api onedrive
e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q # 输入 q 退出
最后验证一下是否能正常使用,替换以下命令中的od-e5-api
并执行,注意最后有:
(冒号)。网盘中出现test
文件即表示成功。
touch test && rclone move test od-e5-api:
至此,Rclone 已成功使用自建 API 连接到了 OneDrive 网盘。
挂载 OneDrive
如果你需要挂载到本地目录,可以参考博主之前写的挂载教程,这里就不再赘述了。
其它说明
私有 API 局限性
自建私有 API 虽然能改善上传体验,但如果使用过于频繁还是会上传受限。
OneDrive API 限制阈值是多少?
微软没有明确说明 OneDrive API 的限制,以下为官方文档原文:
根据使用情况,我们会对阈值进行微调,以便用户可以使用最大数量的资源,而不会降低可靠性和性能。
通过查看其它类型的 API 限制说明可以猜测到的是有总次数和频率这个两种限制。总次数是指一天内所能调用的次数,而频率为每分钟所能调用的次数。而一旦达到限制阈值,那么就会限制文件的上传。
既然无法从官方文档中获得准确数值,那么是否能通过实际测试来获得这个准确数值呢?答案是否定的。在实际测试中并没有发现任何规律,所以说是这个限制是动态调节的,也符合官方文档的说明。
如何避免 OneDrive API 受限?
不要在短时间内上传过多的文件,文件大小无所谓,关键在于文件数量。
关于 Office 365 E5 自动续订
根据博主几年的开发者试用版使用经验来看,只要你使用自建的私有 API 就可能续订,至于频率并没有一个标准,也并不是越多越好。刻意刷 API 可能得不偿失,尤其是使用 GitHub Actions ,因为服务器是微软 Azure 的,那么多人以相似的方式无意义的刷 API 想要识别是非常容易的。
参考资料
Rclone Documentation - Microsoft OneDrive
本文作者:P3TERX
本文链接:https://p3terx.com/archives/rclone-connect-onedrive-with-selfbuilt-api.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
博主你好,我是在自己家的主机上搭建的rclone挂载,使用了私有API后速度依旧没有提升,我主要想要下载速度的提升来满足在线播放,最好有类似IDM的多线程技术,我发现在onedrive的web界面预览视频速度还可以,但是rclone挂载到本地再播放,就会很卡,没法拖动进度条,请问我该怎么做?
用alist挂webdav吧,302到资源实际地址,跟你预览一样的
博主你好,按你的方法设置成功了,但是token的时效只有一两小时,是不是现在新建的api已经无法长期使用了?有没有能自动刷新token的方法?
博主你好,请问微软E5账号注册的时候所选的国家和地区对onedrive的速度有影响吗?我选的为中国,通过自建API挂载rclone上传速度只有1-4M/s。而Google drive挂载rclone却能跑满vps带宽,请问这是onedrive官方的限制还是由于注册账号所选地区的问题?
似乎已经不能分享api给其他全局使用了。那每个全局各自用各自的,Rclone传输也会快吗
博主你好,按照您分享的博文注册应用并挂载成功了,但是token在大约1-2小时左右就失效了,就无法挂载了,必须获取新的token重新配置,也同样很快就无效了,请问这是哪里没搞对,导致token不是长期有效的?
博主你好,我照着一路走下来做了一遍,看配置文件发现token比原来的长,而且也多了应用ID和密钥两行,但是在VPS的上传速度仍然没有改善,是不是我操作不对?请问如何判断自建API是否成功呢?
rclone下载或上传谷歌网盘都是20多M,下载油管能跑到40M 一到OneDrive就慢了
OneDrive下载倒也挺快,能跑到40M,但是上传只有3-4M
hi 博主你好,有一个问题想问下你,现在情况是这样的。我有一个od for bussiness 5T盘 网页版。用网页上传文件的时候可以跑满我家的带宽 (说明我的VPS性能是没问题的)唯一的问题就是会断流。可能是连续上传超过2个G后,再上传就是断流没有速度,而且断流的时候 刷新网盘都没有反应(不是我VPS的问题我用googledrive完全没问题)。
然后我接触了rclone,现在问题来了,用了rclone后(我用的是rclone的UI客户端版本,而且我确定我挂在rclone是没有问题的,我是按照教程来的)上传速度奇慢无比 只有50KB而且还经常断流。
然后看到了自建API,于是我就申请了自己的api,并且获得了secret id这些东西,然后自动会刷新我的token,这时候我的config文件就变了,里面有secret id这些东西,而且我也跳出了网页叫我确认认证我勾选的这些权限。但是结果是依然速度很慢 上传只有50kb,我开启了tcpoverudp,全局翻出去,速度也就200kb。请问这是什么情况。
用网页上传会断?网络问题吧,我就没有这种情况
之前获取过token,创建OneDrive API之后还需要重新获取Token吗?可以直修改rclone中config吗?
需要重新获取,直接修改是无法使用的。
同个账号创建了多个API,会有什么影响么?我测试了一下,自建的API还是会限速,所以多创建了几个,但好像没有用,限速后更换另一个API还是一样会被限速,感觉是限制的是同个账号下的API
嗯嗯,感谢答疑
新建 api 那步。。。普通的 onedrive 帐号(即家庭版)是不支持吗?我注册应用程序的时候上面就显示「此应用程序不会与任何目录关联」,然后到最后一步增加 api 权限的时候,点进去右上角就会提示「遇到身份验证问题」
用某些方法获取到的 5t 微软帐号倒是一切顺利。
普通账号我没试过,不过这个 API 可以给其它账号用,不一定要每一个账号都创建一个。