网易云音乐的 web 端播放音乐的 POST 请求是有 JS 加密的,本文的目的只找到加密的 JS 函数,下一篇文章再复现加密过程,使用爬虫爬取音乐。
在刷行页面之后,需要在 devtools 中找到请求媒体资源的 url。
这里的 weblog 应该是中国特色,会收集用的行为,以此为依据来给你推送资源或者广告。
在阿贾克斯里面找了一圈,都没有找到请求音乐相关的链接,因为网易云的机制是点击了播放才会发起音乐资源的 POST 请求。
查看他的请求头如下:
这里和之前的有些不同,之前的时候还是可以请求到网易云的音乐资源,现在只有一个 URL 链接,点进入可以播放音乐资源,我尝试看一下能不能从这个页面里面找到资源的 URL。(找了之后没找到,现跳过这个问题,先看主题,如何找加密逻辑)
寻找加密逻辑
方法一:查看浏览器调用栈
由于我改成了中文,所以 启动器
标签里就是 call stack。
首先需要明确这里发送参数的过程:
- 首先准备参数,如:音乐的 ID 值;
- 然后对参数进行加密;
- 最后才是发送数据;
基于以上的流程,这里寻找参数的顺序应该是顺着 call stack 从上往下找,才能尽快找到加密位置!下面开始寻找流程
分析调用栈
首先在调用在栈的最后开始打断点调试,如图所示,这里的 arguments
参数中已经携带了加密后的参数,所以从这里继续往前溯源。
前面一个函数调用依然是已经加密过的密文,所以继续往前,下面没有解释就是同样的逻辑:
一直溯源到这里,密文消失了,取而代之的是明文 URL,但是 URL 不对,所以可以猜测:可能所有加密都是使用同一套逻辑,在这里打断点继续多次调试:
在经过很多次步进调试后,我们就可以发现他的 URL 和刚开始我们找到的 URL 是一致的,那么也就是说加密过程就发生在这个调用和下一个调试的调用之间。
在这里传入的参数是一个 /api/xxxxxxx
的 URL,他和之前请求的 URL 很相似,接着往下看:
JS 脚本在这一步将原来的 api
换成了 weapi
,这样就和之前的请求 URL 完全一致了。接着看
通过对这个函数的调试发现,在这个函数末尾的结构体中(我暂时称为结构体,咱也不是写 JS 的,其实估计叫字典)密文出现了,也就是传参的时候传递了 bbx4B
这个结构体,里面有密文。这里可以点进去看修改 bbx4B
的函数,即 window.asrsea
:
就是如图这个函数,为什么叫 d 呢,下面也写了:
window.asrsea = d // 相当于重命名了一下
返回调用这边,我们可以看到他把这个歌曲的 ID 传进去了,也就是说,他根据 ID 来判断是哪一首歌曲,从而返回对应资。
评论