酷我音乐 js 逆向分析

JS逆向爬虫实战:酷我音乐加密参数分析与破解


一、背景与目标

酷我音乐在请求接口时,通过动态加密的 reqidSecret 参数实现反爬虫机制。本文通过逆向工程,解析这两个参数的生成逻辑,并实现自动化爬虫脚本。


二、加密参数定位与分析

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) 通过以下步骤生成加密字符串:

  1. 字符串拼接:将输入字符串 e 的字符 ASCII 码拼接为数字字符串。
  2. 随机数混合:生成随机数并与字符串混合,通过线性同余算法迭代计算。
  3. 异或加密:将结果与固定字符串 t 进行异或操作,最终生成十六进制字符串。

关键代码片段:

function f(t, e) {
    // ... 省略中间步骤 ...
    for (var n = "", i = 0; i < e.length; i++)
        n += e.charCodeAt(i).toString();
    // ... 混合随机数并迭代 ...
    return h += d; // 最终拼接结果
}

四、Python 爬虫实现

1. 环境依赖

  • 安装 execjsrequests 库:
    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()

五、注意事项

  1. Cookie 动态更新
    Hm_Iuvt_xxx 的值可能定期失效,需通过 Selenium 或手动登录获取最新 Cookie。

  2. JavaScript 环境模拟
    webpack.js 依赖 window 对象,需在 Node.js 补全后运行。

  3. 法律与道德约束
    爬虫行为需遵守 robots.txt 协议,禁止用于商业用途或数据盗取。


六、总结

通过逆向分析 Webpack 加密逻辑,结合 Python 的 JavaScript 执行能力,可有效破解动态加密参数。此类案例的通用解决思路为:

  1. 关键参数定位:通过抓包和调试确定加密入口。
  2. 逻辑还原:分析 Webpack 模块化和加密函数调用链。
  3. 代码移植:将 JavaScript 逻辑嵌入爬虫环境。

完整代码已开源:gitee仓库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值