需要用到的工具
1.python3.7
2.chrome浏览器
3.sublime编辑器
话不多说,下面开始讲解流程。
主要流程
1.在网易云音乐搜索框中输入“成都”,F12打开开发者模式,搜索框回车,在Network中发现出现了很多响应数据,点进每个响应,切换到右边一栏的Preview。
在web?csrf_token=中我们发现响应result是一个json格式的数据,在songs字段中出现了歌曲列表。
当我们把鼠标放到页面第一首歌曲的上面是,屏幕左下方的链接显示的id刚好就是json数据中id,于是我们找到了歌曲的id,或许有用,接着往下看。
随机点击一首歌进行播放,注意不要点击超链接,那样会跳转页面,点击那个小的播放按钮就可以了。点击播放按钮后左侧导航栏里面会多了几个响应,其中就有一个MP3文件。
可以看到浏览器发送了一个GET请求,服务器响应一个mp3文件,如果我们在python程序里面也向Request URL发送一个GET请求,那样不就能下载MP3文件了吗。思路逐渐清晰,于是我们接下来的任务就是寻找到这个URL是从哪里得到的,再重新查看左侧的导航栏,发现在播放歌曲的时候多了一个url?csrf_token=的响应,点进去看Headers,发现是一个POST请求,参数有两个,params和encSecKey,点击Preview,可以看到也是一个json数据,有没有发现我们的响应里面有个url字段,他的地址和我们MP3响应的请求地址是一样的。
好,大致思路已经有了,就是首先向服务器的url?csrf_token=发送一个POST请求,得到MP3文件的请求地址,再向这个地址发送GET请求就能得到mp3文件。那么问题来了,url?csrf_token=的POST请求的参数怎么办?接着往下看吧!
3.关闭右侧的导航栏,点击红色箭头所指向的文件,打开后是一个JS文件。
在bLi4m这个变量中含有我们需要的参数。这个bLi4m变量接收的是window.asrsea这个函数返回的数据,将鼠标放到这个函数上面出现一个对话框,是一个d函数,点进去,跳转到了function d()。
在function d中多设置几个断点,function d接收d,e,f,g四个参数,我们想要看看着四个参数到底是什么,下面演示断点调试。
4.我们设置好断点后,刷新页面,js会执行到第一个断点处。
可以看到粉色的是已经执行过的程序变量的值,再次点击红色箭头所指的按钮,程序运行到function d处暂停。
安装 PyCryptodome库,直接pip install PyCryptodome就行。
生成16位随机字符串,也就是一个for循环的事。
AES加密
AES要加密的密文是 “{“ids”:”[song_id]",“br”:128000,“csrf_token”:""}",只要将其中的song_id替换成歌曲的id就行了,就是上面说到的POST请求得到的id。
RSA加密
RSA加密的密文是16位的随机字符串,要和AES加密保持一致。
6.
介绍完加密过程,下面介绍获取歌曲id,毕竟我们要实现的是下载任意的歌曲。输入歌曲名字就能下载,要实现这个功能就必须得到id,然后通过上文加密方法,获得params和encSecKey参数发送POST请求回去下载的url。
这里我们发现了获取id的url,查看其request请求。
同样的这也是一个post请求,参数还是params和encSecKey,和上面加密一样,查看其js文件,进行断点调试,有了上面的经验,这次我们重点查看d函数就行了。
可以看到这次d函数传入的参数基本没有变,只有d参数稍有变化,变成了"{“hlpretag”:"<span class=“s-fc7”>",“hlposttag”:"","#/download":"",“s”:“成都”,“type”:“1”,“offset”:“0”,“total”:“true”,“limit”:“30”,“csrf_token”:""}",其中s字段就是我们要搜索的歌曲名字,还是按照前面的加密过程一样得到post参数,到这里整个过程基本结束,下面贴上完整的代码。
7.
程序流程就是,首先输入想要下载歌曲的名字,然后拼接密文字符串进行加密,获得歌曲的id,再通过id获取下载的链接,其中由于获取的歌曲id有很多个,我只选择下载第一个(一般都是原唱),程序写的很简单,但基本功能已经实现,大家可以学习一下。