@genshin-kit/core
Version:
An API wrapper for fetching player data of Genshin Impact from any servers.
61 lines • 2.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._getDS = void 0;
const tslib_1 = require("tslib");
const crypto_1 = (0, tslib_1.__importDefault)(require("crypto"));
const url_1 = require("url");
/**
* @function _getDS get DynamicSecret
*/
function _getDS({ query, body }) {
switch (this.serverType) {
case 'os':
return getOsDS('6s25p5ox5y14umn1p61aqyyvbvvl3lrt');
case 'cn':
default:
return getCnDS({ query, body });
}
}
exports._getDS = _getDS;
// 生成随机字符串
function randomString(e) {
const s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
const res = [];
for (let i = 0; i < e; ++i) {
res.push(s[Math.floor(Math.random() * s.length)]);
}
return res.join('');
}
// 按首字母排序 object
function sortKeys(obj) {
const copy = {};
const allKeys = Object.keys(obj).sort();
allKeys.forEach((key) => {
copy[key] = obj[key];
});
return copy;
}
function getOsDS(salt) {
const time = Math.floor(Date.now() / 1000);
const random = randomString(6);
const c = crypto_1.default
.createHash('md5')
.update(`salt=${salt}&t=${time}&r=${random}`)
.digest('hex');
return `${time},${random},${c}`;
}
function getCnDS({ query, body, }) {
const salt = 'xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs';
const time = Math.floor(Date.now() / 1000);
// Integer between 100000 - 200000
const random = Math.floor(Math.random() * (200000 - 100000 + 1)) + 100000;
const b = body ? JSON.stringify(sortKeys(body)) : '';
const q = query ? new url_1.URLSearchParams(sortKeys(query)) : '';
const check = crypto_1.default
.createHash('md5')
.update(`salt=${salt}&t=${time}&r=${random}&b=${b}&q=${q}`)
.digest('hex');
const dynamic = `${time},${random},${check}`;
return dynamic;
}
//# sourceMappingURL=_getDS.js.map