这篇文章其实早就想写了,然而一直放在自己的ToDO list里面,就那么一直放着放着(还有几篇是一样的命运,就开了个头)。然后一看自己快两个月没更新blog了,随便写点上来分享下。
在很早很早之前,我使用过OneIndex以及它的一系列衍生开源项目分享过文件。然而就如同我在 个人仓库 的说明中写的那样,这一系列的开源项目存在一些很麻烦的问题,我之后便开始使用ShareLink的形式创建分享链接的形式来进行分享。
最开始
当然,最早之前,我是用网页端生成共享链接的方式来进行的,然后随便找个短链接生成网站生成个短链接就行。这个方式怎么说那,虽然原始但是可用23333,毕竟文件量少,简单操作下不需要多少时间。

使用rclone link
再后来,我在使用rclone的时候意外发现了rclone link的方法,根据他的介绍,会生成约束最少(没有过期时间,没有密码保护,无需账户匿名即可访问)的链接,也刚好是我需要的链接类型。

这个很棒,从此可以很方便的调用rclone并通过获得输出的形式来获得分享链接。
简单的脚本实例如下:
1 | import subprocess |
通过配合rclone lsjson方法,我们可以快速遍历文件夹,甚至为每一个文件或者文件夹创建链接。
1 | import os |
直接使用python创建
那么如果抛开,或者半抛开rclone(仅refresh仍使用rclone)是否可行?毕竟我们有时候还需要构建其他类型的分享链接。
结论当然是可行的!(不然就没这篇文章了)
官方文档 : Access OneDrive and SharePoint via Microsoft Graph API - OneDrive dev center | Microsoft Docs
根据 文档 说明,创建链接只需要一个简单的POST请求即可,请求地址如下
1 | POST /drives/{driveId}/items/{itemId}/createLink |
而请求的主体部分是一个json字典,通过更改type和scope,我们就可以设定分享链接的类型(注意你所在域的设置),如下
1 | { |
而请求的返回则同样是一个json字典,我们最需要的生成分享链接在 ["link"]["webUrl"] 中
1 | { |
这样我们就只需要知道itemId,就可以通过构造http请求来获得分享链接了,构造的代码段如下
请注意,此处及之后的示例代码均没有考虑token过期,返回错误导致所需字段不存在的异常情况,实际上token有效期只有1小时,如果文件数过多容易过期失效,而且MS的服务器也很容易返回非token过期的其他异常情况
1 | def share_by_id(id_): |
最关键的解决了,我们需要开始知道itemId如何获取,方法也十分简单,通过请求对应文件上层目录就可以获得其children信息,其中就有包括itemId的数据。同样根目录也有对应的请求方法。
简单构造分享两级目录的代码段如下:
1 | # 获得driveid |
driveid通过解析rclone的rclone.conf文件进行获取。此外,如果你自己重申请(refresh) token存在困难(就比如我),refresh token也可以交给rclone来进行。例如:
1 | import json |
2019.12.19更新:
因为OneDrive一次只返回200个子目录结果,所以我们需要对进入创建sharelink之前,通过递归的方式获得所有items,基本代码段如下:
1 |
|
没有了,基本代码就这些,基于这些代码,我是怎么玩的,以及怎么处理异常的就不具体贴出来了~
