用Python根据网易云下载vip歌曲音乐的ID丅载音乐,保存到本地MP3格式
可以下载歌曲的范围:所有能够听的歌曲
这是哈希函数(如SHA256
和RIPEMD160
)和各种加密算法(AES
DES
,RSA
ElGamal
等)的集合。主要是鼡来加密解密为何要用这个呢,稍后分析
requests
主要用来发送网络请求 json
主要用于解析网络请求的response
为了避免麻烦,我们选择网页版的网易云下載vip歌曲音乐而不用客户端的省去抓包的麻烦
我们随便选择一首歌(这里选择: )然后打开网页,得到如下界面:
然后打开浏览器网络面板点击播放按钮,然后查看网络请求如下:
一共发送了四个网络请求,仔细一点我们发现了一个有趣的请求,就是上图最后一个帶有.mp3
后缀的那个,很明显这里是将一千零一夜
这首歌缓存了下来,复制该网络请求到浏览器地址栏打开然后浏览器就开始下载一千零┅夜
这首歌。到此好像前面提的所谓的目标完成了,但是我不开心身为一个开发人员,这么没有技术含量的东西是不是可以考虑用技术去实现呢。能不能输入一个歌曲的ID然后就把歌曲下回来呢。
我们播放多几首歌曲很容易发现,每一首歌曲都会有一个独立的链接仔细看看这个链接(),显然是经过处理的这个处理有可能是前端直接处理的,也有可能是后端处理的(是不是说了等于白说。),后端处理会有多种情况其中一种就是另一个网络请求返回来对应的东西,反正网络请求不多我们先看看网咯请求,一看吓一跳還真蒙着了,上图中第一个网络请求返回来的数据
只要模拟这个请求就可以得到歌曲的链接,只要得到链接就能下载歌曲在该请求的參数中,params
以及encSecKey
都是一个经过加密的数据在反复分析点击播放按钮的事件后,得到JavaScript
进行了如下操作
由上得知window.asrsea
一共传递了四个参数(假设為window.asrsea(a, b, c, d)),而这四个参数中只有 a
是一个跟歌曲id相关的参数,其他三个都是一个常量
再研究window.asrsea
的代码发现请求的两个参数params
以及encSecKey
都在这里加密了,其中params
经过了两次AES
加密第一次加密的时候,传入了两个参数一个是a,一个是d,第二个加密的两个参数第一个是第一次加密的结果,第二個是一个16位的随机字符串,因为是一个随机的字符串所以我们可以随便用一个16位的字符串就行了,由于这里这个随机的字符串固定了那第二个参数encSecKey
就是一个固定的值
至此,我们的分析完成也得到了需要的信息
Python想要模拟请求,那就需要进行AES
加密因此我们就用到了开始所说的pycrypto
模块
如果本文对你有所帮助,请点个赞这是我努力下去的无限动力,谢谢(??ω??)