最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】找到了更简单的方法去获得skydrive中一个文件的真实链接地址

工作和技术 crifan 6150浏览 0评论

之前写了这个帖子:

用Python脚本去获得skydrive上文件的真实地址链接

其中是用比较复杂的Python脚本去解析出skydrive中文件的真实地址。

当前脚本复杂的原因,除了要解析一堆字符串之外而复杂,也是附加了下载文件,输出文件的各种详细信息而导致的复杂。

此处,经过一番验证,终于更加搞懂了Python中的编码问题,顺带找到了更加简单的办法,去获得一个skydrive中文件的真实永久不变的外链地址,解释如下:

【获得skydrive中一个文件的更简单的方法】

由之前写python脚本处理地址过程分析而得,类似于这样的地址:

https://skydrive.live.com/?cid=9a8b8bf501a38a36&id=9A8B8BF501A38A36%21504

打开后,是可以获得此对应的文件夹下面的各个文件的详细信息的,

对应的上面的那个地址:

https://skydrive.live.com/#cid=9A8B8BF501A38A36&id=9A8B8BF501A38A36%21504

稍微改一下,就可以获得类似的可以获得文件内容的地址了,即:

https://skydrive.live.com/?cid=9A8B8BF501A38A36&id=9A8B8BF501A38A36%21504

而永久的固定文件链接地址,即可以外链的地址,wordpress中可以播放的地址,是这样的:

http://storage.live.com/items/9A8B8BF501A38A36!528?filename=%E6%83%B3%E4%BD%A0%E5%B0%B1%E5%86%99%E4%BF%A1%20-%20%E6%B5%AA%E8%8A%B1%E5%85%84%E5%BC%9F.mp3

其格式为:

http://storage.live.com/items/ + 文件的ID(sid) + ?filename= 编码后的文件名

而此处我们的目的就是,对于任意一个skydrive中的文件,找到上述地址中的

文件ID和编码后的文件名,即可。

此处我们以这个为例:

打开:

https://skydrive.live.com/#cid=9A8B8BF501A38A36&id=9A8B8BF501A38A36%21504

后,对应的是music文件夹,其下有个文件夹domestic,domestic下面有个文件:

想你就写信 – 浪花兄弟

该文件是个mp3文件。以此文件该为例,来说明如何操作:

我这里,已经登录skydrive的前提下,对该文件,点击右键,选择共享,可以获得该文件所对应的不同种类的链接:

(1)查看和编辑:

https://skydrive.live.com/redir.aspx?cid=9a8b8bf501a38a36&resid=9A8B8BF501A38A36!528&parid=9A8B8BF501A38A36!524&authkey=!AASUeOIa-BulkRc

(2)公开链接

https://skydrive.live.com/redir.aspx?cid=9a8b8bf501a38a36&resid=9A8B8BF501A38A36!528&parid=9A8B8BF501A38A36!524

可以看到,不论哪种地址,都包括了该文件的文件ID,此处叫做resid=9A8B8BF501A38A36!528

所以,文件ID=资源resource ID= resid,这个值,我们很容易就可以直接看到了。

而对于另外一个编码后的文件名,即,想你就写信 – 浪花兄弟,编码后的文件名:

%E6%83%B3%E4%BD%A0%E5%B0%B1%E5%86%99%E4%BF%A1%20-%20%E6%B5%AA%E8%8A%B1%E5%85%84%E5%BC%9F

要如何获得呢?

这里,对于不熟悉python的人来说,就要稍微麻烦一点点了。

安装了python后,打开IDLE (Python GUI),即Python Shell,

先输入:

import urllib

以导入urllib库,再输入:

urllib.quote(“想你就写信 – 浪花兄弟”.decode(‘gbk’).encode(“utf-8”))

就可以获得对应的编码后的文件名了:

‘%E6%83%B3%E4%BD%A0%E5%B0%B1%E5%86%99%E4%BF%A1%20-%20%E6%B5%AA%E8%8A%B1%E5%85%84%E5%BC%9F’

所以,总结如下。

对于想要获得一个文件的永久外链地址:

在登陆自己的skydrive的情况下,右击击该文件,选择共享,然后找到对应的查看和编辑或公开链接类似的链接地址,

找到其中sid的值,即类似于resid=9A8B8BF501A38A36!528中的9A8B8BF501A38A36!528

然后在去打开IDLE (Python GUI),先输入import urllib,回车后,再输入:

urllib.quote(“该文件的文件名”.decode(‘gbk’).encode(“utf-8”))

即可获得编码后的文件的文件名了

这样,再去对照着:

http://storage.live.com/items/ + 文件的ID + ?filename= 编码后的文件名

组合一下,就合成了该文件的永久固定链接,就可以用于各种外链了。

再举例来说,对于我上传到skydrive的一个文件:Rap(Ice ice baby)Mix – Lucky Sunday.mp3,然后点击右键,选择共享,可以看到Share “Rap(Ice ice baby)Mix – Lucky Sunday.mp3″,选择Get a link,可以得到这样的地址:

https://skydrive.live.com/redir.aspx?cid=9a8b8bf501a38a36&resid=9A8B8BF501A38A36!529&parid=9A8B8BF501A38A36!526

然后可以获得对应的sid:

9A8B8BF501A38A36!529

然后把文件名:

Rap(Ice ice baby)Mix – Lucky Sunday.mp3

去编码转换,得到:

Rap%28Ice%20ice%20baby%29Mix%20-%20Lucky%20Sunday.mp3

最终就可以得到永久的可以下载,可访问的外链了:

http://storage.live.com/items/9A8B8BF501A38A36!529?filename=Rap%28Ice%20ice%20baby%29Mix%20-%20Lucky%20Sunday.mp3


【后记 2012-01-12】

对于上述中所提到的,获得一个(尤其是包含中文和其他特殊字符的)字符串的编码后的形如%XX的内容,用上述介绍的urllib.quote函数处理的方法,毕竟还是开发人员才能搞定的,所以此处就想要实现在线就支持转换的功能。

目前,虽然界面和用法不是那么好,但是功能已经实现,大家就凑合用吧。

输入要编码的字符串:


 

输入要解码的字符串:


【后记 2012-01-16】

后来发现,网上之前就有人通过javascript实现了对应的歌曲外链了:

最新获取SkyDrive音乐外链mp3地址方法20111218

此处也就暂时用其制作的网页:

获取SkyDrive上的MP3音乐外链

有空再去折腾用其他php等语言实现对应的页面。

 

【后记 2012-03-02】

后来在给WLW写dll插件的过程中,无意间发现,其实关于skydrive上面的文件的真实地址,比上面所说的:

http://storage.live.com/items/ + 文件的ID(sid) + ?filename= 编码后的文件名

更为简单,只需要前半部分即可:

http://storage.live.com/items/ + 文件的ID(sid)

关于这点,是我在上传一个图片文件,名为.Net.jpg而发现的。

当时调试的时候,创建.Net.jpg这一文件名的时候,返回的结果是bad request,invalidPath,即skydrive中不允许文件名的第一个字符是点(.),所以后来就把文件名的首字符的点改为下划线(_),然后就可以创建并上传文件了,但是却不小心把文件的真实地址/永久链接,写成了:

http://storage.live.com/items/9A8B8BF501A38A36!958?filename=.Net.jpg

而实际上按照之前的逻辑,应该是:

http://storage.live.com/items/9A8B8BF501A38A36!958?filename=_Net.jpg

才对。即文件名部分应该是已经上传的文件的文件名_Net.jpg才对而不是改名之前的.Net.jpg,

并且用浏览器登录skydrive中看到的上传的文件,也是_Net.jpg而不是.Net.jpg,但是有意思的现象就出现了,实际上:

http://storage.live.com/items/9A8B8BF501A38A36!958?filename=.Net.jpg

也是可以访问该_Net.jpg文件的,即文件名是错的,但是仍可以访问该文件,所以按照此逻辑,就故意改了别的错的文件名,比如:

http://storage.live.com/items/9A8B8BF501A38A36!958?filename=fakeName_test.txt

结果仍是可以正常访问该图片的,而且用IE9的F12去抓取出来的结果,也是验证了上面的结果。

即只要文件的resid,即上面的9A8B8BF501A38A36!958是对的,那么skydrive的文件存储服务器那端,是不管你的http的url请求中的filename的,还是会返回对应的文件的真实内容的。

然后就又试了:

http://storage.live.com/items/9A8B8BF501A38A36!958

也是可以访问该文件的。

因此,才得到上面的结论的。

Skydrive中,一个文件的真实地址/永久链接地址,最短可以写为:

http://storage.live.com/items/ + 文件的ID(sid)

即,这种的地址

http://storage.live.com/items/9A8B8BF501A38A36!958

即可。

所以,前面所说的那个对于文件名去encode或decode的事情,就可以完全省略掉了。

当然,对于?filename=xxx的部分,如果是想要为了其他人看到文件链接地址而清楚该文件是啥,那么是最好加上,否则完全可以忽略掉的。

 

【后记 2012-06-24】

弄了个html页面,更加方便获得skydrive外链地址:

Skydrive外链生成器

转载请注明:在路上 » 【已解决】找到了更简单的方法去获得skydrive中一个文件的真实链接地址

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (7)

  1. 当我下载的时候却丢失了文件的拓展名,下载后的文件名称也不是原来的了,好奇怪。
    梁华12年前 (2013-07-04)回复
    • 是的,会经常出现这类问题的。 比如下载到的文件是: 9A8B8BF501A38A36!2674 而不是原先的 xxx.jpg 根本原因是:skydrive本身的机制,返回的文件名,在引用后,有时候就是这样的名字了。
      crifan12年前 (2013-07-04)回复
  2. 我很想得到你的那个外链生成器的源代码,不知道方便不方便发送给我,谢谢。
    张小凡12年前 (2013-04-17)回复
    • 哪个源码?请说的具体点。
      crifan12年前 (2013-04-22)回复
      • 就是您的外链生成器的源代码 地址是:https://www.crifan.com/files/tool/html/genSkydriveExtLink.html 谢谢您了。
        张小凡12年前 (2013-04-29)回复
        • 1.用任何浏览器,打开该地址。 2.点击右键,查看网页源代码,就是你要的 源代码 了。
          crifan12年前 (2013-05-06)回复
91 queries in 0.192 seconds, using 22.13MB memory