133 lines
3.6 KiB
JavaScript
133 lines
3.6 KiB
JavaScript
const crypto = require('crypto');
|
|
const getParams = (ep) => {
|
|
const a1 = 'xkt3a41psizxrh9l';
|
|
const a = [
|
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,
|
|
60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
|
|
44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
|
|
];
|
|
let o = ep.length;
|
|
let r = 0;
|
|
let n, e;
|
|
const a2 = [];
|
|
while (r < o) {
|
|
e = a[255 & ep[r].charCodeAt()];
|
|
r += 1;
|
|
while (r < o && -1 === e) {
|
|
e = a[255 & ep[r].charCodeAt()];
|
|
r += 1;
|
|
}
|
|
|
|
if (-1 === e) {
|
|
break;
|
|
}
|
|
n = a[255 & ep[r].charCodeAt()];
|
|
r += 1;
|
|
while (r < o && -1 === n) {
|
|
n = a[255 & ep[r].charCodeAt()];
|
|
r += 1;
|
|
}
|
|
if (-1 === n) {
|
|
break;
|
|
}
|
|
a2.push((e << 2) | ((48 & n) >> 4));
|
|
e = 255 & ep[r].charCodeAt();
|
|
r += 1;
|
|
if (61 === e) {
|
|
break;
|
|
}
|
|
e = a[e];
|
|
while (r < o && -1 === e) {
|
|
e = 255 & ep[r].charCodeAt();
|
|
if (61 === e) {
|
|
break;
|
|
}
|
|
e = a[e];
|
|
}
|
|
if (-1 === e) {
|
|
break;
|
|
}
|
|
a2.push(((15 & n) << 4) | ((60 & e) >> 2));
|
|
n = 255 & ep[r].charCodeAt();
|
|
r += 1;
|
|
if (61 === n) {
|
|
break;
|
|
}
|
|
n = a[n];
|
|
while (r < o && -1 === n) {
|
|
n = 255 & ep[r].charCodeAt();
|
|
if (61 === n) {
|
|
break;
|
|
}
|
|
n = a[n];
|
|
}
|
|
if (-1 === n) {
|
|
break;
|
|
}
|
|
a2.push(((3 & e) << 6) | n);
|
|
}
|
|
|
|
const r1 = Array.from(Array(256), (v, i) => i);
|
|
|
|
let i = '';
|
|
o = 0;
|
|
for (let a = 0; a < 256; a++) {
|
|
o = (o + r1[a] + a1[a % a1.length].charCodeAt()) % 256;
|
|
[r1[a], r1[o]] = [r1[o], r1[a]];
|
|
}
|
|
|
|
let a3 = 0;
|
|
o = 0;
|
|
for (const u of a2) {
|
|
a3 = (a3 + 1) % 256;
|
|
o = (o + r1[a3]) % 256;
|
|
[r1[a3], r1[o]] = [r1[o], r1[a3]];
|
|
i += String.fromCharCode(u ^ r1[(r1[a3] + r1[o]) % 256]);
|
|
}
|
|
i = i.split('-');
|
|
return {
|
|
sign: i[1],
|
|
buy_key: i[0],
|
|
token: i[2],
|
|
timestamp: i[3],
|
|
};
|
|
};
|
|
|
|
const getPath = (seed, fileId) => {
|
|
let t = String.raw`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890`;
|
|
let cgStr = '';
|
|
const l = t.length;
|
|
let o;
|
|
const idKey = fileId.split('*');
|
|
for (let i = 0; i < l; i++) {
|
|
seed = (211 * seed + 30031) % 65536;
|
|
o = parseInt((seed * t.length) / 65536);
|
|
cgStr += t[o];
|
|
t = t.split(t[o]).join('');
|
|
}
|
|
|
|
const url = idKey.map((id) => cgStr[id]).join('');
|
|
return url;
|
|
};
|
|
|
|
const getUrl = (r) => {
|
|
const params = getParams(r.ep);
|
|
params.duration = r.duration;
|
|
const paramsArray = Object.keys(params)
|
|
.filter((key) => params[key])
|
|
.map((key) => `${key}=${params[key]}`);
|
|
const url = `https://audiopay.cos.xmcdn.com/download/${r.apiVersion}/${getPath(r.seed, r.fileId)}?${paramsArray.join('&')}`;
|
|
return url;
|
|
};
|
|
|
|
const getRandom16 = (len) =>
|
|
crypto
|
|
.randomBytes(Math.ceil(len / 2))
|
|
.toString('hex')
|
|
.slice(0, len);
|
|
|
|
module.exports = {
|
|
getUrl,
|
|
getRandom16,
|
|
};
|