本文旨在分析网易云音乐试听歌曲地址的API,参考文章网易云音乐登录API(2016.04) Python3版以及如何爬网易云音乐的评论数?。虽然这两篇分别是登录篇和评论篇,但大同小异,区别在于bl参数不同
- 首先分析请求,可以看到关键点在于params和encSecKey这两个参数的获取
- 将initiator的JS文件复制到WebStorm中,格式化,查找params和encSecKey,如下:
var bua = window.asrsea(JSON.stringify(bl), bbZ(["流泪", "强"]), bbZ(cnb.md), bbZ(["爱心", "女孩", "惊恐", "大笑"]));
bf.data = bm.eX({params: bua.encText, encSecKey: bua.encSecKey})
3.利用知乎参考回答中的方法,可以在控制台输出中看到:
bbZ(["流泪", "强"]) = 010001
bbZ(cnb.md) = 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
bbZ(["爱心", "女孩", "惊恐", "大笑"]) = 0CoJUm6Qyw8W8jud
bl =
br = 128000(码率)
csrf_token = "18d55720a342bf3eae987e7ca40a5ed4"
ids = "[421423806]"(歌曲ID)
- 那么参数问题都搞定了,开始搞window.asrsea,可以发现如下代码:
window.asrsea = d
function d(d, e, f, g) {
var h = {}, i = a(16);
return h.encText = b(d, g), h.encText = b(h.encText, i), h.encSecKey = c(i, e, f), h
}
然后再去追查函数a,b,c的定义,如下:
function a(a) {
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1)e = Math.random() * b.length, e = Math.floor(e), c += b.charAt(e);
return c
}
function b(a, b) {
var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a), f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c) {
var d, e;
return setMaxDigits(131), d = new RSAKeyPair(b, "", c), e = encryptedString(d, a)
}
函数a的作用是生成长度为16的随机字符串
函数b的作用是AES加密(CBC,padding = pkcs7)
函数c的作用是RSA加密(暂且没弄懂)
- 根据以上理出来的思路,写出加密代码得到两个加密数据即可。