const config = { "PATH_IMG_V2_PRO": "https://cdn-image.gandart.com/", "RUN_TYPE": 1, "BOTTOM_LOAD_MORE_THROTTLE": 100, "BASE_API": "https://api.gandart.com/base", "RESALE_API": "https://api.gandart.com/market", "RESALE_API_V2": "https://api2.gandart.com/market/api/v2", "RESALE_API_V3": "https://api2.gandart.com/market/api/v3", "SALE_API": "https://api.gandart.com/read/api", "ORDER_API": "https://api.gandart.com", "WALLET_API": "https://api.gandart.com/api", "HXT_API": "https://api.gandart.com/wallet", "PATH_IMG_V2": "https://cdn-image.gandart.com/", "SAND_RECHARGE_ACTION": "https://cap.sandpay.com.cn/v4/front-electrans/ceas.elec.trans.quick.deposit.apply", "GAME_ElF_API": "https://elf.pentajam.cn/api", "GAME_ELF_URL": "https://elf.pentajam.cn", "CORECENTER_URL": "https://api.gandart.com/corecenter" }; const lk = new ToolKit(`光予分解手`, `GandartExchanger`, `gandartExchange.js`); const GandartConstKey = { // -----通用助手相关的----- Token: 'lkGandartToken', UserData: 'lkGandartUserData', PrivCollectionBrief: 'lkGandartPrivCollectionBrief', PrivCollectionDetail: 'lkGandartPrivCollectionDetail', CollectionName: 'lkGandartCollectionName', CastingId: 'lkGandartCastingId', LimitPrice: 'lkGandartLimitPrice', TransactionRecordId: 'lkGandartTransactionRecordId', CollectionCateLst: 'lkGandartCollectionCateLst', FloatPriceIntaval: 'lkGandartFloatPriceIntaval', IsCollectionWatchLocked: 'lkIsGandartCollectionWatchLocked', PrivWalletListInUse: 'lkGandartPrivWalletListInUse', IsCollectionMaxNumLimit: 'lkGandartIsCollectionMaxNumLimit', CollectionLockMaxNum: 'lkGandartCollectionLockMaxNum', // -----置换分解脚本增加的----- ExchangeFuncEnalbleList: 'lkGandartExchangeFuncEnalbleList', ExchangeTaskList0: 'lkGandartExchangeTaskList0', ExchangeTaskList1: 'lkGandartExchangeTaskList1', ExchangeTaskList2: 'lkGandartExchangeTaskList2', ExchangeTaskId: 'lkGandartExchangeTaskId', ExchangeTaskSearchEnable: 'lkIsExchangeTaskSearchEnable', ExchangeTaskSearchKey: 'lkGandartExchangeTaskSearchKey', ExchangeTaskNameDisplay: 'lkGandartExchangeTaskNameDisplay', ExchangeCountArray: 'lkGandartExchangeCountArray', ExchangeTaskMateList: 'lkGandartExchangeTaskMateList', ExchangeTaskFinalList: 'lkGandartExchangeTaskFinalList', ExchangeTaskListStatus: 'lkGandartExchangeTaskListStatus', ExchangeTaskListCache: 'lkIsExchangeTaskListCache', ExchangeMaterialCache: 'lkIsExchangeMaterialCache', ExchangeTaskMode: 'lkGandartExchangeTaskMode', ExchangeBatchEnable: 'lkIsExchangeBatchEnable', ExchangeBatchGroupCount: 'lkGandartExchangeBatchGroupCount', }; let gandartToken = lk.getVal(GandartConstKey.Token, ''); let gandartUserAgent = `Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1`; const GCommonGandartHeads = { 'Accept': `application/json, text/plain, */*`, 'Origin': `https://www.gandart.com`, 'Accept-Encoding': `gzip, deflate, br`, 'Content-Type': `application/x-www-form-urlencoded;charset=UTF-8`, 'Connection': `keep-alive`, 'Host': `api2.gandart.com`, 'User-Agent': gandartUserAgent, 'Referer': `https://www.gandart.com/`, 'Accept-Language': `zh-CN,zh-Hans;q=0.9`, 'token': gandartToken }; let gAllMaterialDetails = null; const gUsedMaterialDetails = {}; let gFuncEnables = lk.getVal(GandartConstKey.ExchangeFuncEnalbleList); if (!lk.isEmpty(gFuncEnables)) { gFuncEnables = gFuncEnables.split(','); } else { gFuncEnables = ["TaskList", "MateList", "DecidedList"]; } if (!lk.isExecComm) { if (!lk.isRequest()) { all(); } } async function all() { let taskLst = []; if (isGetTaskListEnable()) { let status = getExchangeTaskListStatus(); let tmpLst = []; switch (status) { case 0: tmpLst = await checkGetExchangeTaskList(status); if (tmpLst) { taskLst = taskLst.concat(tmpLst); } break; case 1: tmpLst = await checkGetExchangeTaskList(status); if (tmpLst) { taskLst = taskLst.concat(tmpLst); } break; case 2: tmpLst = await checkGetExchangeTaskList(status); if (tmpLst) { taskLst = taskLst.concat(tmpLst); } break; case 3: tmpLst = await checkGetExchangeTaskList(1); if (tmpLst) { taskLst = taskLst.concat(tmpLst); } tmpLst = await checkGetExchangeTaskList(0); if (tmpLst) { taskLst = taskLst.concat(tmpLst); } break; default: break; } } if (taskLst.length == 0) { lk.log('置换分解任务列表为空'); } if (isCaclMateListEnable()) { let isFoundOnce = await checkToExchangeConformingTasks(taskLst); if (!isFoundOnce) { lk.log('没有任何相符合的置换分解任务'); } } lk.msg(''); lk.done(); } async function checkToExchangeConformingTasks(taskLst) { let taskIds = getWillExchangeTaskIds(); let isFoundOnce = false; let found = false; for (let i = 0; i < taskIds.length; i++) { let taskId = taskIds[i]; found = false; if (taskId > 0) { for (let j = 0; j < taskLst.length; j++) { let taskInfo = taskLst[j]; if (taskInfo.id == taskId) { found = true; lk.setVal(GandartConstKey.ExchangeTaskNameDisplay, taskInfo.compositeTaskName); await tryToExecExchangeTask(taskInfo.id, taskInfo, i); break; } } if (!found) { lk.log(`[${i}]当前任务列表找不到指定任务[${taskId}]`); found = await checkTrySearchToExchangeTask(taskLst, i); } } else { lk.log(`[${i}]没有设置指定任务ID,检查是否需进行检索合成`); await checkTrySearchToExchangeTask(taskLst, i); } if (found) { isFoundOnce = found; } } found = false; let keyNames = getWillExchangeTaskSearchKeys(); for (let i = taskIds.length; i < keyNames.length; i++) { lk.log(`[${i}]没有设置指定任务ID,检查是否需进行检索合成`); found = await checkTrySearchToExchangeTask(taskLst, i); if (found) { isFoundOnce = found; } } return isFoundOnce; } async function checkTrySearchToExchangeTask(taskLst, sortIdx) { if (!isTaskNameSearchMode()) { return; } lk.log('开始尝试通过名称来检索任务进行合成'); let keyNames = getWillExchangeTaskSearchKeys(); let keyName = keyNames[sortIdx]; if (lk.isEmpty(keyName)) { lk.log(`当前检索关键字为空`); return; } let found = false; for (let i = 0; i < taskLst.length; i++) { let taskInfo = taskLst[i]; let taskName = taskInfo.compositeTaskName; if (taskName.indexOf(keyName) > -1) { found = true; lk.log(`检索到相符的任务[${taskName}#${taskInfo.id}]`); lk.setVal(GandartConstKey.ExchangeTaskNameDisplay, taskName); await tryToExecExchangeTask(taskInfo.id, taskInfo, sortIdx); } } if (!found) { lk.log(`当前关键字[${keyName}]没有检索到相关的任务`); } return found; } function getExchangeTaskListStatus() { let val = lk.getVal(GandartConstKey.ExchangeTaskListStatus); if (lk.isEmpty(val)) { val = 1; } else { val = Number(val); } return val; } function getExchangeTaskMode() { let val = lk.getVal(GandartConstKey.ExchangeTaskMode); if (lk.isEmpty(val)) { val = 0; } else { val = Number(val); } return val; } function isGetTaskListEnable() { if (gFuncEnables.indexOf('TaskList') > -1) { return true; } return false; } function isCaclMateListEnable() { if (gFuncEnables.indexOf('MateList') > -1) { return true; } return false; } function isGenFinalLisstEnable() { if (gFuncEnables.indexOf('DecidedList') > -1) { return true; } return false; } function isExecFinalExchange() { if (gFuncEnables.indexOf('ExecExchange') > -1) { return true; } return false; } function checkIsExchangeTaskExec(taskInfo) { if (taskInfo) { if (taskInfo.endTime && taskInfo.startTime) { let nowDate = new Date(); let endDate = new Date(taskInfo.endTime); if (nowDate.getTime() >= endDate.getTime()) { return true; } let startDate = new Date(taskInfo.startTime); if (nowDate.getTime() > startDate.getTime() - 1000) { return true; } return false; } } return true; } function getWillExchangeTaskIds() { let valArr = lk.getVal(GandartConstKey.ExchangeTaskId); if (!lk.isEmpty(valArr)) { let segments = valArr.split('|'); valArr = []; for (let vstr of segments) { valArr.push(Number(vstr)); } } else { valArr = []; } return valArr; } function getWillExchangeTaskSearchKeys() { let keyArr = lk.getVal(GandartConstKey.ExchangeTaskSearchKey) if (!lk.isEmpty(keyArr)) { let segments = keyArr.split('|'); keyArr = []; for (let vstr of segments) { keyArr.push(vstr); } } else { keyArr = []; } return keyArr; } function isTaskNameSearchMode() { let enabled = lk.getVal(GandartConstKey.ExchangeTaskSearchEnable); if (!lk.isEmpty(enabled)) { enabled = JSON.parse(enabled); } else { enabled = true; } return enabled; } function isExchangeBatchEnable() { let enabled = lk.getVal(GandartConstKey.ExchangeBatchEnable); if (!lk.isEmpty(enabled)) { enabled = JSON.parse(enabled); } else { enabled = true; } return enabled; } function printMaterialGroupsInfo(materialGroups) { let detailStr = '组合详情如下:\n'; for (let i = 0; i < materialGroups.length; i++) { let group = materialGroups[i]; let needStr = ''; for (let j = 0; j < group.length; j++) { needStr += `${group[j].collectionName}x${group[j].number},` } detailStr += `组合${i}:${needStr.substring(0, needStr.length - 1)}\n`; } lk.log(detailStr); } async function checkGetMaterialDetails(gUsedMaterialDetails, materialDict) { let useCache = lk.getVal(GandartConstKey.ExchangeMaterialCache); if (!lk.isEmpty(useCache)) { useCache = JSON.parse(useCache); } else { useCache = false; } lk.log(`置换分解材料列表本地缓存:${useCache}`); let isReqServerData = false; if (useCache) { let jsonStr = lk.getVal(GandartConstKey.PrivCollectionDetail); if (!lk.isEmpty(jsonStr)) { try { let data = JSON.parse(jsonStr); gAllMaterialDetails = data; for (let k in materialDict) { gUsedMaterialDetails[k] = data[k]; } } catch (error) { lk.logErr(error); isReqServerData = true; } } else { isReqServerData = true; } } else { isReqServerData = true; } if (isReqServerData) { for (let k in materialDict) { let mInfo = materialDict[k]; gUsedMaterialDetails[k] = await getDetailByCasting(mInfo.castingId, mInfo.collectionName); } } return gUsedMaterialDetails; } async function tryToExecExchangeTask(taskId, taskInfo = {}, sortIdx = 0) { if (getExchangeTaskMode() == 1) { lk.log('开始极速模式执行置换分解任务'); let data = getExchangeTaskFinalList(); if (data) { let taskInfo = data.taskInfo; let finalGroups = data.finalGroups; if (finalGroups.length == 0) { lk.log('暂无可行的置换分解组合,请检查'); lk.appendNotifyInfo('⚠️暂无可行的置换分解组合'); return; } lk.log(`最终选择可执行置换分解数:${finalGroups.length}`); let tmpJsonStr = JSON.stringify(finalGroups, null, 2); lk.log(`详情如下:\n${tmpJsonStr}`); if (isExecFinalExchange() && checkIsExchangeTaskExec(taskInfo)) { await doExecFinalExchange(taskInfo.id, taskInfo, finalGroups); } else { lk.log('暂未进行最后一步置换分解'); } } return; } lk.log('开始普通模式执行置换分解任务'); let materialSelLst = await getCompositeMaterial(taskId, taskInfo); if (materialSelLst && materialSelLst.length > 0) { let ret = calcCompositeGroups(materialSelLst); // 材料排列组合 let materialGroups = ret[0]; lk.log(`排列组合组数:${materialGroups.length}`); // printMaterialGroupsInfo(materialGroups); let materialDict = ret[1]; // 获取用户材料拥有详情 await checkGetMaterialDetails(gUsedMaterialDetails, materialDict); // 找出可行的合成搭配 let validCompositeGroups = findValidGroupMaterialGroups(materialGroups, gUsedMaterialDetails); setExchangeTaskMateListForDisplay(validCompositeGroups); // printMaterialGroupsInfo(validCompositeGroups, '预估可行组合数'); if (isGenFinalLisstEnable()) { let exchangeCountDict = getExchangeCountDict(sortIdx); let finalGroups = []; for (let k in exchangeCountDict) { let mGroup = validCompositeGroups[k]; if (mGroup) { let arr = checkPickMaterialForExchange(mGroup, gUsedMaterialDetails, exchangeCountDict[k]); finalGroups = finalGroups.concat(arr); } } lk.log(`最终选择可执行置换分解数:${finalGroups.length}`); let tmpJsonStr = JSON.stringify(finalGroups, null, 2); lk.log(`详情如下:\n${tmpJsonStr}`); if (isExecFinalExchange() && checkIsExchangeTaskExec(taskInfo)) { if (finalGroups.length == 0) { lk.log('暂无可行的置换分解组合,请检查'); // lk.appendNotifyInfo('⚠️暂无可行的合成组合'); return; } await doExecFinalExchange(taskId, taskInfo, finalGroups); } else { lk.log('暂未进行最后一步置换分解'); setExchangeTaskFinalList(taskInfo, finalGroups); } } else { lk.execFail(); lk.appendNotifyInfo('⚠️请设置光予置换分解任务ID'); } } return; } function setExchangeTaskMateListForDisplay(validCompositeGroups) { lk.log(`预估可行组合数:${validCompositeGroups.length}`); let disText = ''; for (let i = 0; i < validCompositeGroups.length; i++) { let group = validCompositeGroups[i]; let rowText = `[${i}]`; for (let j = 0; j < group.length; j++) { let mInfo = group[j]; rowText += `${mInfo.collectionName}x${mInfo.number},`; } disText += rowText.substring(0, rowText.length - 1) + '\n'; } lk.log(disText); lk.setVal(GandartConstKey.ExchangeTaskMateList, disText); } function getBatchExchangeGroupCount() { let numStr = lk.getVal(GandartConstKey.ExchangeBatchGroupCount); if (lk.isEmpty(numStr)) { return 5; } return Number(numStr); } async function doExecFinalExchange(taskId, taskInfo, finalGroups) { let retOrderLst = []; let retWillDelLst = []; let batchGroupCnt = getBatchExchangeGroupCount(); let startIdx = 0; // 检查是否进行多个批量合成 if (isExchangeBatchEnable() && finalGroups.length >= batchGroupCnt) { let batchMaxNum = Math.floor(finalGroups.length / batchGroupCnt); for (let i = 0; i < batchMaxNum; i++) { let compositeList = []; for (let j = 0; j < batchGroupCnt; j++) { compositeList.push({ materialDetailList: finalGroups[startIdx] }); startIdx += 1; } let ret = await confirmCompositeV2(taskId, taskInfo, compositeList); if (ret) { for (let idx = startIdx - batchMaxNum; idx < startIdx; idx++) { retWillDelLst.push(idx); } retOrderLst.push(ret); } } } // 剩下的进行单个合成 for (let i = startIdx; i < finalGroups.length; i++) { let idx = i; let compositeList = [ { materialDetailList: finalGroups[i] } ]; let ret = await confirmCompositeV2(taskId, taskInfo, compositeList); if (ret) { retWillDelLst.push(idx); retOrderLst.push(ret); } } if (retOrderLst.length > 0) { let successCnt = 0; let noStockCnt = 0; for (let i = 0; i < retOrderLst.length; i++) { const orderNum = retOrderLst[i]; lk.log(`[${i}]单号:${orderNum}`); if (orderNum.indexOf('#') > -1) { successCnt += 1; } else if (orderNum.indexOf('!') > -1) { noStockCnt += 1; } else { successCnt += 1; await checkCompositeResult(orderNum); } } lk.log(`分解成功单数:${successCnt}`); lk.log(`库存不足单数:${noStockCnt}`); // 从高的序号删除 let usedGroups = []; for (let i = retWillDelLst.length - 1; i >= 0; i--) { let idx = retWillDelLst[i]; lk.log(`编号[${idx}]一组的材料分解销毁删除`); usedGroups.push(finalGroups[idx]); finalGroups.splice(idx, 1); } let tmpJsonStr = JSON.stringify(finalGroups, null, 2); lk.log(`剩余未完成的组合如下:\n${tmpJsonStr}`); setExchangeTaskFinalList(taskInfo, finalGroups); refreshMaterialAfterComposite(usedGroups); } else { lk.log('置换分解成功单数:0'); } } function setExchangeTaskFinalList(taskInfo, finalGroups) { let simpleInfo = { id: taskInfo.id, compositeLabel: taskInfo.compositeLabel, compositeTaskName: taskInfo.compositeTaskName, surplus: taskInfo.surplus, } let finalCacheData = { taskInfo: simpleInfo, finalGroups: finalGroups, }; lk.setVal(GandartConstKey.ExchangeTaskFinalList, JSON.stringify(finalCacheData, null, 2)); } function refreshMaterialAfterComposite(usedGroups) { if (usedGroups.length == 0) { return; } if (!gAllMaterialDetails) { let jsonStr = lk.getVal(GandartConstKey.PrivCollectionDetail); if (!lk.isEmpty(jsonStr)) { try { let data = JSON.parse(jsonStr); gAllMaterialDetails = data; } catch (error) { lk.logErr(error); } for (let group of usedGroups) { for (let one of group) { deleteUsedMaterial(one.castingId, one.orderList); } } jsonStr = JSON.stringify(gAllMaterialDetails, null, 2); lk.setVal(GandartConstKey.PrivCollectionDetail, jsonStr); } } } function deleteUsedMaterial(castingId, recordIdLst) { let itemLst = gAllMaterialDetails[castingId]; if (itemLst) { let remainLst = []; for (let i = 0; i < itemLst.length; i++) { if (recordIdLst.indexOf(itemLst[i].id) == -1) { remainLst.push(itemLst[i]); } } gAllMaterialDetails[castingId] = remainLst; } } function getExchangeTaskFinalList() { let data; let jsonStr = lk.getVal(GandartConstKey.ExchangeTaskFinalList); if (!lk.isEmpty(jsonStr)) { data = JSON.parse(jsonStr); } return data; } function getExchangeCountDict(sortIdx) { let str = lk.getVal(GandartConstKey.ExchangeCountArray, '0#1'); let arr0 = str.split('|'); let ret = {}; if (sortIdx < arr0.length) { let arr1 = arr0[sortIdx].split(','); for (let i = 0; i < arr1.length; i++) { let arr2 = arr1[i].split('#'); let key = arr2[0]; ret[key] = Number(arr2[1] || 1); } } else { ret[0] = 1; } return ret; } function findValidGroupMaterialGroups(materialGroups, materialDetails) { let validGroups = []; for (let i = 0; i < materialGroups.length; i++) { let canCount = checkMaterialEnough(materialGroups[i], materialDetails); if (canCount > 0) { validGroups.push(materialGroups[i]); } } return validGroups; } function checkMaterialEnough(materialGroup, materialDetails) { let minCount = 99999; for (let i = 0; i < materialGroup.length; i++) { const materialObj = materialGroup[i]; const castingId = materialObj.castingId; const ownLst = materialDetails[castingId]; if (!ownLst) { minCount = 0; break; } if (ownLst.length >= materialObj.number) { let maxCount = Math.floor(ownLst.length / materialObj.number); if (maxCount < minCount) { minCount = maxCount; } } else { minCount = 0; break; } } if (minCount == 99999) { minCount = 0; } return minCount } function checkPickMaterialForExchange(materialGroup, materialDetails, wantCount) { let needNumDict = {}; for (let i = 0; i < materialGroup.length; i++) { const materialObj = materialGroup[i]; const castingId = materialObj.castingId; if (!needNumDict[castingId]) { needNumDict[castingId] = materialObj.number; } else { needNumDict[castingId] += materialObj.number; } } let minCount = 99999; for (let kid in needNumDict) { const ownLst = materialDetails[kid] || []; const maxCount = Math.floor(ownLst.length / needNumDict[kid]); if (maxCount < minCount) { minCount = maxCount; } } minCount = Math.min(minCount, wantCount); let nCompositeGroup = []; for (let n = 0; n < minCount; n++) { let resultMaterialLst = []; let interrupt = false; for (let i = 0; i < materialGroup.length; i++) { const materialObj = materialGroup[i]; const castingId = materialObj.castingId; let ownLst = materialDetails[castingId]; let num = materialObj.number; if (ownLst.length < num) { interrupt = true; break; } let materialSeries = { castingId: castingId, orderList: [], }; for (let j = ownLst.length - 1; j >= 0; j--) { num -= 1; let info = ownLst[j]; materialSeries.orderList.push(info.id); ownLst.splice(j, 1); if (num == 0) { break; } } resultMaterialLst.push(materialSeries); } if (interrupt) { break; } nCompositeGroup.push(resultMaterialLst); } return nCompositeGroup; } function calcCompositeGroups(materialSelLst) { let materialDict = {}; let materialGroups = []; function doArrangeMeterialGroup(transArr, index, resultArr, resultTmp) { for (let i = 0; i < transArr[index].length; i++) { const materialInfo = transArr[index][i]; resultTmp[index] = materialInfo; const castingId = materialInfo.castingId; materialDict[castingId] = materialInfo; if (index != transArr.length - 1) { doArrangeMeterialGroup(transArr, index + 1, resultArr, resultTmp); } else { resultArr.push([].concat(resultTmp)); } } return resultArr; } doArrangeMeterialGroup(materialSelLst, 0, materialGroups, []); return [materialGroups, materialDict]; } async function checkGetExchangeTaskList(status) { let taskLst; let useCache = lk.getVal(GandartConstKey.ExchangeTaskListCache); if (!lk.isEmpty(useCache)) { useCache = JSON.parse(useCache); } else { useCache = false; } lk.log(`置换分解任务列表本地缓存:${useCache}`); if (useCache) { taskLst = getExchangeTaskListByCache(status); } else { taskLst = []; let taskDetail = await getExchangeTaskListByServer(status, 10, 1); if (taskDetail && taskDetail.rows) { taskLst = concatTaskList(taskLst, taskDetail.rows, 1); let totalPage = taskDetail.totalPage; for (let i = 2; i < totalPage + 1; i++) { taskDetail = await getExchangeTaskListByServer(status, 10, i); if (taskDetail && taskDetail.rows) { taskLst = concatTaskList(taskLst, taskDetail.rows, i); } } } cacheExchangeTaskList(status, taskLst); } return taskLst; } function concatTaskList(latestLst, newLst, page) { for (let i = 0; i < newLst.length; i++) { newLst[i].page = page; latestLst.push(newLst[i]); } return latestLst; } function getExchangeTaskListByCache(status, pageSize = 10, page = 1) { try { let jsonStr = ''; if (status == 0) { jsonStr = lk.getVal(GandartConstKey.ExchangeTaskList0); } else if (status == 1) { jsonStr = lk.getVal(GandartConstKey.ExchangeTaskList1); } else if (status == 2) { jsonStr = lk.getVal(GandartConstKey.ExchangeTaskList2); } if (!lk.isEmpty(jsonStr)) { return JSON.parse(jsonStr); } } catch (error) { lk.logErr(error); } } function cacheExchangeTaskList(status, taskLst) { // 精简一下内容 let simpleLst = []; for (let i = 0; i < taskLst.length; i++) { let info = taskLst[i]; let item = { id: info.id, compositeLabel: info.compositeLabel, compositeTaskName: info.compositeTaskName, surplus: info.surplus, startTime: info.startTime, endTime: info.endTime, page: info.page, }; simpleLst.push(item); } let jsonStr = JSON.stringify(simpleLst, null, 2); if (status == 0) { lk.setVal(GandartConstKey.ExchangeTaskList0, jsonStr); } else if (status == 1) { lk.setVal(GandartConstKey.ExchangeTaskList1, jsonStr); } else if (status == 2) { lk.setVal(GandartConstKey.ExchangeTaskList2, jsonStr); } } async function getExchangeTaskListByServer(status, pageSize = 10, page = 1) { return new Promise((resolve, _reject) => { try { const headers = GCommonGandartHeads; headers['Host'] = 'api.gandart.com'; headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; let body = `page=${page}&pageSize=${pageSize}&total=0&status=${status}&labelName=`; let url = { url: `${config.WALLET_API}/v2/composite/v3/list/v3`, headers: headers, body: body }; let tagNames = [ '待开始', '进行中', '已结束', ]; lk.log(`获取置换分解任务[${tagNames[status]}]列表:${body}`); lk.post(url, async (error, _response, data) => { let ret = {}; try { if (error) { lk.log(`获取置换分解任务列表发生错误`); lk.execFail(); lk.appendNotifyInfo(`❌获取置换分解任务列表失败,请稍后再试`); } else { ret = JSON.parse(data); lk.log(`获取置换分解任务列表成功`); } } catch (e) { lk.log(`获取置换分解任务列表发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(ret); } }); } catch (e) { lk.log(`获取置换分解任务列表发生错误`); lk.logErr(e); resolve(); } }); } async function getCompositeMaterial(taskId, taskInfo) { return new Promise((resolve, _reject) => { try { const headers = GCommonGandartHeads; headers['Host'] = 'api.gandart.com'; headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; let body = `taskId=${taskId}`; let url = { url: `${config.BASE_API}/v2/composite/v3/compositeMaterial`, headers: headers, body: body }; let taskName = taskInfo.compositeTaskName || ''; //合成标题 lk.log(`获取置换分解任务[${taskName}#${taskId}]材料详情:${body}`); lk.post(url, async (error, _response, data) => { let retItemLst = []; try { if (error) { lk.log(`获取置换分解任务材料详情发生错误`); lk.execFail(); lk.appendNotifyInfo(`❌获取置换分解任务材料详情失败,请稍后再试`); } else { let ret = JSON.parse(data); if (ret.success) { let obj = ret.obj; retItemLst = obj; lk.log(`获取置换分解任务材料详情成功`); } else { lk.log(`获取置换分解任务材料详情失败,响应:${data}`); } } } catch (e) { lk.log(`获取置换分解任务材料详情发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(retItemLst); } }); } catch (e) { lk.log(`获取置换分解任务材料详情发生错误`); lk.logErr(e); resolve(); } }); } async function getDetailByCasting(castingId, collectionName, pageSize = 50, page = 1) { return new Promise((resolve, _reject) => { try { const headers = GCommonGandartHeads; headers['Host'] = 'api.gandart.com'; headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; let params = { castingId: castingId, page: page, pageSize: pageSize, }; let signData = getSign(); signData = Object.assign(signData, params); let body = lk.objToQueryStr(signData); let url = { url: `${config.SALE_API}/composite/getDetailByCasting?${lk.objToQueryStr(params)}`, headers: headers, body: body }; collectionName = collectionName || getCollectionNameById(castingId); lk.log(`获取个人产品[${collectionName}(${castingId})]拥有详情:${body}`); lk.post(url, async (error, _response, data) => { let retItemLst = []; try { if (error) { lk.log(`获取个人产品拥有详情发生错误`); lk.execFail(); lk.appendNotifyInfo(`❌获取个人产品拥有详情失败,请稍后再试`); } else { let ret = JSON.parse(data); if (ret.success) { let obj = ret.obj; retItemLst = obj.list; lk.log(`获取个人产品拥有详情成功`); } else { lk.log(`获取个人产品拥有详情失败,响应:${data}`); } } } catch (e) { lk.log(`获取个人产品拥有详情发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(retItemLst); } }); } catch (e) { lk.log(`获取个人产品拥有详情发生错误`); lk.logErr(e); resolve(); } }); } async function confirmCompositeV2(taskId, taskInfo, compositeList) { return new Promise((resolve, _reject) => { try { const headers = GCommonGandartHeads; headers['Host'] = 'api.gandart.com'; headers['Content-Type'] = 'application/json;charset=UTF-8;'; let data = { taskId: Number(taskId), compositeList: compositeList, }; let body = JSON.stringify(data); let url = { url: `${config.BASE_API}/v2/composite/v3/confirmCompositeV2`, headers: headers, body: body }; let taskName = taskInfo.compositeTaskName || ''; //合成标题 lk.log(`请求置换分解任务[${taskName}#${taskId}]:\n${body}`); lk.post(url, async (error, _response, data) => { let retOrder; try { if (error) { lk.log(`置换分解发生错误`); lk.execFail(); lk.appendNotifyInfo(`❌置换分解失败,请稍后再试`); } else { let ret = JSON.parse(data); if (ret.success) { retOrder = ret.obj; let dismsg = `置换分解任务[${taskId}]成功,订单号:${retOrder}`; lk.log(dismsg); lk.appendNotifyInfo(`🎉${dismsg}`); } else { lk.log(`合置换分解失败,响应:${data}`); let respMsg = ret.msg; if (respMsg) { if (respMsg.indexOf('合成中') > -1 || respMsg.indexOf('已合成') > -1) { lk.appendNotifyInfo(`🎉${respMsg}`); retOrder = '#HC123456789'; } else if (respMsg.indexOf('不足') > -1) { lk.appendNotifyInfo(`⚠️${respMsg}`); retOrder = '!HC123456789'; } } } } } catch (e) { lk.log(`置换分解发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(retOrder); } }); } catch (e) { lk.log(`合置换分解发生错误`); lk.logErr(e); resolve(); } }); } async function checkCompositeResult(orderNum) { return new Promise((resolve, _reject) => { try { const headers = GCommonGandartHeads; headers['Host'] = 'api.gandart.com'; headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; let body = `orderNum=${orderNum}`; let url = { url: `${config.BASE_API}/v2/composite/v3/compositeResult`, headers: headers, body: body }; lk.log(`获取合成结果[${orderNum}]:${body}`); lk.post(url, async (error, _response, data) => { let retItemLst; try { if (error) { lk.log(`获取合成结果发生错误`); lk.execFail(); lk.appendNotifyInfo(`❌获取合成结果失败,请稍后再试`); } else { let ret = JSON.parse(data); if (ret.success) { lk.log(`获取合成结果成功,响应:${data}`); if (typeof ret.obj == 'object') { retItemLst = ret.obj; let cName = ''; for (let i = 0; i < retItemLst.length; i++) { cName += retItemLst[i].collectionName + ","; } cName = cName.substring(0, cName.length - 1); lk.appendNotifyInfo(`🎉合成产品:${cName}`); } else { if (ret.msg && ret.msg.length > 0) { lk.appendNotifyInfo(`🎉${ret.msg}`); } } } else { lk.log(`获取合成结果失败,响应:${data}`); } } } catch (e) { lk.log(`获取合成结果发生错误`); lk.logErr(e); lk.execFail(); } finally { resolve(retItemLst); } }); } catch (e) { lk.log(`获取合成结果发生错误`); lk.logErr(e); resolve(); } }); } function getCollectionMInfoById(castingId) { let ret; try { let clst = JSON.parse(lk.getVal(GandartConstKey.CollectionCateLst, "[]")); for (const d of clst) { if (d.castingId == castingId) { ret = d; break; } } } catch (error) { lk.logErr(error); } return ret; } function getCollectionNameById(castingId) { let name = '未获取'; let info = getCollectionMInfoById(castingId); if (info) { name = info.collectionName; } return name; } function getSign() { const now = new Date().getTime(); let s1 = now - 20000; let s2 = now; let s3 = now + 20000; let s4 = now + 40000; const sssfffeee = 'e9'; //localStorage.getItem('sssfffeee'); const aggaaa = '9'; //localStorage.getItem('aggaaa'); const yyhhhasdww = '0a'; let arr = [sssfffeee, yyhhhasdww, aggaaa, '29', 'e', 'c', 3]; let crypto = createCrypto(); let s5 = crypto.md5(s3 + arr.join('')); return { 's1': s1, 's2': s2, 's3': s3, 's4': s4, 's5': s5 }; } //---SyncByPyScript---ToolKit-start function ToolKit(t,s,e){return new class{constructor(t,s,e){this.tgEscapeCharMapping={"&":"&","#":"#"},this.userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15",this.prefix="lk",this.name=t,this.id=s,this.data=null,this.dataFile=this.getRealPath(""+this.prefix+this.id+".dat"),this.boxJsJsonFile=this.getRealPath(""+this.prefix+this.id+".boxjs.json"),this.options=e,this.isExecComm=!1,this.isEnableLog=this.getVal(this.prefix+"IsEnableLog"+this.id),this.isEnableLog=!!this.isEmpty(this.isEnableLog)||JSON.parse(this.isEnableLog),this.isNotifyOnlyFail=this.getVal(this.prefix+"NotifyOnlyFail"+this.id),this.isNotifyOnlyFail=!this.isEmpty(this.isNotifyOnlyFail)&&JSON.parse(this.isNotifyOnlyFail),this.isEnableTgNotify=this.getVal(this.prefix+"IsEnableTgNotify"+this.id),this.isEnableTgNotify=!this.isEmpty(this.isEnableTgNotify)&&JSON.parse(this.isEnableTgNotify),this.tgNotifyUrl=this.getVal(this.prefix+"TgNotifyUrl"+this.id),this.isEnableTgNotify=this.isEnableTgNotify&&!this.isEmpty(this.tgNotifyUrl),this.costTotalStringKey=this.prefix+"CostTotalString"+this.id,this.costTotalString=this.getVal(this.costTotalStringKey),this.costTotalString=this.isEmpty(this.costTotalString)?"0,0":this.costTotalString.replace('"',""),this.costTotalMs=this.costTotalString.split(",")[0],this.execCount=this.costTotalString.split(",")[1],this.costTotalMs=this.isEmpty(this.costTotalMs)?0:parseInt(this.costTotalMs),this.execCount=this.isEmpty(this.execCount)?0:parseInt(this.execCount),this.logSeparator="\n██",this.now=new Date,this.startTime=this.now.getTime(),this.node=this.isNode()?{request:require("request")}:null,this.execStatus=!0,this.notifyInfo=[],this.log(this.name+", 开始执行!"),this.initCache(),this.checkRecordRequestBody(),this.execComm()}checkRecordRequestBody(){var t,s;this.isRequest()&&(t=$request.body)&&(s=$request.path,s=this.id+"#"+s.replace("/","_"),this.isQuanX()&&$prefs.setValueForKey(t,s),(this.isLoon()||this.isSurge())&&$persistentStore.write(t,s),this.isNode())&&this.node.fs.writeFileSync(s+".json",t,{flag:"w"},t=>console.log(t))}getRequestBody(){var t=$request.path,t=this.id+"#"+t.replace("/","_");if(this.isSurge()||this.isLoon())return $persistentStore.read(t);if(this.isQuanX())return $prefs.valueForKey(t);if(this.isNode()){t=t+".json";if(!this.node.fs.existsSync(t))return JSON.parse(this.node.fs.readFileSync(t))}}initCache(){var t,s=this.getPersistKey();this.isQuanX()&&(this.cache=JSON.parse($prefs.valueForKey(s)||"{}")),(this.isLoon()||this.isSurge())&&(this.cache=JSON.parse($persistentStore.read(s)||"{}")),this.isNode()&&(this.node.fs.existsSync(t="root.json")||this.node.fs.writeFileSync(t,JSON.stringify({}),{flag:"wx"},t=>console.log(t)),this.root={},this.node.fs.existsSync(t=s+".json")?this.cache=JSON.parse(this.node.fs.readFileSync(s+".json")):(this.node.fs.writeFileSync(t,JSON.stringify({}),{flag:"wx"},t=>console.log(t)),this.cache={}))}getPersistKey(){return this.id+"#privateCache"}persistCache(){var t=this.getPersistKey(),s=JSON.stringify(this.cache,null,2);this.isQuanX()&&$prefs.setValueForKey(s,t),(this.isLoon()||this.isSurge())&&$persistentStore.write(s,t),this.isNode()&&(this.node.fs.writeFileSync(t+".json",s,{flag:"w"},t=>console.log(t)),this.node.fs.writeFileSync("root.json",JSON.stringify(this.root,null,2),{flag:"w"},t=>console.log(t)))}write(t,s){if(this.log("SET "+s),-1!==s.indexOf("#")){if(s=s.substr(1),isSurge||this.isLoon())return $persistentStore.write(t,s);if(this.isQuanX())return $prefs.setValueForKey(t,s);this.isNode()&&(this.root[s]=t)}else this.cache[s]=t;this.persistCache()}read(t){return this.log("READ "+t),-1!==t.indexOf("#")?(t=t.substr(1),this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?this.root[t]:void 0):this.cache[t]}delete(t){if(this.log("DELETE "+t),-1!==t.indexOf("#")){if(t=t.substr(1),this.isSurge()||this.isLoon())return $persistentStore.write(null,t);if(this.isQuanX())return $prefs.removeValueForKey(t);this.isNode()&&delete this.root[t]}else delete this.cache[t];this.persistCache()}getRealPath(t){var s;return this.isNode()?((s=process.argv.slice(1,2)[0].split("/"))[s.length-1]=t,s.join("/")):t}getUrlHost(t){return t.slice(0,t.indexOf("/",8))}getUrlPath(t){var s=t.lastIndexOf("/")===t.length-1?-1:void 0;return t.slice(t.indexOf("/",8),s)}async execComm(){if(this.isNode()){this.comm=process.argv.slice(1);let t=!1;"p"==this.comm[1]&&(this.isExecComm=!0,this.log(`开始执行指令【${this.comm[1]}】=> 发送到手机测试脚本!`),this.isEmpty(this.options)||this.isEmpty(this.options.httpApi)?(this.log("未设置options,使用默认值"),this.isEmpty(this.options)&&(this.options={}),this.options.httpApi="ffff@10.0.0.9:6166"):/.*?@.*?:[0-9]+/.test(this.options.httpApi)||(t=!0,this.log("❌httpApi格式错误!格式:ffff@3.3.3.18:6166"),this.done()),t||this.callApi(this.comm[2]))}}callApi(t){let i=this.comm[0],s=(this.log(`获取【${i}】内容传给手机`),"");this.fs=this.fs||require("fs"),this.path=this.path||require("path");var e=this.path.resolve(i),r=this.path.resolve(process.cwd(),i),o=this.fs.existsSync(e),h=!o&&this.fs.existsSync(r);if(o||h){h=o?e:r;try{s=this.fs.readFileSync(h)}catch(t){s=""}}else s="";o={url:`http://${this.options.httpApi.split("@")[1]}/v1/scripting/evaluate`,headers:{"X-Key":""+this.options.httpApi.split("@")[0]},body:{script_text:""+s,mock_type:"cron",timeout:!this.isEmpty(t)&&5{this.log(`已将脚本【${i}】发给手机!`),this.done()})}getCallerFileNameAndLine(){let s;try{throw Error("")}catch(t){s=t}var t=s.stack.split("\n")[1];return this.path=this.path||require("path"),`[${t.substring(t.lastIndexOf(this.path.sep)+1,t.lastIndexOf(":"))}]`}getFunName(t){t=t.toString();return t=(t=t.substr("function ".length)).substr(0,t.indexOf("("))}boxJsJsonBuilder(s,r){if(this.isNode()){let i="/Users/lowking/Desktop/Scripts/lowking.boxjs.json";if(r&&r.hasOwnProperty("target_boxjs_json_path")&&(i=r.target_boxjs_json_path),this.fs.existsSync(i))if(this.isJsonObject(s)&&this.isJsonObject(r)){this.log("using node");var o=["settings","keys"],h="https://raw.githubusercontent.com/Orz-3";let e={},t="#lk{script_url}";if(r&&r.hasOwnProperty("script_url")&&(t=this.isEmpty(r.script_url)?"#lk{script_url}":r.script_url),e.id=""+this.prefix+this.id,e.name=this.name,e.desc_html=`⚠️使用说明
详情【点我查看】`,e.icons=[h+`/mini/master/Alpha/${this.id.toLocaleLowerCase()}.png`,h+`/mini/master/Color/${this.id.toLocaleLowerCase()}.png`],e.keys=[],e.settings=[{id:this.prefix+"IsEnableLog"+this.id,name:"开启/关闭日志",val:!0,type:"boolean",desc:"默认开启"},{id:this.prefix+"NotifyOnlyFail"+this.id,name:"只当执行失败才通知",val:!1,type:"boolean",desc:"默认关闭"},{id:this.prefix+"IsEnableTgNotify"+this.id,name:"开启/关闭Telegram通知",val:!1,type:"boolean",desc:"默认关闭"},{id:this.prefix+"TgNotifyUrl"+this.id,name:"Telegram通知地址",val:"",type:"text",desc:"Tg的通知地址,如:https://api.telegram.org/bot-token/sendMessage?chat_id=-100140&parse_mode=Markdown&text="}],e.author="#lk{author}",e.repo="#lk{repo}",e.script=t+"?raw=true",!this.isEmpty(s))for(var n in o){var a=o[n];if(!this.isEmpty(s[a])){if("settings"===a)for(let t=0;tt.id==e.id)[0]);0<=u?c.apps[u]=e:c.apps.push(e);let s=JSON.stringify(c,null,2);if(!this.isEmpty(r))for(const m in r){let t="";r.hasOwnProperty(m)?t=r[m]:"author"===m?t="@lowking":"repo"===m&&(t="https://github.com/lowking/Scripts"),s=s.replace(`#lk{${m}}`,t)}for(var g,y=/(?:#lk\{)(.+?)(?=\})/,S=(null!==y.exec(s)&&this.log("生成BoxJs还有未配置的参数,请参考https://github.com/lowking/Scripts/blob/master/util/example/ToolKitDemo.js#L17-L18传入参数:\n"),new Set);null!==(g=y.exec(s));)S.add(g[1]),s=s.replace(`#lk{${g[1]}}`,"");S.forEach(t=>{console.log(t+" ")}),this.fs.writeFileSync(i,s)}}}else this.log("构建BoxJsJson传入参数格式错误,请传入json对象")}}isJsonObject(t){return"object"==typeof t&&"[object object]"==Object.prototype.toString.call(t).toLowerCase()&&!t.length}appendNotifyInfo(t,s){1==s?this.notifyInfo=t:this.notifyInfo.push(t)}prependNotifyInfo(t){this.notifyInfo.splice(0,0,t)}execFail(){this.execStatus=!1}isRequest(){return"undefined"!=typeof $request}isSurge(){return"undefined"!=typeof $httpClient}isQuanX(){return"undefined"!=typeof $task}isLoon(){return"undefined"!=typeof $loon}isJSBox(){return"undefined"!=typeof $app&&"undefined"!=typeof $http}isStash(){return"undefined"!=typeof $environment&&$environment["stash-version"]}isNode(){return"function"==typeof require&&!this.isJSBox()}sleep(s){return new Promise(t=>setTimeout(t,s))}log(t){this.isEnableLog&&console.log(""+this.logSeparator+t)}logErr(t){this.execStatus=!0,this.isEnableLog&&(console.log(""+this.logSeparator+this.name+"执行异常:"),console.log(t),console.log("\n"+t.message))}msg(t,s,e,i){if((this.isRequest()||!this.isNotifyOnlyFail||!this.execStatus)&&(this.isEmpty(s)&&(s=Array.isArray(this.notifyInfo)?this.notifyInfo.join("\n"):this.notifyInfo),!this.isEmpty(s)))if(this.isEnableTgNotify){for(var r in this.log(this.name+"Tg通知开始"),this.tgEscapeCharMapping)this.tgEscapeCharMapping.hasOwnProperty(r)&&(s=s.replace(r,this.tgEscapeCharMapping[r]));this.get({url:encodeURI(this.tgNotifyUrl+"📌"+this.name+"\n"+s)},(t,s,e)=>{this.log("Tg通知完毕")})}else{var o={},h=!this.isEmpty(e),n=!this.isEmpty(i);this.isQuanX()&&(h&&(o["open-url"]=e),n&&(o["media-url"]=i),$notify(this.name,t,s,o)),(this.isSurge()||this.isStash())&&(h&&(o.url=e),$notification.post(this.name,t,s,o)),this.isNode()&&this.log("⭐️"+this.name+"\n"+t+"\n"+s),this.isJSBox()&&$push.schedule({title:this.name,body:t?t+"\n"+s:s})}}pushWxMsg(t,s,e,i=()=>{}){s={appToken:"AT_rTc93GQYIdMU8XLRnoJaSea8WkfhSzhX",content:s,summary:t,contentType:1,topicIds:[],uids:["UID_6P4B00X6Zv8U2oKC0I2R09emxtqq"],url:"",verifyPay:!1},e&&(s.url=e),t=this.getJsonDoneHeaders(),t.Host="wxpusher.zjiecode.com",t["Content-Type"]="application/json;charset=UTF-8",e={url:"https://wxpusher.zjiecode.com/api/send/message",headers:t,body:JSON.stringify(s)};this.post(e,i)}getVal(t,s=""){let e;return(e=this.isSurge()||this.isLoon()||this.isStash()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loadData(),process.env[t]||this.data[t]):this.data&&this.data[t]||null)||s}setVal(t,s){return this.isSurge()||this.isLoon()||this.isStash()?$persistentStore.write(s,t):this.isQuanX()?$prefs.setValueForKey(s,t):this.isNode()?(this.data=this.loadData(),this.data[t]=s,this.writeData(),!0):this.data&&this.data[t]||null}loadData(){if(!this.isNode())return{};this.fs=this.fs||require("fs"),this.path=this.path||require("path");var t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}writeData(){var t,s,e,i,r;this.isNode()&&(this.fs=this.fs||require("fs"),this.path=this.path||require("path"),t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),i=!(e=this.fs.existsSync(t))&&this.fs.existsSync(s),r=JSON.stringify(this.data),!e&&i?this.fs.writeFileSync(s,r):this.fs.writeFileSync(t,r))}adapterStatus(t){return t&&(t.status?t.statusCode=t.status:t.statusCode&&(t.status=t.statusCode)),t}get(t,i=()=>{}){this.isQuanX()&&((t="string"==typeof t?{url:t}:t).method="GET",$task.fetch(t).then(t=>{i(null,this.adapterStatus(t),t.body)},t=>i(t.error,null,null))),(this.isSurge()||this.isLoon()||this.isStash())&&$httpClient.get(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)}),this.isNode()&&this.node.request(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)}),this.isJSBox()&&((t="string"==typeof t?{url:t}:t).header=t.headers,t.handler=function(t){let s=t.error,e=(s=s&&JSON.stringify(t.error),t.data);"object"==typeof e&&(e=JSON.stringify(t.data)),i(s,this.adapterStatus(t.response),e)},$http.get(t))}post(t,i=()=>{}){this.isQuanX()&&((t="string"==typeof t?{url:t}:t).method="POST",$task.fetch(t).then(t=>{i(null,this.adapterStatus(t),t.body)},t=>i(t.error,null,null))),(this.isSurge()||this.isLoon()||this.isStash())&&$httpClient.post(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)}),this.isNode()&&this.node.request.post(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)}),this.isJSBox()&&((t="string"==typeof t?{url:t}:t).header=t.headers,t.handler=function(t){let s=t.error,e=(s=s&&JSON.stringify(t.error),t.data);"object"==typeof e&&(e=JSON.stringify(t.data)),i(s,this.adapterStatus(t.response),e)},$http.post(t))}put(t,i=()=>{}){this.isQuanX()&&((t="string"==typeof t?{url:t}:t).method="PUT",$task.fetch(t).then(t=>{i(null,this.adapterStatus(t),t.body)},t=>i(t.error,null,null))),(this.isSurge()||this.isLoon()||this.isStash())&&(t.method="PUT",$httpClient.put(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)})),this.isNode()&&(t.method="PUT",this.node.request.put(t,(t,s,e)=>{i(t,this.adapterStatus(s),e)})),this.isJSBox()&&((t="string"==typeof t?{url:t}:t).header=t.headers,t.handler=function(t){let s=t.error,e=(s=s&&JSON.stringify(t.error),t.data);"object"==typeof e&&(e=JSON.stringify(t.data)),i(s,this.adapterStatus(t.response),e)},$http.post(t))}costTime(){let t=this.name+"执行完毕!";this.isNode()&&this.isExecComm&&(t=`指令【${this.comm[1]}】执行完毕!`);var s=(new Date).getTime()-this.startTime,e=s/1e3;this.execCount++,this.costTotalMs+=s,this.log(`${t}耗时【${e}】秒\n总共执行【${this.execCount}】次,平均耗时【${(this.costTotalMs/this.execCount/1e3).toFixed(4)}】秒`),this.setVal(this.costTotalStringKey,JSON.stringify(this.costTotalMs+","+this.execCount))}done(t={}){this.costTime(),(this.isSurge()||this.isQuanX()||this.isLoon()||this.isStash())&&$done(t)}getRequestUrl(){return $request.url}getResponseBody(){if($response)return $response.body}isGetCookie(t){return!("OPTIONS"==$request.method||!this.getRequestUrl().match(t))}isEmpty(t){return void 0===t||null==t||""==t||"null"==t||"undefined"==t||0===t.length}randomString(s){s=s||32;var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890",i=e.length,r="";for(let t=0;t>>32-u,r)}function c(t,n,r,e,u,o,c){return f(n&r|~n&e,t,n,u,o,c)}function i(t,n,r,e,u,o,c){return f(n&e|r&~e,t,n,u,o,c)}function a(t,n,r,e,u,o,c){return f(n^r^e,t,n,u,o,c)}function l(t,n,r,e,u,o,c){return f(r^(n|~e),t,n,u,o,c)}function n(t){/[\x80-\xFF]/.test(t)&&(t=unescape(encodeURI(t))),txt="";let n=t.length,r=[1732584193,-271733879,-1732584194,271733878],e;for(e=64;e<=t.length;e+=64)o(r,function(t){let n=[],r;for(r=0;r<64;r+=4)n[r>>2]=t.charCodeAt(r)+(t.charCodeAt(r+1)<<8)+(t.charCodeAt(r+2)<<16)+(t.charCodeAt(r+3)<<24);return n}(t.substring(e-64,e)));t=t.substring(e-64);var u=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e>2]|=t.charCodeAt(e)<<(e%4<<3);if(u[e>>2]|=128<<(e%4<<3),55>8*r+4&15]+e[t>>8*r&15];return n}(n[t]);return n.join("")}function h(t,n){return t+n&4294967295}return{md5:function(t){return r(n(t))}}} //---SyncByPyScript---Crypto-end