js逆向——网易云音乐爬虫

作为一名爬虫爱好者,历经重重困难终于有了点感觉,对于网易云音乐的爬虫,想为大家分享一下自己的思路,有不足的地方还望各位大佬指出。本篇文章主要是解析网易云音乐js加密的过程,以及付费音乐下载。

 

 

 

 

思路大概就是拿到每一首音乐的ID,然后放到网易云的外链播放链接里面就可以了,这个链接大家在网上搜的到就是http://music.163.com/song/media/outer/url?id=ID.mp3。而拿ID需要两个参数params和encSecKey。这两个玩意是加密的,所以重点就是怎么搞定这两个参数。

话不多说,直接分析。

首先我们进入到网易云,输入歌手或歌名。通过抓包分析,很轻松的找到了每一首音乐的ID的位置,现在只需要访问https://music.163.com/weapi/cloudsearch/get/web?csrf_token=就可以了。

 

 

 

 

这是访问https://music.163.com/weapi/cloudsearch/get/web?csrf_token=   

所需要携带的参数。

 

 

 

 

 

 

但这参数不一般,

可以看到这是一个post请求,而且携带的这两个参数这么大一坨,不用多想,绝对是个加密参数。但是大家不要慌,让我们全局搜索一下(跟栈也可以,但我觉得这里直接搜索要快一点),仔细分析一波。

通过搜索任意一个参数可以快速找到加密的位置,可以看到

 

 

 

 

 

 

 

接下来就是打断点分析。

首先可以确定的是params= bMr5w.encText,

encSecKey=bMr5w.encSecKey

而bMr5w又等于window.asrsea这个函数,观察可知这个函数是需要四个参数的,

 

 

 

 值得注意的是,如果直接打印的话可能结果是不一样的,这是因为当前的包不是我们需要的包。所以我们只需要继续执行脚本,直到接口变为weapi/cloudsearch/get/web即可。

在控制台中打印一下四个参数,分别是:

 

 

 

 

 

 

经过多次测试,发现后面三个参数是不变的,而第一个也只有“薛之谦”会变,这就简单了。

好了,四个参数已经搞定,接下来就是关键了,进入window.asrsea函数

 

 可以看到,d就是windo.asrsea这个函数。要传入的四个参数我们已经知道了。

 

咱也不说能不能看懂这是啥,不管那么多,直接复制到node环境里看看结果。

 为了避免与后面其他的参数起冲突,这里我就改了下名字,然后运行。

 

 毫无疑问,肯定是会报错的。

 

 

 

 

 

 

 说简单也简单,报错了之后,接下来就是缺什么补什么,这里就大家自己慢慢去补了哈。

另外,当补到b函数的时候,会说 CryptoJS is not defined,仔细一看原来b函数里面有个AES加密,能调库就调库,这里就npm install crypto-js,然后导入就可以了

 

后面的就没有什么大问题了。补完函数后,我们也是顺利的拿到了想要的东西。

 

 

 

虽然过程艰辛,但结果是好的。接下来就是写代码拿音乐ID了,这里我用的是execjs库来执行js代码

 

import execjs
with open('网易云.js', 'r', encoding='utf-8') as f:
        num = input('请输入歌手名字或歌曲名称:')
        dd = f'{{"s":"{num}","type":"1","offset":"0","total":"true","limit":"30","csrf_token":"3599ab653e7488caca3eada3fec5a598"}}'
        ee = '010001'
        ff = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
        gg = '0CoJUm6Qyw8W8jud'
        encText = execjs.compile(f.read()).call('jiemi', dd, ee, ff, gg)
        tt = encText['encText']
        vv = encText['encSecKey']
        print(tt,vv)

 

 

 结果也是顺利的拿到了加密参数。

 

 

 

 有了加密参数ID就能轻松拿到了。音乐的下载地址也就有了。这里就不在过多赘述,相信大家都没有问题的。

另外就是对于付费音乐下载,其实我也不知道这么做对不对,反正目前是能下载的。首先你需要有一个开了会员的网易云账号。因为付费音乐是你来了会员也不能下载的,除非单曲购买,而当我们有会员时,只要我们能听,就能给它下载在本地。对于会员过期后还能不能下载这就不清楚了,但多半下不了。ok!直接开干。

与前文不同的是我们获得音乐下载地址的方式。首先进去一首歌的播放页,然后右键检查,找到这个接口

里面的url就是下载地址。载荷里面的两个参数和上文的一样,唯一不同的就是params的长度不一样。那估计就是加密的时候传入的某些参数改变了。

记住这个请求网址的路径

然后用同样的方法搜索加密参数进去到对应的js文件。在控制台打印对应参数,如下:

发现只有第一个参数变了,而里面的id也是我们上文获得了的。现在就是请求对应的网址就可以拿到数据了,当然,记得加上你的cookie,不然付费音乐的数据是拿不到的。

 

好了,本文到这里也结束了,希望对大家能有所帮助。

 

posted @ 2023-01-28 14:07  小纱雾  阅读(1779)  评论(0编辑  收藏  举报