## 前言 呵呵,没错,公子我又[再次光荣的把硬盘搞挂了](http://blog.imnerd.org/post/disk-down.html),然后音乐又没了!鉴于之前已经有过一次经验([批量下载虾米已下载歌曲](https://imnerd.org/multi-download-xiami-songs.html)),所以本以为这次也会轻而易举了的。没想到居然在我写出那篇日志后没多久,官方居然各种更新(更新页面,下载机制,Flash播放器),然后我那篇日志的方法就没法用了。不过官方这个也都是小改,所以我也只要小改下代码就成啦!哈哈! ## 有什么变化 首先要说的是虾米官方的下载思路还是没变的,基本上还是之前日志里头说的那样: > 在网站点击下载之后,网站向你的账户中未下载列表传递下载歌曲信息,之后未下载列表则返回一个以emoun://特有协议开头的文件,用以打开虾歌(这个和迅雷thunder://以及电骡等的ed2k://是一个道理)。虾歌打开后查询未下载的表单,返回表单中的歌曲,然后下载。同时将未下载列表中的歌曲提交到已下载列表中,并在未下载列表中删除。 - [批量下载虾米已下载歌曲](https://imnerd.org/multi-download-xiami-songs.html) ![](https://p.upyun.lithub.cc/imnerd.org/web_needs/xiami_download_2.png) 官方改变的就是下载列表和网站点击下载这两步: ### 下载列表 老版的是直接显示列表显示每首歌的,新版则是按照下载时间来显示,一次下载为一次订单,订单内再显示此次下载的歌曲。这样正则匹配获取歌曲的ID就需要发生变化了。 ### 点击下载提交订单 以前只要登录后向服务器`POST`歌曲的ID就能提交订单了。新版则需要提交`sign`和`_xiamitoken`这两个新参数,三个参数一块POST才行。`sign`参数暂时还不知道如何算出来的,`_xiamitoken`则是你的`cookies`。看源码意外的让我发现了参数居然都直接写在页面里头了,为了简便,我就直接抓取订单页面正则获取这两个参数了。同时还加了判断`Referer`这种老手段,这个也不算难。 ![](https://p.upyun.lithub.cc/imnerd.org/web_needs/xiami_download_1.png) ![](https://p.upyun.lithub.cc/imnerd.org/web_needs/xiami_download_3.png) ### VIP机制 以前是没有VIP的,自从被阿里收购之后就增加了VIP功能。好在现在可以用`体验点`(以前的`红包`)购买VIP,15个体验点可以买一个月的VIP,一个月的VIP能免费下100首歌曲。我的歌曲数在400+,花了80个体验店办了半年的,可以免费下600首歌曲。等于用80个体验店下600首歌的意思,变相的节省了下体验点,哈哈! ## 解题步骤 ### 一、获取登录COOKIES 这一步和老版还是一样的,直接复制过来吧。 获取登录后的COOKIES文件,方便之后的抓取工作。修改代码中的第2行和第3行,填入自己的账号和密码。如果成功的话,会在该文件的同级目录下得到一个cookies.txt文件。 ```php ``` ### 二、抓取下载列表并提交到未下载列表 这一步因为列表的改变有些许变化。而且新版订单还有个新订单和旧订单之分,真是蛋疼,还得做两次解析。 ```php \/s'; preg_match_all($preg, $pageinfo, $match); $page = $match[1][0]; for($i=1;$i<$page;$i++) { $data = get("http://www.xiami.com/account/myorders-old/page/".$i); $preg = '/\