| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- /*
- 小芒商城助手
- [Script]
- # > 小芒商城助手
- ^https?:\/\/*\.api\.mgtv\.com url script-request-body https://git.jojo21.top/shawenguan/Quantumult-X/raw/master/Scripts/mangguo/mgecomHelper.js
- ^https?:\/\/*\.api\.mgtv\.com url script-response-body https://git.jojo21.top/shawenguan/Quantumult-X/raw/master/Scripts/mangguo/mgecomHelper.js
- [MITM]
- hostname = api.mgtv.com
- */
- const scriptName = `小芒商城助手`;
- const magicJS = MagicJS(scriptName, "INFO");
- const MGEcomConstKey = {
- AllUserInfo: 'mgeComAllUserInfo',
- AllUserConfig: 'mgeComAllUserConfig',
- };
- const gUserAgent = `Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Html5Plus/1.0 (Immersed/20) uni-app`;
- const gHost = `api.wubian.pro`;
- let gToken = magicJS.data.read(WuBianConstKey.Token, '');
- const gCommonHeaders = {
- 'Accept': `*/*`,
- 'Accept-Encoding': `gzip, deflate, br`,
- 'Connection': `keep-alive`,
- 'Content-Type': `application/json`,
- 'Cookie': `token=${gToken}`,
- 'Host': gHost,
- 'User-Agent': gUserAgent,
- 'CLIENT-TYPE': `APP`,
- 'token': gToken,
- 'Accept-Language': `zh-CN,zh-Hans;q=0.9`
- };
- let gRetBody;
- let gAllStateData = {
- }
- let SignHelper = (function () {
- const goldenRatio = 2654435769;
- function decodeByteArray(byteArray, hasLengthPrefix) {
- const length = byteArray.length;
- let totalLength = length << 2;
- if (hasLengthPrefix) {
- const lastByte = byteArray[length - 1];
- if (totalLength -= 4, lastByte < totalLength - 3 || lastByte > totalLength) return "";
- totalLength = lastByte;
- }
- for (let i = 0; i < length; i++) {
- byteArray[i] = String.fromCharCode(255 & byteArray[i], byteArray[i] >>> 8 & 255, byteArray[i] >>> 16 & 255, byteArray[i] >>> 24 & 255);
- }
- const resultString = byteArray.join("");
- return hasLengthPrefix ? resultString.substring(0, totalLength) : resultString;
- }
- function stringToByteArray(str, hasLengthPrefix) {
- const length = str.length;
- let byteArray, arrayLength = length >> 2;
- if (length & 3 !== 0) arrayLength++;
- if (hasLengthPrefix) {
- byteArray = new Array(arrayLength + 1);
- byteArray[arrayLength] = length;
- } else {
- byteArray = new Array(arrayLength);
- }
- for (let i = 0; i < length; ++i) {
- byteArray[i >> 2] |= str.charCodeAt(i) << ((3 & i) << 3);
- }
- return byteArray;
- }
- function unsignedRightShift(value) {
- return 4294967295 & value;
- }
- function customHashFunction(value, key, accumulator, index, arrayLength, keys) {
- return (accumulator >>> 5 ^ key << 2) + (key >>> 3 ^ accumulator << 4) ^ (value ^ key) + (keys[3 & index ^ arrayLength] ^ accumulator);
- }
- function ensureLength(byteArray) {
- if (byteArray.length < 4) byteArray.length = 4;
- return byteArray;
- }
- function encodeByteArray(byteArray, keys) {
- const length = byteArray.length;
- const lastIndex = length - 1;
- let temp, prevByte, nextByte;
- let sum = 0;
- for (prevByte = byteArray[lastIndex], sum = 0 | Math.floor(6 + 52 / length); sum > 0; --sum) {
- sum = unsignedRightShift(sum + goldenRatio);
- nextByte = sum >>> 2 & 3;
- for (let i = 0; i < lastIndex; ++i) {
- temp = byteArray[i + 1];
- prevByte = byteArray[i] = unsignedRightShift(byteArray[i] + customHashFunction(sum, temp, prevByte, i, nextByte, keys));
- }
- temp = byteArray[0];
- prevByte = byteArray[lastIndex] = unsignedRightShift(byteArray[lastIndex] + customHashFunction(sum, temp, prevByte, lastIndex, nextByte, keys));
- }
- return byteArray;
- }
- function utf8Encode(str) {
- if (/^[\x00-\x7f]*$/.test(str)) return str;
- const utf8Str = [];
- const length = str.length;
- for (let i = 0, j = 0; i < length; ++i, ++j) {
- const charCode = str.charCodeAt(i);
- if (charCode < 128) {
- utf8Str[j] = str.charAt(i);
- } else if (charCode < 2048) {
- utf8Str[j] = String.fromCharCode(192 | charCode >> 6, 128 | 63 & charCode);
- } else {
- if (charCode >= 55296 && charCode <= 57343) {
- if (i + 1 < length) {
- const nextCharCode = str.charCodeAt(i + 1);
- if (charCode < 56320 && 56320 <= nextCharCode && nextCharCode <= 57343) {
- const surrogatePair = 65536 + ((1023 & charCode) << 10 | 1023 & nextCharCode);
- utf8Str[j] = String.fromCharCode(240 | surrogatePair >> 18 & 63, 128 | surrogatePair >> 12 & 63, 128 | surrogatePair >> 6 & 63, 128 | 63 & surrogatePair);
- ++i;
- continue;
- }
- }
- throw new Error("Malformed string");
- }
- utf8Str[j] = String.fromCharCode(224 | charCode >> 12, 128 | charCode >> 6 & 63, 128 | 63 & charCode);
- }
- }
- return utf8Str.join("");
- }
- function encryptString(str, key) {
- if (str.length === 0) return str;
- str = utf8Encode(str);
- key = utf8Encode(key);
- return decodeByteArray(encodeByteArray(stringToByteArray(str, true), ensureLength(stringToByteArray(key, false))), false);
- }
- function base64Encode(str1, str2) {
- return btoa(encryptString(str1, str2));
- }
- function generateCustomString(str1, str2) {
- const md5 = createWMd5();
- return md5.hex_md5_32(`string xiaomang = "${str1}|${str2}";`);
- }
- function generateUuidWithVersion(uuid, version, offset) {
- const data = {
- uuid: uuid,
- reunixtime: Math.round((Date.now() - offset) / 1000),
- };
- const customString = generateCustomString(uuid, version);
- return base64Encode(JSON.stringify(data), customString);
- }
- function generateAnotherCustomString(str1, str2) {
- const md5 = createWMd5();
- return md5.hex_md5_32(`string ma = "${str1}|${str2}";`);
- }
- function generateRandomSalt() {
- const multiplier = 38833;
- const randomValue = Math.floor(Math.random() * 2 ** 32) + 1;
- return randomValue * multiplier;
- }
- function generateSignedUuid(uuid, version, offset, maBig, maSi) {
- let i = 0;
- let signedUuid = "";
- while (!(signedUuid <= maBig && signedUuid.includes(maSi))) {
- if (++i > 100000) return "";
- signedUuid = generateUuidWithSalt(uuid, version, offset);
- }
- console.log(i);
- return signedUuid;
- }
- function generateUuidWithSalt(uuid, version, offset) {
- const data = {
- uuid: uuid,
- reunixtime: Math.round((Date.now() - offset) / 1000),
- salt: generateRandomSalt(),
- };
- const customString = generateAnotherCustomString(uuid, version);
- return base64Encode(JSON.stringify(data), customString);
- }
- async function getDySign(uuid) {
- let stateData = await getStateData();
- const { userConfig, userInfo, diffTime } = stateData;
- return generateUuidWithVersion(userInfo.uuid, userConfig.version, diffTime);
- }
- async function getMaSign(uuid) {
- let stateData = await getStateData();
- const { userConfig, userInfo, diffTime } = stateData;
- return generateSignedUuid(userInfo.uuid || "", userConfig.version, diffTime, userConfig.version_ma_big, userConfig.version_ma_si);
- }
- return {
- getDySign: getDySign,
- getMaSign: getMaSign,
- };
- })();
- async function Main() {
- if (magicJS.isStrictRequest) {
- magicJS.checkRecordRequestBody();
- }
- if (magicJS.isRequest) {
- checkHandleRequest();
- } else {
- updateHeaders();
- }
- magicJS.notification.msg('');
- if (gRetBody) {
- magicJS.done({
- body: JSON.stringify(gRetBody)
- });
- } else {
- magicJS.done();
- }
- }
- function checkHandleRequest() {
- const url = $request.url;
- const path = $request.path;
- magicJS.logger.info(`请求url=${url}#${$request.method}`);
- magicJS.logger.info(`请求body=${magicJS.getRequestBody()}`);
- if ($request && $request.method != 'OPTIONS') {
- switch (path) {
- case '/GetUserInfo':
- handleUserInfo();
- break;
- case '/user/home/info':
- handleUserHomeInfo();
- break;
- default:
- break;
- }
- }
- }
- function handleHeaders() {
- }
- function updateHeaders() {
- }
- function getResponsePlainData() {
- let data = magicJS.getResponseBody();
- if (!data) {
- return;
- }
- try {
- return JSON.parse(data);
- } catch (err) {
- magicJS.logger.info(data);
- magicJS.logger.error(err);
- }
- }
- function getRequestPlainData() {
- let data = magicJS.getRequestBody();
- let reqData = null;
- if (data) {
- reqData = JSON.parse(data);
- } else {
- reqData = magicJS.parseQueryStr($request.url);
- }
- return reqData;
- }
- function getQueryPlainData() {
- let params = magicJS.parseQueryStr($request.url);
- return params;
- }
- function handleUserInfo() {
- let rspData = getResponsePlainData();
- if (!rspData) {
- return;
- }
- if (rspData.code != 200) {
- return;
- }
- let allUserDict = magicJS.data.read(MGEcomConstKey.AllUserInfo, {});
- const userInfo = rspData.data;
- if (userInfo) {
- let uuid = userInfo.uuid;
- let mobile = userInfo.relate_mobile;
- if (userInfo.ticket) {
- allUserDict[uuid] = userInfo;
- allUserDict[mobile] = userInfo;
- setDiffTime(Date.now() - 1e3 * homeInfo.unixtime);
- } else {
- delete allUserDict[uuid];
- delete allUserDict[mobile];
- }
- } else {
- let reqData = getQueryPlainData();
- let uuid = reqData.uuid;
- let oldUserInfo = allUserDict[uuid];
- if (oldUserInfo) {
- let mobile = oldUserInfo.relate_mobile;
- delete allUserDict[uuid];
- delete allUserDict[mobile];
- }
- }
- magicJS.data.write(MGEcomConstKey.AllUserInfo, allUserDict);
- }
- function handleUserHomeInfo() {
- let rspData = getResponsePlainData();
- if (!rspData) {
- return;
- }
- if (rspData.code != 200) {
- return;
- }
- const homeInfo = rspData.data;
- let allConfigDict = magicJS.data.read(MGEcomConstKey.AllUserConfig, {});
- let reqData = getQueryPlainData();
- let uuid = reqData.uuid;
- allConfigDict[uuid] = homeInfo;
- magicJS.data.write(MGEcomConstKey.AllUserConfig, allConfigDict);
- setDiffTime(Date.now() - 1e3 * homeInfo.unixtime);
- }
- async function getStateData(uuid) {
- let state = gAllStateData[uuid];
- if (!state) {
- state = {
- diffTime: 0,
- userInfo: null,
- userConfig: null,
- };
- gAllStateData[uuid] = state;
- };
- if (!state.userInfo) {
- state.userConfig = await getUserConfig(uuid);
- }
- if (!state.userInfo) {
- state.userInfo = await getUserInfo(uuid);
- }
- return state;
- }
- async function getUserConfig(uuid) {
- let allUserDict = magicJS.data.read(MGEcomConstKey.AllUserInfo, {});
- let userConfig = allUserDict[uuid];
- if (!userConfig) {
- }
- return userConfig;
- }
- async function getUserInfo(uuid) {
- let allConfigDict = magicJS.data.read(MGEcomConstKey.AllUserConfig, {});
- let userInfo = allConfigDict[uuid];
- if (!userInfo) {
- }
- return userInfo;
- }
- async function getDiffTime() {
- return 0;
- }
- function setDiffTime(diffTime) {
- }
- Main().catch((e) => magicJS.logger.log(`-\n ${e}`)).finally(() => magicJS.done());
|