网盘与 OAuth
需要授权的网盘有哪些、两条授权路径怎么走、令牌如何续期与落库,国内网盘如何经自部署的聚合服务以 WebDAV 接入,以及网盘渠道的固有限制。
支持的网盘
「新建渠道」选类型时,「网盘」分组里除了通用 WebDAV 之外,还有 6 个需要 OAuth 授权的模板:
| 模板 | rclone 后端 | 专属字段 |
|---|---|---|
| OneDrive | onedrive | 区域 |
| Google Drive | drive | — |
| Dropbox | dropbox | — |
| pCloud | pcloud | 数据区域 |
| Box | box | — |
| Yandex Disk | yandex | — |
专属字段之后,6 个模板都依次是「应用 Client ID」「应用 Client Secret」「授权」「存储目录」:
- 区域(OneDrive):「国际版」「美国政府云」「德国云」「中国世纪互联」,决定授权与接口端点,要与账号所属区域一致。
- 数据区域(pCloud):「美国」或「欧洲」,要与注册账号时所选区域一致,否则换取令牌失败。
- 应用 Client ID / 应用 Client Secret:在服务商开放平台自建的 OAuth 应用的标识与密钥。一键授权必须先填 Client ID;粘贴令牌时,令牌若是用自建应用取得的,也要填这两栏;用 rclone 内置应用取得的令牌两栏留空。令牌续期用的就是这两项,必须与签发令牌的应用一致。两者随渠道配置加密保存,编辑时显示为掩码。
- 授权:令牌,由下面两条授权路径之一填入,未授权不能保存。
- 存储目录:网盘里存放图片的目录,默认提示
imgyoung;留空存放在根目录。
授权所需的端点、权限范围与 rclone 内置的应用标识都取自 rclone 后端自身的注册信息,ImgYoung 不为各家单独编码。
OneDrive 的驱动器:拿到新的授权后,保存或测试连接时,ImgYoung 按 rclone 自身的配置流程走完授权之后的步骤,每一问都取默认答案:选定账号的默认驱动器,写下 drive_id 与 drive_type,与 rclone config 逐题取默认值时的选择一致。向服务商查询失败时,保存返回 400,测试连接显示原因。编辑时沿用已存授权,不会重新选择。要用 SharePoint 文档库或其他驱动器,见OneDrive 的其他驱动器。
pCloud 的令牌:pCloud 的令牌永不过期(到期时刻为零值),不带刷新令牌,照常可以保存。
授权方式一:粘贴令牌
在任意一台有浏览器的电脑上用 rclone 取得令牌,再粘贴到表单。ImgYoung 所在的服务器不需要公网域名,这是没有域名的部署唯一可行的方式。
在有浏览器的电脑上安装 rclone,执行表单里提示的命令(以 Google Drive 为例):
rclone authorize "drive"浏览器会打开服务商的登录与授权页,完成授权。
终端输出形如:
Paste the following into your remote machine --->
{"access_token":"…","token_type":"Bearer","refresh_token":"…","expiry":"…"}
<---End paste把两行标记之间的内容整段复制。
在表单的「授权」一栏切到「粘贴令牌」,粘贴进去,填好其余字段,点「测试连接」后保存。
- 令牌 JSON 与 rclone 编码后的配置串(
rclone authorize带配置串参数时的输出)都能识别,ImgYoung 从中取出令牌。 - 会过期的令牌必须带刷新令牌,否则访问令牌过期后无法续期,保存时返回
渠道参数非法: 缺少刷新令牌,访问令牌过期后无法续期(字段 token);永不过期的令牌(如 pCloud)不需要。内容无法解析时返回渠道参数非法: 令牌格式非法(字段 token)。 rclone authorize "<后端名>"取得的令牌由 rclone 内置应用签发,「应用 Client ID」「应用 Client Secret」留空,rclone 续期时同样用内置应用。- 想用自建应用,执行
rclone authorize "<后端名>" <Client ID> <Client Secret>(自建应用要登记 rclone 的本机回调地址http://127.0.0.1:53682/),再把同一个应用的 Client ID 与 Client Secret 填进表单。
授权方式二:后台一键授权
在后台里直接走完 OAuth 授权码流程。它要求自建应用,因为 OAuth 的回调地址必须事先在服务商处登记,而 rclone 内置应用登记的只有本机回环地址,浏览器回调打不到远程服务器。
在「设置 → 运行配置 → 访问与链接 → 对外站点地址」填好 ImgYoung 的对外地址,如 https://img.example.com。未填写时,发起授权返回 一键授权需先在设置中填写对外站点地址;或改用粘贴令牌方式。
到服务商的开放平台创建应用,把回调地址登记为对外站点地址加固定路径:
https://img.example.com/api/admin/channel-oauth/callback两边必须逐字符一致(协议、域名、端口、路径都算)。
在表单里「授权」一栏上方的「应用 Client ID」「应用 Client Secret」填好自建应用的凭证,再在「授权」一栏的「一键授权」里点「前往授权 …」。没填 Client ID 时这个按钮不可用。浏览器会新开一页进入服务商授权页。
授权完成后回调页显示「授权成功,请回到后台继续。」,表单的「授权」一栏变为「已授权」,保存即可。
- 回调接口要求管理员登录态,授权要在已登录后台的同一个浏览器里完成。
- 一次授权会话 10 分钟内有效,表单最多等待约 11 分钟,超时提示「等待授权超时,请重新发起」。
- 令牌不写进回调页面,由表单凭一次性标识领取,只能领取一次。
- 换取令牌失败时表单显示
换取令牌失败,请核对应用凭证与回调地址;在服务商页面拒绝或取消时显示授权被拒绝或取消:加服务商返回的原因。 - 编辑已有渠道时重新授权,应用凭证两栏保持掩码即沿用已存的值。
- Client ID 与 Client Secret 随渠道保存,令牌到期后 rclone 用同一个应用续期。
令牌续期与落库
- 后端参数以映射直接交给 rclone,映射上挂了写回回调。访问令牌临近过期时,rclone 自己刷新,并通过回调写回新令牌;ImgYoung 立即用主密钥加密并存入渠道配置。rclone 在运行中写回的其他参数也走同一条路径。
- 落库失败只记日志(
后端写回参数无法落库),内存里继续使用新令牌;进程重启后会退回元数据库里的旧令牌。 - 保存渠道时临时构造的后端如果刷新了令牌,新令牌随配置一起落库。
- 测试连接时令牌被刷新,分两种情况:
- 沿用的已存令牌(编辑时「授权」一栏保持「已授权 · 沿用已存令牌」)被刷新,新令牌直接写回该渠道。
- 本次表单里提交的令牌被刷新(测试失败时也可能发生),新令牌交还给表单:测试结论下方提示「服务商在测试时刷新了授权令牌,表单已换用新令牌,保存时提交的就是它;原令牌可能已失效。」,「授权」一栏显示「已授权」,之后保存提交的就是新令牌。自定义模式下新令牌写进后端参数的
token一行。
- 只有一个刷新者:ImgYoung 不另设刷新循环。有些服务商每次刷新都会作废旧的刷新令牌,两个刷新者会互相作废对方的令牌。周期轻探测(默认每 60 秒)发出的只读请求足以让 rclone 按时刷新。
- 编辑网盘渠道时,「授权」一栏显示「已授权 · 沿用已存令牌」,保持不动即沿用;点「重新授权」可以换一个令牌。
- 导出的 rclone 配置文件里也带着令牌。ImgYoung 仍在使用该渠道时不要拿这个文件去用:Box 这类服务商的刷新令牌只能用一次,两边会互相作废对方的令牌。ImgYoung 刷新令牌之后,文件里的令牌就过时了,需要重新导出。
保存失败时刷新出的令牌会丢失
创建或编辑渠道时,如果保存最终失败(参数非法、试构造失败、OneDrive 选定驱动器时查询失败、渠道名重复等),保存过程中服务商刷新出的新令牌既不落库,也不交还表单。对 Box 这类刷新令牌只能用一次的服务商,原令牌随之作废,只能重新授权。先点「测试连接」再保存能降低这种风险:测试时刷新出的令牌会交还表单,保存时用的已是新令牌。
OneDrive 的其他驱动器
模板只会选定账号的默认驱动器。要用 SharePoint 文档库或其他驱动器,在「新建渠道 → 高级 → 自定义」里手填 drive_id 与 drive_type。
先在有浏览器的电脑上用 rclone config 交互地新建一个 OneDrive remote,在选择驱动器的步骤里选中目标驱动器,再查看它写下的参数:
rclone config
rclone config show onedrive-tmp把输出里的值填进自定义表单:
| 键 | 值 |
|---|---|
| rclone 驱动 | onedrive |
token | rclone config show 输出的 token |
drive_id | 同上 |
drive_type | 同上(personal、business 或 documentLibrary) |
region | 非国际版账号才需要:us、de 或 cn |
client_id、client_secret | 只在 rclone 里用了自建应用时需要 |
path | 存放图片的目录,如 imgyoung |
自定义模式里令牌原样保存,需要重新授权时替换 token 的值。保存后删除本机的临时 remote,避免两处同时刷新同一个令牌:
rclone config delete onedrive-tmp国内网盘:经自部署的聚合服务以 WebDAV 接入
rclone 没有阿里云盘、百度网盘、115、夸克等国内网盘的后端。能对接它们的开源聚合服务(如 Alist 一类)采用 AGPL-3.0 许可证:把它们的代码移植进 ImgYoung,会让本项目整体被迫转为 AGPL,还要长期自行跟进这些网盘的接口与风控变化。
因此 ImgYoung 不移植,而是由你自行部署这类聚合服务、让它对外提供 WebDAV,ImgYoung 用通用 WebDAV 模板接入。两者是独立进程、只通过网络协议交互,许可证不会传染,网盘接口的维护也留在上游。
按聚合服务自己的文档部署它,挂载要用的网盘,并开启 WebDAV。
为 ImgYoung 建一个专用账号,给它读、写、删除权限。深探测、每日对账与渠道清理都要删除对象,缺删除权限的渠道无法通过深探测。
在 ImgYoung 新建 WebDAV 渠道:「服务地址」填聚合服务的 WebDAV 地址(Alist 为 https://域名/dav/),「服务类型」选「其他(坚果云 / Alist / 群晖等)」,填账号密码;「存储目录」填该网盘在聚合服务里的挂载路径下的一个专用目录。
点「测试连接」确认写、读、删都通过,再设一个低于对象存储渠道的优先级,保存。
网盘渠道的固有限制
- 恒走代理:网盘普遍不提供稳定的公开直链,网盘模板没有「公开访问地址」,表单也不显示「允许 302 直链」与「自动创建存储桶」。即使访问模式是
redirect,网盘上的图片也经 ImgYoung 代理输出。 - 频率与流量限制:网盘对请求频率与流量的限制远严于对象存储,图片访问量大时容易被限流或触发风控。周期轻探测会对每个渠道每轮发一次只读请求。
- 全量镜像:与其他渠道一样,网盘渠道最终要存下全站全部图片。
因此网盘更适合作低优先级的备份渠道:把它的优先级设得低于对象存储渠道,平时只承接异步补齐;主渠道异常时,访问才会切到它。这一取舍完全通过优先级表达,见渠道与容灾。