最近更新频率慢了,这不是因为CK3发售了嘛,一个字就是“肝”。今天来看一下网易云音乐两个加密参数params和encSecKey,顺便抓取一波某歌单的粉丝,有入库哦,使用mysql存储,觉得有帮助的别忘了关注一下公众号啊,完整的JS代码都已整理好,请关注知识图谱与大数据公众号,找到本文点击文末阅读更多获取。我的文章一般都有完整代码,创作不易啊,大家请多关注啊,当然不关注想白票也无所谓。
目标网易云音乐只需要解密params和encSecKey就可以开始快乐的抓取了,当然你没有足够的代理IP的话,还是要慢点爬,废话不多说,直接开整。
请求老规矩,先看看我们要抓的页面样子:
查看网络请求:
从名字上就可以快速定位是哪个请求,是POST请求,那看看它提交了哪些参数吧,FormData如下:
提交的参数即前面提过的params和encSecKey,是加密过的,看看返回的内容的格式:
ok,基本的东西我们都已经知道,可以进入下一步了找到解密两个参数了。 分析
调试前我们得先找到这两个值的位置,那就搜索呗,先定位JS文件再定位代码位置。怎么搜索应该都知道的吧,搜params或encSecKey均可,搜出来多个结果不确定是哪个文件的话可以每个点进去再搜索一下关键参数,以此确定是否是目标文件,这里我直接标记了正确文件,大家点击进去即可。
进入JS文件后,同样搜索关键参数params或encSecKey:
找到了encSecKey的位置,把这几行代码抠出来分析一下: var bVZ8R = window.asrsea(JSON.stringify(i0x), bqN0x(["流泪", "强"]), bqN0x(Wx5C.md), bqN0x(["爱心", "女孩", "惊恐", "大笑"])); e0x.data = j0x.cs1x({ params: bVZ8R.encText, encSecKey: bVZ8R.encSecKey })
粗略看,params和encSecKey来自bVZ8R.encText和bVZ8R.encSecKey,而bVZ8R是window.asrsea的结果,window.asrsea有四个参数,JSON.stringify(i0x), bqN0x(["流泪", "强"]), bqN0x(Wx5C.md), bqN0x(["爱心", "女孩", "惊恐", "大笑"],先看后面三个参数,从它们固定的值可以大胆推测这三个值也是固定的。之所以说都是固定的,看看Wx5C.md:
Wx5C.md是一个固定好的数组,而bqN0x(["流泪", "强"])和bqN0x(["爱心", "女孩", "惊恐", "大笑"]这结果肯定也是不会变的,如下图,测试了一下:
大概弄清楚了这几个参数,剩下的就是搞明白window.asrsea的具体实现方式,还有i0x是什么样的,进入调试环节。 调试
window.asrsea打上断点,我的代码位置是13133行,点击粉丝列表下一页就会激活断点,在激活断点的同时我们也能一睹i0x的芳容,在控制台中输入i0x:
limit、offset、total、userId这些其实都是可知的,而csrf_token的产生可以看这里,细心的童靴应该早就发现了:
} i0x["csrf_token"] = v0x.gP3x("__csrf"); ## csrf_token在这里产生 X0x = X0x.replace("api", "weapi"); e0x.method = "post"; delete e0x.query; var bVZ8R = window.asrsea(JSON.stringify(i0x), bqN0x(["流泪", "强"]), bqN0x(Wx5C.md), bqN0x(["爱心", "女孩", "惊恐", "大笑"]));