JS逆向爬虫实战:酷我音乐加密参数分析与破解
一、背景与目标
酷我音乐在请求接口时,通过动态加密的 reqid
和 Secret
参数实现反爬虫机制。本文通过逆向工程,解析这两个参数的生成逻辑,并实现自动化爬虫脚本。
二、加密参数定位与分析
1. 参数特征
- reqid: UUID格式,如
39922140-2c96-11f0-940d-870d802caf7e
- Secret: 64位十六进制字符串,如
7767d9e15b5f2246e61dcbd97ef7c65a60ae889344b8f2753dee12f3edde28fb041486fc
2. 逆向过程
通过搜索关键词发现 reqid
参数的是由 n
赋值给出的,找到 n
的声明位置,进行断点调试
经过调试,发现 l()()运行结果就是我们需要的参数值
接下来,进入函数内部查看参数值是如何生成的,进入函数内部后发现,reqid 由 Webpack 模块中的 window.s(113)()
生成,此时,只需要找到加载器,就可以解决reqid参数的生成
通过同样的方法,可以找到 Secret 由函数 f(s, m)
生成
可以发现,经过两次处理,已经得到了 Secret
加密的结果,接下来只需要进入两个函数内部看加密参数是如何生成的,即可复现参数生成逻辑
经过对两段代码的分析发现,函数中并未进行特殊的加密,只是进行了一些简单的运算,接下来就可以用代码进行复现加密
三、加密逻辑解析
1. reqid 生成逻辑
Webpack 模块化加载的 JavaScript 中,通过调用 window.s(113)
生成 UUID。核心代码如下:
// webpack.js 中定义
function encrypt() {
var reqid = window.s(113)(); // 调用 Webpack 模块 113 生成 UUID
.....
return reqid;
}
2. Secret 生成逻辑
函数 f(t, e)
通过以下步骤生成加密字符串:
- 字符串拼接:将输入字符串
e
的字符 ASCII 码拼接为数字字符串。 - 随机数混合:生成随机数并与字符串混合,通过线性同余算法迭代计算。
- 异或加密:将结果与固定字符串
t
进行异或操作,最终生成十六进制字符串。
关键代码片段:
function f(t, e) {
// ... 省略中间步骤 ...
for (var n = "", i = 0; i < e.length; i++)
n += e.charCodeAt(i).toString();
// ... 混合随机数并迭代 ...
return h += d; // 最终拼接结果
}
四、Python 爬虫实现
1. 环境依赖
- 安装
execjs
和requests
库:pip install pyexecjs2 requests
2. 关键代码
通过 execjs
调用 JavaScript 加密函数:
import requests
import execjs
# 加载 Webpack 加密代码
with open('webpack.js', 'r', encoding='utf-8') as f:
js_code = f.read()
js = execjs.compile(js_code)
data = js.call('encrypt') # 调用加密函数
# 构造请求参数
headers = {
"Secret": data['Secret'],
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."
}
params = {
"reqId": data['reqid'],
"plat": "web_www",
# ... 其他参数 ...
}
# 发送请求并下载音乐
response = requests.get(url, headers=headers, params=params).json()
五、注意事项
-
Cookie 动态更新
Hm_Iuvt_xxx
的值可能定期失效,需通过 Selenium 或手动登录获取最新 Cookie。 -
JavaScript 环境模拟
webpack.js
依赖window
对象,需在 Node.js 补全后运行。 -
法律与道德约束
爬虫行为需遵守robots.txt
协议,禁止用于商业用途或数据盗取。
六、总结
通过逆向分析 Webpack 加密逻辑,结合 Python 的 JavaScript 执行能力,可有效破解动态加密参数。此类案例的通用解决思路为:
- 关键参数定位:通过抓包和调试确定加密入口。
- 逻辑还原:分析 Webpack 模块化和加密函数调用链。
- 代码移植:将 JavaScript 逻辑嵌入爬虫环境。