UNPKG

cloudmusicapi

Version:

A CloudMusic API Parser With NeteaseMusic V2(new) API

104 lines (100 loc) 3.74 kB
/* * Netease CloudMusic API Private Encrypt Function * * Thanks TO: * | Project | URL | * | -------------------- | ------------------------------------------------ | * | musicbox | https://github.com/darknessomi/musicbox | * | NeteaseCloudMusicApi | https://github.com/metowolf/NeteaseCloudMusicApi | * * Author: Corps * E-Mail: zsq01@live.com * URL : https://corps.set-fire.com * * Thanks for your Using! * */ const crypto = require("crypto"); const Bigint = require("big-integer"); const http = require("http"); const url = require("url"); const modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'; const nonce = '0CoJUm6Qyw8W8jud'; const pubKey = '010001'; String.prototype.fillZero = function(num){ let arr = this.split("").reverse(); for(let i = arr.length;i<num;i++)arr[i]="0"; return arr.reverse().join(""); }; let shuffle = function(arr) { for(let j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x); return arr; } let core = {}; let createSecretKey = (size)=>{ let str = Array.from("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); str = shuffle(str).join(""); return str.substring(0,size); }; let aesEncrypt = (text,secKey)=>{ let encryptor = crypto.createCipheriv("aes-128-cbc",new Buffer(secKey),new Buffer('0102030405060708')); encryptor.setAutoPadding(true); let crypted = [encryptor.update(text,"utf8","base64"),encryptor.final("base64")].join(""); return crypted; } let rsaEncrypt = (text)=>{ text = text.split("").reverse().join("");//反转字符串 let textHex = new Buffer(text).toString("hex"); let tb = Bigint(textHex,16); let pk = Bigint(pubKey,16); let md = Bigint(modulus,16); let rs = tb.modPow(pk,md).toString(16); let result = rs.fillZero(256); return result; } let encode = (json)=>{ json = JSON.stringify(json); let secKey = createSecretKey(16); let encSecKey = rsaEncrypt(secKey); let encText = aesEncrypt(json,nonce); encText = aesEncrypt(encText,secKey); let data = {"params":encText,"encSecKey":encSecKey}; return data; } core.post = (urls,data,callback) =>{ data = encode(data); data = require('querystring').stringify(data); let urlObject = url.parse(urls); let options = { hostname: urlObject.hostname, path : urlObject.path, method : "POST", headers : { "Host" :"music.163.com", "User-Agent" :"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.157 Safari/537.36", "Accept" :"*/*", "Referer" :"http://music.163.com/", "Cookie" :"os=pc; osver=Microsoft-Windows-10-Professional-build-10586-64bit; appver=2.0.3.131777; channel=netease; __remember_me=true", "Content-Length":data.length, "Content-Type" :"application/x-www-form-urlencoded", "Connection" :"close" } }; let request = http.request(options,function(res){ //console.dir(res); if(res.statusCode === 404) {throw new Error("File not Found!!!");return;}; if(res.statusCode === 403) {throw new Error("Connection Refused.");return;}; res.setEncoding("utf8"); let d = []; res.on("data",(chunk)=>{ d.push(chunk); }); res.on("end",()=>{ callback(JSON.parse(d.join(""))); }) }); request.on("error",(err)=>{console.log(JSON.stringify(err))}); request.write(data); request.end(); }; module.exports = core;