AI 文章摘要
某Q音乐的sign是用webpack打包生成的,也就是说,它把所有的函数封装成一个一个大模块,然后通过一个加载器去进行函数的一些导出和调用(应该是),具体知道这么多。
切入正题,首先打开浏览器进入网站,进入排行榜,可以看到流行排行榜的一些信息,然后F12,可看到一些信息,如图:

然后呢,右边那个红框内就是我们要找的这个流行指数榜的歌曲的所有信息,然后我们又看到当请求这个url的时候,携带了一些参数,有一个时间戳和一个sign

而这个sign你会发现,它不是固定的但是它是必须携带的请求参数,它是随着请求东西不一样然后跟着变动,也就是说,这可以理解为加密参数,那么我们可以在代码里面去找一下这个sign是在哪儿生成的,使用全局大法搜一下这个sign参数,然后点击进入sign所在的代码块


乍一看,就能知道,这个sign就是i,而这个i是通过调用一个o函数生成的,然后中间又传了一个data参数,而这个o又是通过这个n(350).default得到的,所以,最主要要解决掉这个o = n(350).default,此时解释一下,这里的o = n(350)就是webpack的形式,n是函数加载器,350是调用的函数。然后此时,在这个地方打上一个断点,然后一步一步得到这个i值,也就是请求这个页面时候的sign值以及加载器所在的函数位置


然后可知道这个加载器n的函数位置,点击进入,发现是个f函数

然后这个default也能看得到是在本代码模块内,也就是说,如果我们把加载器所在的代码拿到和default相关代码拿到,然后我们在外部进行导出然后调用此js代码就能拿到所需要的sign值从而实现数据的提取,下面复制代码,然后在外部声明一个全局变量以进行外部调用,如:
var loader;
// 加载器所在代码
!function(e) {
// …
// f是加载器,用全局变量接收
loader = f;
}([])
然后复制加载器方法代码,进行原代码中导入:
// 加载这个方法的所有代码,module是加载器方法的js文件名字
require(“module”)
var loader;
!function(e) {
// …
// f是加载器,用全局变量接收
loader= f;
}([])
然后下面进行测试,发现和源sign值是一样的,也就是说代码是没问题的

但是如果此时发现在浏览器运行sign值又不对了,那就是环境缺失了,需要补环境,把location和navigator补上就行

然后最后用python代码去进行调用执行js代码,得到数据:

格式化一下,结束

演示搜索与下载
