前言
使用 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 可以给其它账号用,不一定要每一个账号都创建一个。