项目地址:
https://github.com/JabinGP/NetEaseCloudMusicApi
小程序网易云音乐api模块
之前我们已经开发过一款小程序适用的qq音乐api库https://github.com/FisherWY/QQMusicPlugin了,这次开发网易云音乐api库的原因是qq音乐api库在小程序中iOS环境下无法使用小程序提供的背景音频播放器播放的问题
网易云的加密算法真的比其他几家api复杂太多了。。。完爆QQ和酷狗
本api库参考了Github上面开源的node库,因为我们只想要查找音乐和播放音乐这两个功能
虽然Github那个库很方便,但是我们不想为了两个接口特意去跑一个node.js服务。Github上的库
网上很多帖子讲的很清楚了,这里推荐几篇文章,我只做一个简单的总结,方便大家理解这个库。
网易云的加密算法大概使用了两个:
加密大致流程:
加密结果a
。abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/
随机生成一个新的16位密钥,然后用这个密钥去加密加密结果a
,得到加密结果b
。c
b
和c
发送给服务器,服务器就会返回给我们对应的结果了。这段代码传入对象后可以直接加密成符合网易云api加密的结果。
// 生成随机数,size默认16
function createSecretKey(size) {
const keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let key = ""
for (let i = 0; i < size; i++) {
let pos = Math.random() * keys.length
pos = Math.floor(pos)
key = key + keys.charAt(pos)
}
return key
}
// aes加密方法
function aesEncrypt(word, secKey) {
let key = CryptoJS.enc.Utf8.parse(secKey); //十六位十六进制数作为密钥
let iv = CryptoJS.enc.Utf8.parse(aes_mv); //十六位十六进制数作为密钥偏移量
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let res = encrypted.toString();
console.log(res);
return res;
}
// 填充方法
function zfill(str, size) {
while (str.length < size) str = "0" + str
return str
}
// rsa加密方法
function rsaEncrypt(text, pubKey, modulus) {
const _text = text.split(‘‘).reverse().join(‘‘)
const biText = bigInt(CryptoJS.enc.Utf8.parse(_text).toString(), 16),
biEx = bigInt(pubKey, 16),
biMod = bigInt(modulus, 16),
biRet = biText.modPow(biEx, biMod)
return zfill(biRet.toString(16), 256)
}
// 加密总入口
function Encrypt(obj) {
const text = JSON.stringify(obj)
const secKey = createSecretKey(16)
const encText = aesEncrypt(aesEncrypt(text, nonce), secKey)
const encSecKey = rsaEncrypt(secKey, pubKey, modulus)
return {
params