之前写了这个帖子:
用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/ + 文件的ID(sid) + ?filename= 编码后的文件名
而此处我们的目的就是,对于任意一个skydrive中的文件,找到上述地址中的
文件ID和编码后的文件名,即可。
此处我们以这个为例:
打开:
https://skydrive.live.com/#cid=9A8B8BF501A38A36&id=9A8B8BF501A38A36%21504
后,对应的是music文件夹,其下有个文件夹domestic,domestic下面有个文件:
想你就写信 – 浪花兄弟
该文件是个mp3文件。以此文件该为例,来说明如何操作:
我这里,已经登录skydrive的前提下,对该文件,点击右键,选择共享,可以获得该文件所对应的不同种类的链接:
(1)查看和编辑:
(2)公开链接:
可以看到,不论哪种地址,都包括了该文件的文件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,可以得到这样的地址:
然后可以获得对应的sid:
9A8B8BF501A38A36!529
然后把文件名:
Rap(Ice ice baby)Mix – Lucky Sunday.mp3
去编码转换,得到:
Rap%28Ice%20ice%20baby%29Mix%20-%20Lucky%20Sunday.mp3
最终就可以得到永久的可以下载,可访问的外链了:
【后记 2012-01-12】
对于上述中所提到的,获得一个(尤其是包含中文和其他特殊字符的)字符串的编码后的形如%XX的内容,用上述介绍的urllib.quote函数处理的方法,毕竟还是开发人员才能搞定的,所以此处就想要实现在线就支持转换的功能。
目前,虽然界面和用法不是那么好,但是功能已经实现,大家就凑合用吧。
【后记 2012-01-16】
后来发现,网上之前就有人通过javascript实现了对应的歌曲外链了:
最新获取SkyDrive音乐外链mp3地址方法20111218
此处也就暂时用其制作的网页:
有空再去折腾用其他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外链地址: