在做qq机器人的时候想加入点歌功能,虽然自带一个点歌插件,但是只能分享QQ音乐,所以我想着自己写一个网易云音乐的。
首先打开网易云音乐的搜索界面,F12打开开发者工具并切换到Network。
随便搜索什么,我们可以看到好几个请求,其中一个是按下搜索按钮的,一个的是在输入框输入的时候请求搜索建议的,还有的不知道什么作用。
我们可以看到csrf_token参数甚至都是空的(实际上应该是一个32位的数字字母组合)。
然后Post出去的数据有两个参数params和encSecKey,很显然都是加密过的,其中根据其特征,可以看出来params应该是通过AES加密的(最后有个“=”)。
为了知道加密算法,我们必须要把加密的代码找出来,F12工具选到Sources,在js代码中搜索和这两个参数,在core_xxxxxx的文件里搜到了3个适配项:
如果代码很乱,可以按左下角的{}按钮整理代码。
从代码里面可以知道window.asrsea方法是真正生成了这两个参数的方法,先设个断点(左边行数点击一下)。
随便搜索一下,让它在这里断下。
注意由于所有请求都是通过这个函数加密的,我们要分清楚当前断点是在请求什么,可以通过图中Z5e变量知道请求的url。
在正确的请求断下,然后在控制台获取各个参数的值
我们可以相信,至少第二个和第四个参数应该是固定的(因为其函数参数为常量),第一个参数为真正请求的参数,其中s项对应搜索关键字,csrf_token即为前面的csrf_token。多次改变搜索关键字尝试,可以得出除第一个外其它参数均固定不变。
F10,F11进入加密函数内部:
加密函数看起来不复杂,首先利用a函数生成一个随机数i,然后通过不同参数(g,i)对d连续加密两次,最后把i加密一次。
这里面有两个加密算法,b很显然就是AES算法,如果想在python里面直接调用AES库,需要安装pycrypto库,安装过程可能会有曲折。
这个AES算法在python下很容易实现:
from
AES算法要求待加密文本位数是16的倍数。和js不同的是,js的加密算法会自动对原文本进行填充,但是python不会,所以我们需要手动对文本进行填充。