虾米音乐网站上有很多高品质的音乐和精心组织的精选集,但普通用户只能试听,不能下载,下载的话需要使用“米”,这个“米”除了极少数的新手任务可以获得之外,基本上都要靠付费来购买,很多人没有网银或者没有银行卡,支付相当不方便。对于普通用户,既想把音乐放到手机或者mp3里欣赏,又不愿反复折腾的话,如何找到下载链接把歌曲下载下来呢?让我们来研究一下虾米音乐网站的代码逻辑。
如下图:打开一个精选集:
我们来看一下这个网页的源码,找到第一首歌曲Iris and Jasper –Hans Zimmer部分的html代码,搜索Iris andJasper即可:
懂html的可以看看,其实也不需要理解,这段代码大体上看来点击试听的时候,调用了一个js函数play,参数有三个,很明显第一个是歌曲id,后面两个不知道是做什么用,但这没有什么影响,我们来继续看看play函数的代码:
这段js代码非常简单,懂点程序的人都能看出来,最后的结果就是:/song/playlist/id/+第一个参数+/object_name/+第二个参数+/object_id/+第三个参数,第一个参数是百分百有的,第二个如果不存在,则为default,第三个如果不存在,则为0。因为没有特殊字符,所以那个escape函数的作用可以忽略。然后前面再拼上虾米的网址http://www.xiami.com就得到一个url链接:http://www.xiami.com/song/playlist/id/2562206/object_name/collect/object_id/11060023,这么简单?这就是歌曲链接?No,显然没那么容易,我们把这个地址复制到浏览器访问一下看看返回什么内容:
<?xml version="1.0" encoding="utf-8"?> <playlist version="1" xmlns="http://xspf.org/ns/0/"><trackList><track><title><![CDATA[Iris and Jasper]]></title><song_id>2562206</song_id><album_id>217126</album_id><album_name><![CDATA[The Holiday (Original Motion Picture Soundtrack)]]></album_name><object_id>11060023</object_id><object_name>collect</object_name><insert_type>1</insert_type><background>#eeeeee</background><grade>-1</grade><artist><![CDATA[Hans Zimmer]]></artist><location>8h2xt622265tFi%%6%5_Et%a22%2643p2mFF252%5%Fi32F225.3f.51%%%EmA1n575552p%.e41EEE%3</location><ms>http://f1.xiami.net</ms><lyric>http://www.xiami.com/song/lyrictxt/id/2562206</lyric><pic>http://img.xiami.com/images/album/img46/35546/2171261295514339_1.jpg</pic></track></trackList><type>collect</type><type_id>11060023</type_id><clearlist></clearlist> </playlist>
是一段xml,看起来这才是歌曲的真正信息,刚才的url就是用歌曲id等来请求歌曲信息的方法,从xml里可以看到歌曲信息和播放背景歌词地址专辑图片等内容。那么歌曲的下载地址到底在哪里呢?xml里并没有歌曲的url。仔细看xml,有个location看着很可疑,看起来是一段加密过的内容,怎么解密呢?这段解密代码在js里是找不到。
但是找不到如何破解呢?不用担心,网上已经有相应的破解方法,地址:http://www.winhex32.com/xiami/
把location里的那段加密后的字符串复制到输入框里,输入验证码,点击尝试解码,ok,看到了吗?完整的mp3下载链接就出来了,直接复制到浏览器或者迅雷里下载吧~~
上了的不算分析的分析就讲完了,我们再来回顾一下该过程:
1.打开一个歌曲的页面,查看源文件
2.ctrl+f打开搜索框,输入“play(”,不包括引号,就可以找到每一首歌曲的play函数,记下函数的几个参数。
3.根据上面提到的规则,http://www.xiami.com/song/playlist/id/+第一个参数+/object_name/+第二个参数+/object_id/+第三个参数,得到歌曲信息的获取路径,比如http://www.xiami.com/song/playlist/id/2562206/object_name/collect/object_id/11060023,用浏览器打开这个路径,得到一段xml文本内容。
4.把xml里的location段里的加密内容复制,打开www.winhex32.com/xiami,粘贴进去,输入验证码解密,就可以得到mp3文件的下载路径了。
对于这个Location内部的解密算法,如果大家有兴趣,以后再继续发帖分析。
本博文仅供技术交流,请勿用于商业目的,否则后果自负。如果有兴趣的话欢迎跟帖讨论。