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(`光予助手`, `GandartHelper`, `gandartHelper.js`);
const gandartTokenKey = 'lkGandartToken';
const gardartCollectionNameKey = 'lkGandartCollectionName';
const gardartCastingIdKey = 'lkGandartCastingId';
const gardartLimitPriceKey = 'lkGandartLimitPrice';
const gandartTransactionRecordIdKey = 'lkGandartTransactionRecordId';
const gandartCollectionCateLstKey = 'lkGandartCollectionCateLst';
let gandartToken = lk.getVal(gandartTokenKey, '');
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' : `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`,
'Referer' : `https://www.gandart.com/`,
'Accept-Language' : `zh-CN,zh-Hans;q=0.9`,
'token' : gandartToken
};
if(!lk.isExecComm) {
if (lk.isRequest()) {
getInfo();
lk.done();
} else {
all();
}
}
function getInfo() {
const url = $request.url;
lk.log(`开始url=`+url+":"+$request.method);
if ($request && $request.method != 'OPTIONS') {
if(url.match(/\/base\/auth\/verifyCodeLogin/)){
lk.log(`开始获取Token`);
let data = lk.getResponseBody();
try {
data = JSON.parse(data);
if (data["success"]) {
let jwktoken = data["obj"]["token"];
lk.setVal(gandartTokenKey, jwktoken);
lk.appendNotifyInfo('🎉成功获取光予token,可以关闭相应脚本');
} else {
lk.execFail();
lk.appendNotifyInfo('❌获取光予token失败,请稍后再试');
}
} catch (e) {
lk.execFail();
lk.appendNotifyInfo('❌获取光予token失败');
}
lk.msg('');
return;
}
if(url.match(/\/base\/v2\/resaleManage\/resale\/findAllIsOpenResale/)){
lk.log(`获取最新产品开放在售列表`);
let data = lk.getResponseBody();
try {
data = JSON.parse(data);
if (data["success"]) {
let obj = data["obj"];
let oldItemlst = JSON.parse(lk.getVal(gandartCollectionCateLstKey, '[]'));
let pageItemlst = obj;
let newLst = checkAppendCollectionItemsDiff(oldItemlst, pageItemlst);
let jsonStr = JSON.stringify(newLst);
lk.setVal(gandartCollectionCateLstKey, jsonStr);
lk.log(jsonStr);
}
// lk.appendNotifyInfo('🎉更新了产品列表');
} catch (e) {
lk.logErr(e);
lk.execFail();
}
lk.msg('');
return;
}
// if(url.match(/\/base\/v2\/favorite\/selectRecord/)){
// lk.log(`获取收藏的产品列表`);
// let data = lk.getResponseBody();
// try {
// data = JSON.parse(data);
// if (data["success"]) {
// let obj = data["obj"];
// let oldItemlst = JSON.parse(lk.getVal(gandartCollectionCateLstKey, '[]'));
// let pageItemlst = obj;
// let newLst = checkAppendCollectionItemsDiff(oldItemlst, pageItemlst);
// let jsonStr = JSON.stringify(newLst);
// lk.setVal(gandartCollectionCateLstKey, jsonStr);
// lk.log(jsonStr);
// }
// // lk.appendNotifyInfo('🎉更新了产品列表');
// } catch (e) {
// lk.logErr(e);
// lk.execFail();
// }
// lk.msg('');
// return;
// }
if(url.match(/\/market\/api\/v3\/resaleManage\/resale\/tradingMarket/)){
lk.log(`获取最新Token并更新产品列表`);
// lk.log(JSON.stringify($request.headers));
if ($request.headers['token']) {
let jwktoken = $request.headers['token'];
lk.setVal(gandartTokenKey, jwktoken);
// lk.appendNotifyInfo('🎉成功获取最新Token');
}
let data = lk.getResponseBody();
try {
data = JSON.parse(data);
if (data["success"]) {
let obj = data["obj"];
let oldItemlst = JSON.parse(lk.getVal(gandartCollectionCateLstKey, '[]'));
let pageItemlst = obj["list"];
let newLst = checkAppendCollectionItemsDiff(oldItemlst, pageItemlst);
let jsonStr = JSON.stringify(newLst);
lk.setVal(gandartCollectionCateLstKey, jsonStr);
lk.log(jsonStr);
}
// lk.appendNotifyInfo('🎉更新了产品列表');
} catch (e) {
lk.logErr(e);
lk.execFail();
}
lk.msg('');
return;
}
if(url.match(/\/market\/api\/v2\/resaleManage\/resale\/collectionDetailsByCastingId/)){
lk.log(`开始获取产品信息`);
let data = lk.getResponseBody();
try {
data = JSON.parse(data);
if (data["success"]) {
let obj = data["obj"];
let castingId = String(obj["castingId"]);
if(castingId == ""){
// 无法获取请求体
}
if(castingId != ""){
lk.setVal(gardartCastingIdKey, castingId);
let collectionName = obj["collectionName"];
lk.setVal(gardartCollectionNameKey, collectionName);
lk.log(collectionName+" castingId="+obj["castingId"]);
lk.appendNotifyInfo(`🎉成功获取[${collectionName}]信息`);
} else {
lk.appendNotifyInfo('❌获取产品信息失败');
}
} else {
lk.execFail();
lk.appendNotifyInfo('❌获取产品信息失败,请稍后再试');
}
} catch (e) {
lk.logErr(e);
lk.execFail();
lk.appendNotifyInfo('❌获取产品信息失败');
}
lk.msg('');
return;
}
}
}
function copyDictTo(fromDic, toDic) {
toDic = toDic || {};
for(let k in fromDic){
toDic[k] = fromDic[k];
}
return toDic;
}
function checkAppendCollectionItemsDiff(cLst, pageLst){
let dic = {};
for (const d of cLst) {
dic[d.castingId] = d;
}
for (const d of pageLst) {
dic[d.castingId] = copyDictTo(d, dic[d.castingId]);
}
let newLst = [];
for(let k in dic){
let ele = {
castingId: dic[k].castingId,
collectionName: dic[k].collectionName,
resalePrice: dic[k].resalePrice || 0,
};
newLst.push(ele);
}
return newLst;
}
function getCollectionNameById(castingId) {
let name = '未获取';
let clst = JSON.parse(lk.getVal(gandartCollectionCateLstKey, "[]"));
for (const d of clst) {
if(d.castingId == castingId){
name = d.collectionName;
break;
}
}
return name;
}
function getCurCollectionName() {
let collectionName = lk.setVal(gardartCollectionNameKey, "");
return collectionName;
}
async function all() {
let hasNeedSendNotify = true;
if (gandartToken == '') {
lk.execFail();
lk.appendNotifyInfo(`⚠️请先打开光予登录获取token`);
} else {
let castingId = lk.getVal(gardartCastingIdKey, 0);
castingId = Number(castingId);
let price = lk.getVal(gardartLimitPriceKey, 0);
price = Number(price);
if(castingId <= 0){
lk.prependNotifyInfo('⚠️请设置产品品类');
hasNeedSendNotify = true;
} else if(price <= 0){
lk.prependNotifyInfo('⚠️请设置监控价格');
hasNeedSendNotify = true;
} else {
let item = await refreshLstOnSale(castingId, price);
if(item){
hasNeedSendNotify = await checkToBuy(item);
} else {
hasNeedSendNotify = false;
}
}
}
if (hasNeedSendNotify) {
lk.msg(``);
}
lk.done();
}
function refreshLstOnSale(castingId, price) {
return new Promise((resolve, _reject) => {
try {
const headers = GCommonGandartHeads;
let signData = getSign();
signData.castingId = castingId;
signData.page = 1;
signData.pageSize = 15;
signData.sort = 2;// 1=编号,2=价格
signData.transactionStatus = 2;
let body = objToUrlParams(signData);
let url = {
url: `https://api2.gandart.com/market/api/v2/resaleManage/resale/onSale`,
headers: headers,
body: body
};
let collectionName = getCollectionNameById(castingId)
lk.log(`请求产品[${collectionName}(${castingId})]寄售列表:${body}`);
lk.post(url, async (error, _response, data) => {
let retItem;
try {
if (error) {
lk.log(`获取寄售列表信息发生错误`);
lk.execFail();
lk.appendNotifyInfo(`❌获取寄售列表失败,请稍后再试`);
} else {
let ret = JSON.parse(data);
let minPrice = 9999999;
if (ret.success) {
let obj = ret.obj;
let lst = obj.list;
for(let d of lst){
if(d.transactionStatus == 2){//2=可购买,4=支付中
const resalePrice = Number(d.resalePrice);
if(minPrice > resalePrice){
minPrice = resalePrice;
}
if(price >= resalePrice){
retItem = d;
lk.appendNotifyInfo(`🎉成功匹配产品[${d.collectionName}#${d.viewSort}],价格:${d.resalePrice}`);
break;
}
}
}
if(!retItem){
lk.log(`无匹配的价格,当前[${collectionName}]最低价:${minPrice}`);
}
} else {
lk.execFail();
}
}
} catch (e) {
lk.log(`获取寄售列表信息失败`);
lk.logErr(e);
lk.execFail();
} finally {
resolve(retItem);
}
});
} catch (e) {
lk.log(`获取寄售列表信息发生错误`);
lk.logErr(e);
resolve();
}
});
}
function checkToBuy(item){
return new Promise((resolve, _reject) => {
try {
const id = item.id;
const viewSort = item.viewSort || 0;
const headers = GCommonGandartHeads;
const body = `transactionRecordId=${id}`;
let url = {
url: `https://api.gandart.com/base/v2/resaleManage/resale/buy/v2`,
headers: headers,
body: body
};
lk.log(`请求购买产品[${item.collectionName}#${viewSort}]=${body}`);
// resolve(1);
const collectionName = item.collectionName;
lk.post(url, async (error, _response, data) => {
let retItem;
try {
if (error) {
lk.log(`无法下单产品[${collectionName}#${viewSort}]`);
lk.execFail();
lk.appendNotifyInfo(`❌购买失败,请稍后再试`);
} else {
lk.log(data);
let ret = JSON.parse(data);
if (ret.success) {
let obj = ret.obj;
let orderNum = obj.orderNum;
if(orderNum && orderNum.length > 0){
retItem = ret;
lk.log(`成功下单产品[${obj.collectionName}#${viewSort}],订单号:${obj.orderNum}`);
lk.appendNotifyInfo(`🎉成功下单产品[${obj.collectionName}#${viewSort}],订单号:${obj.orderNum}`);
}
} else {
lk.log(`产品[${collectionName}#${viewSort}]下单失败`);
lk.execFail();
}
}
} catch (e) {
lk.log(`下单产品[${collectionName}#${viewSort}]发生错误`);
lk.logErr(e);
lk.execFail();
} finally {
resolve(retItem);
}
});
} catch (e) {
lk.log(`下单产品[${item.collectionName}#${item.viewSort}]发生错误`);
lk.logErr(e);
resolve();
}
});
}
function objToUrlParams(param, key, encode) {
let paramStr = urlEncode(param, key, encode);
let len = paramStr.length;
if(len > 0){
paramStr = paramStr.substring(1,len);
}
return paramStr;
}
function urlEncode(param, key, encode) {
if(param==null) return '';
let paramStr = '';
let t = typeof (param);
if (t == 'string' || t == 'number' || t == 'boolean') {
paramStr += '&' + key + '=' + ((encode==null||encode) ? encodeURIComponent(param) : param);
} else {
for (let i in param) {
let k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
paramStr += urlEncode(param[i], k, encode);
}
}
return paramStr;
}
function getSign() {
const now = new Date().getTime();
const s1 = now - 20000;
const s2 = now;
const s3 = now + 20000;
const 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 = Crypto();
let s5= crypto.md5(s3+arr.join(''));
return {
's1': s1,
's2': s2,
's3': s3,
's4': s4,
's5': s5
};
}
// https://github.com/lowking/Scripts/blob/master/util/ToolKit.min.js
//ToolKit-start
function ToolKit(t,s,i){return new class{constructor(t,s,i){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=i;this.isExecComm=false;this.isEnableLog=this.getVal(`${this.prefix}IsEnableLog${this.id}`);this.isEnableLog=this.isEmpty(this.isEnableLog)?true:JSON.parse(this.isEnableLog);this.isNotifyOnlyFail=this.getVal(`${this.prefix}NotifyOnlyFail${this.id}`);this.isNotifyOnlyFail=this.isEmpty(this.isNotifyOnlyFail)?false:JSON.parse(this.isNotifyOnlyFail);this.isEnableTgNotify=this.getVal(`${this.prefix}IsEnableTgNotify${this.id}`);this.isEnableTgNotify=this.isEmpty(this.isEnableTgNotify)?false:JSON.parse(this.isEnableTgNotify);this.tgNotifyUrl=this.getVal(`${this.prefix}TgNotifyUrl${this.id}`);this.isEnableTgNotify=this.isEnableTgNotify?!this.isEmpty(this.tgNotifyUrl):this.isEnableTgNotify;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=(()=>{if(this.isNode()){const t=require("request");return{request:t}}else{return null}})();this.execStatus=true;this.notifyInfo=[];this.log(`${this.name}, 开始执行!`);this.execComm()}getRealPath(t){if(this.isNode()){let s=process.argv.slice(1,2)[0].split("/");s[s.length-1]=t;return s.join("/")}return t}async execComm(){if(this.isNode()){this.comm=process.argv.slice(1);let t=false;if(this.comm[1]=="p"){this.isExecComm=true;this.log(`开始执行指令【${this.comm[1]}】=> 发送到手机测试脚本!`);if(this.isEmpty(this.options)||this.isEmpty(this.options.httpApi)){this.log(`未设置options,使用默认值`);if(this.isEmpty(this.options)){this.options={}}this.options.httpApi=`ffff@10.0.0.9:6166`}else{if(!/.*?@.*?:[0-9]+/.test(this.options.httpApi)){t=true;this.log(`❌httpApi格式错误!格式:ffff@3.3.3.18:6166`);this.done()}}if(!t){this.callApi(this.comm[2])}}}}callApi(t){let s=this.comm[0];this.log(`获取【${s}】内容传给手机`);let i="";this.fs=this.fs?this.fs:require("fs");this.path=this.path?this.path:require("path");const e=this.path.resolve(s);const o=this.path.resolve(process.cwd(),s);const h=this.fs.existsSync(e);const r=!h&&this.fs.existsSync(o);if(h||r){const t=h?e:o;try{i=this.fs.readFileSync(t)}catch(t){i=""}}else{i=""}let n={url:`http://${this.options.httpApi.split("@")[1]}/v1/scripting/evaluate`,headers:{"X-Key":`${this.options.httpApi.split("@")[0]}`},body:{script_text:`${i}`,mock_type:"cron",timeout:!this.isEmpty(t)&&t>5?t:5},json:true};this.post(n,(t,i,e)=>{this.log(`已将脚本【${s}】发给手机!`);this.done()})}getCallerFileNameAndLine(){let t;try{throw Error("")}catch(s){t=s}const s=t.stack;const i=s.split("\n");let e=1;if(e!==0){const t=i[e];this.path=this.path?this.path:require("path");return`[${t.substring(t.lastIndexOf(this.path.sep)+1,t.lastIndexOf(":"))}]`}else{return"[-]"}}getFunName(t){var s=t.toString();s=s.substr("function ".length);s=s.substr(0,s.indexOf("("));return s}boxJsJsonBuilder(t,s){if(this.isNode()){let i="/Users/lowking/Desktop/Scripts/lowking.boxjs.json";if(s&&s.hasOwnProperty("target_boxjs_json_path")){i=s["target_boxjs_json_path"]}if(!this.fs.existsSync(i)){return}if(!this.isJsonObject(t)||!this.isJsonObject(s)){this.log("构建BoxJsJson传入参数格式错误,请传入json对象");return}this.log("using node");let e=["settings","keys"];const o="https://raw.githubusercontent.com/Orz-3";let h={};let r="#lk{script_url}";if(s&&s.hasOwnProperty("script_url")){r=this.isEmpty(s["script_url"])?"#lk{script_url}":s["script_url"]}h.id=`${this.prefix}${this.id}`;h.name=this.name;h.desc_html=`⚠️使用说明详情【点我查看】`;h.icons=[`${o}/mini/master/Alpha/${this.id.toLocaleLowerCase()}.png`,`${o}/mini/master/Color/${this.id.toLocaleLowerCase()}.png`];h.keys=[];h.settings=[{id:`${this.prefix}IsEnableLog${this.id}`,name:"开启/关闭日志",val:true,type:"boolean",desc:"默认开启"},{id:`${this.prefix}NotifyOnlyFail${this.id}`,name:"只当执行失败才通知",val:false,type:"boolean",desc:"默认关闭"},{id:`${this.prefix}IsEnableTgNotify${this.id}`,name:"开启/关闭Telegram通知",val:false,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="}];h.author="#lk{author}";h.repo="#lk{repo}";h.script=`${r}?raw=true`;if(!this.isEmpty(t)){for(let s in e){let i=e[s];if(!this.isEmpty(t[i])){if(i==="settings"){for(let s=0;s0){let t=a.apps;let e=t.indexOf(t.filter(t=>{return t.id==h.id})[0]);if(e>=0){a.apps[e]=h}else{a.apps.push(h)}let o=JSON.stringify(a,null,2);if(!this.isEmpty(s)){for(const t in s){let i="";if(s.hasOwnProperty(t)){i=s[t]}else if(t==="author"){i="@lowking"}else if(t==="repo"){i="https://github.com/lowking/Scripts"}o=o.replace(`#lk{${t}}`,i)}}const r=/(?:#lk\{)(.+?)(?=\})/;let n=r.exec(o);if(n!==null){this.log(`生成BoxJs还有未配置的参数,请参考https://github.com/lowking/Scripts/blob/master/util/example/ToolKitDemo.js#L17-L18传入参数:\n`)}let l=new Set;while((n=r.exec(o))!==null){l.add(n[1]);o=o.replace(`#lk{${n[1]}}`,``)}l.forEach(t=>{console.log(`${t} `)});this.fs.writeFileSync(i,o)}}}}isJsonObject(t){return typeof t=="object"&&Object.prototype.toString.call(t).toLowerCase()=="[object object]"&&!t.length}appendNotifyInfo(t,s){if(s==1){this.notifyInfo=t}else{this.notifyInfo.push(t)}}prependNotifyInfo(t){this.notifyInfo.splice(0,0,t)}execFail(){this.execStatus=false}isRequest(){return typeof $request!="undefined"}isSurge(){return typeof $httpClient!="undefined"}isQuanX(){return typeof $task!="undefined"}isLoon(){return typeof $loon!="undefined"}isJSBox(){return typeof $app!="undefined"&&typeof $http!="undefined"}isStash(){return"undefined"!==typeof $environment&&$environment["stash-version"]}isNode(){return typeof require=="function"&&!this.isJSBox()}sleep(t){return new Promise(s=>setTimeout(s,t))}log(t){if(this.isEnableLog)console.log(`${this.logSeparator}${t}`)}logErr(t){this.execStatus=true;if(this.isEnableLog){console.log(`${this.logSeparator}${this.name}执行异常:`);console.log(t);console.log(`\n${t.message}`)}}msg(t,s,i,e){if(!this.isRequest()&&this.isNotifyOnlyFail&&this.execStatus){}else{if(this.isEmpty(s)){if(Array.isArray(this.notifyInfo)){s=this.notifyInfo.join("\n")}else{s=this.notifyInfo}}if(!this.isEmpty(s)){if(this.isEnableTgNotify){this.log(`${this.name}Tg通知开始`);for(let t in this.tgEscapeCharMapping){if(!this.tgEscapeCharMapping.hasOwnProperty(t)){continue}s=s.replace(t,this.tgEscapeCharMapping[t])}this.get({url:encodeURI(`${this.tgNotifyUrl}📌${this.name}\n${s}`)},(t,s,i)=>{this.log(`Tg通知完毕`)})}else{let o={};const h=!this.isEmpty(i);const r=!this.isEmpty(e);if(this.isQuanX()){if(h)o["open-url"]=i;if(r)o["media-url"]=e;$notify(this.name,t,s,o)}if(this.isSurge()||this.isStash()){if(h)o["url"]=i;$notification.post(this.name,t,s,o)}if(this.isNode())this.log("⭐️"+this.name+"\n"+t+"\n"+s);if(this.isJSBox())$push.schedule({title:this.name,body:t?t+"\n"+s:s})}}}}getVal(t,s=""){let i;if(this.isSurge()||this.isLoon()||this.isStash()){i=$persistentStore.read(t)}else if(this.isQuanX()){i=$prefs.valueForKey(t)}else if(this.isNode()){this.data=this.loadData();i=process.env[t]||this.data[t]}else{i=this.data&&this.data[t]||null}return!i?s:i}setVal(t,s){if(this.isSurge()||this.isLoon()||this.isStash()){return $persistentStore.write(s,t)}else if(this.isQuanX()){return $prefs.setValueForKey(s,t)}else if(this.isNode()){this.data=this.loadData();this.data[t]=s;this.writeData();return true}else{return this.data&&this.data[t]||null}}loadData(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs");this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile);const s=this.path.resolve(process.cwd(),this.dataFile);const i=this.fs.existsSync(t);const e=!i&&this.fs.existsSync(s);if(i||e){const e=i?t:s;try{return JSON.parse(this.fs.readFileSync(e))}catch(t){return{}}}else return{}}else return{}}writeData(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs");this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile);const s=this.path.resolve(process.cwd(),this.dataFile);const i=this.fs.existsSync(t);const e=!i&&this.fs.existsSync(s);const o=JSON.stringify(this.data);if(i){this.fs.writeFileSync(t,o)}else if(e){this.fs.writeFileSync(s,o)}else{this.fs.writeFileSync(t,o)}}}adapterStatus(t){if(t){if(t.status){t["statusCode"]=t.status}else if(t.statusCode){t["status"]=t.statusCode}}return t}get(t,s=(()=>{})){if(this.isQuanX()){if(typeof t=="string")t={url:t};t["method"]="GET";$task.fetch(t).then(t=>{s(null,this.adapterStatus(t),t.body)},t=>s(t.error,null,null))}if(this.isSurge()||this.isLoon()||this.isStash())$httpClient.get(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)});if(this.isNode()){this.node.request(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)})}if(this.isJSBox()){if(typeof t=="string")t={url:t};t["header"]=t["headers"];t["handler"]=function(t){let i=t.error;if(i)i=JSON.stringify(t.error);let e=t.data;if(typeof e=="object")e=JSON.stringify(t.data);s(i,this.adapterStatus(t.response),e)};$http.get(t)}}post(t,s=(()=>{})){if(this.isQuanX()){if(typeof t=="string")t={url:t};t["method"]="POST";$task.fetch(t).then(t=>{s(null,this.adapterStatus(t),t.body)},t=>s(t.error,null,null))}if(this.isSurge()||this.isLoon()||this.isStash()){$httpClient.post(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)})}if(this.isNode()){this.node.request.post(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)})}if(this.isJSBox()){if(typeof t=="string")t={url:t};t["header"]=t["headers"];t["handler"]=function(t){let i=t.error;if(i)i=JSON.stringify(t.error);let e=t.data;if(typeof e=="object")e=JSON.stringify(t.data);s(i,this.adapterStatus(t.response),e)};$http.post(t)}}put(t,s=(()=>{})){if(this.isQuanX()){if(typeof t=="string")t={url:t};t["method"]="PUT";$task.fetch(t).then(t=>{s(null,this.adapterStatus(t),t.body)},t=>s(t.error,null,null))}if(this.isSurge()||this.isLoon()||this.isStash()){t.method="PUT";$httpClient.put(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)})}if(this.isNode()){t.method="PUT";this.node.request.put(t,(t,i,e)=>{s(t,this.adapterStatus(i),e)})}if(this.isJSBox()){if(typeof t=="string")t={url:t};t["header"]=t["headers"];t["handler"]=function(t){let i=t.error;if(i)i=JSON.stringify(t.error);let e=t.data;if(typeof e=="object")e=JSON.stringify(t.data);s(i,this.adapterStatus(t.response),e)};$http.post(t)}}costTime(){let t=`${this.name}执行完毕!`;if(this.isNode()&&this.isExecComm){t=`指令【${this.comm[1]}】执行完毕!`}const s=(new Date).getTime();const i=s-this.startTime;const e=i/1e3;this.execCount++;this.costTotalMs+=i;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();if(this.isSurge()||this.isQuanX()||this.isLoon()||this.isStash()){$done(t)}}getRequestUrl(){return $request.url}getResponseBody(){return $response.body}isGetCookie(t){return!!($request.method!="OPTIONS"&&this.getRequestUrl().match(t))}isEmpty(t){return typeof t=="undefined"||t==null||t==""||t=="null"||t=="undefined"||t.length===0}randomString(t){t=t||32;var s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";var i=s.length;var e="";for(let o=0;oa[h.toLowerCase()]=(a=>(function(a,h){h="string"==typeof h?{url:h}:h;const d=e.baseURL;d&&!u.test(h.url||"")&&(h.url=d?d+h.url:h.url),h.body&&h.headers&&!h.headers["Content-Type"]&&(h.headers["Content-Type"]="application/x-www-form-urlencoded");const l=(h={...e,...h}).timeout,c={onRequest:()=>{},onResponse:e=>e,onTimeout:()=>{},...h.events};let f,p;if(c.onRequest(a,h),t)f=$task.fetch({method:a,...h});else if(s||o||i)f=new Promise((e,t)=>{(i?require("request"):$httpClient)[a.toLowerCase()](h,(s,o,n)=>{s?t(s):e({statusCode:o.status||o.statusCode,headers:o.headers,body:n})})});else if(n){const e=new Request(h.url);e.method=a,e.headers=h.headers,e.body=h.body,f=new Promise((t,s)=>{e.loadString().then(s=>{t({statusCode:e.response.statusCode,headers:e.response.headers,body:s})}).catch(e=>s(e))})}else r&&(f=new Promise((e,t)=>{fetch(h.url,{method:a,headers:h.headers,body:h.body}).then(e=>e.json()).then(t=>e({statusCode:t.status,headers:t.headers,body:t.data})).catch(t)}));const y=l?new Promise((e,t)=>{p=setTimeout(()=>(c.onTimeout(),t(`${a} URL: ${h.url} exceeds the timeout ${l} ms`)),l)}):null;return(y?Promise.race([y,f]).then(e=>(clearTimeout(p),e)):f).then(e=>c.onResponse(e))})(h,a))),a}function API(e="untitled",t=!1){const{isQX:s,isLoon:o,isSurge:n,isNode:i,isJSBox:r,isScriptable:u}=ENV();return new class{constructor(e,t){this.name=e,this.debug=t,this.http=HTTP(),this.env=ENV(),this.node=(()=>{if(i){return{fs:require("fs")}}return null})(),this.initCache();Promise.prototype.delay=function(e){return this.then(function(t){return((e,t)=>new Promise(function(s){setTimeout(s.bind(null,t),e)}))(e,t)})}}initCache(){if(s&&(this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}")),(o||n)&&(this.cache=JSON.parse($persistentStore.read(this.name)||"{}")),i){let e="root.json";this.node.fs.existsSync(e)||this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.root={},e=`${this.name}.json`,this.node.fs.existsSync(e)?this.cache=JSON.parse(this.node.fs.readFileSync(`${this.name}.json`)):(this.node.fs.writeFileSync(e,JSON.stringify({}),{flag:"wx"},e=>console.log(e)),this.cache={})}}persistCache(){const e=JSON.stringify(this.cache,null,2);s&&$prefs.setValueForKey(e,this.name),(o||n)&&$persistentStore.write(e,this.name),i&&(this.node.fs.writeFileSync(`${this.name}.json`,e,{flag:"w"},e=>console.log(e)),this.node.fs.writeFileSync("root.json",JSON.stringify(this.root,null,2),{flag:"w"},e=>console.log(e)))}write(e,t){if(this.log(`SET ${t}`),-1!==t.indexOf("#")){if(t=t.substr(1),n||o)return $persistentStore.write(e,t);if(s)return $prefs.setValueForKey(e,t);i&&(this.root[t]=e)}else this.cache[t]=e;this.persistCache()}read(e){return this.log(`READ ${e}`),-1===e.indexOf("#")?this.cache[e]:(e=e.substr(1),n||o?$persistentStore.read(e):s?$prefs.valueForKey(e):i?this.root[e]:void 0)}delete(e){if(this.log(`DELETE ${e}`),-1!==e.indexOf("#")){if(e=e.substr(1),n||o)return $persistentStore.write(null,e);if(s)return $prefs.removeValueForKey(e);i&&delete this.root[e]}else delete this.cache[e];this.persistCache()}notify(e,t="",a="",h={}){const d=h["open-url"],l=h["media-url"];if(s&&$notify(e,t,a,h),n&&$notification.post(e,t,a+`${l?"\n多媒体:"+l:""}`,{url:d}),o){let s={};d&&(s.openUrl=d),l&&(s.mediaUrl=l),"{}"===JSON.stringify(s)?$notification.post(e,t,a):$notification.post(e,t,a,s)}if(i||u){const s=a+(d?`\n点击跳转: ${d}`:"")+(l?`\n多媒体: ${l}`:"");if(r){require("push").schedule({title:e,body:(t?t+"\n":"")+s})}else console.log(`${e}\n${t}\n${s}\n\n`)}}log(e){this.debug&&console.log(`[${this.name}] LOG: ${this.stringify(e)}`)}info(e){console.log(`[${this.name}] INFO: ${this.stringify(e)}`)}error(e){console.log(`[${this.name}] ERROR: ${this.stringify(e)}`)}wait(e){return new Promise(t=>setTimeout(t,e))}done(e={}){s||o||n?$done(e):i&&!r&&"undefined"!=typeof $context&&($context.headers=e.headers,$context.statusCode=e.statusCode,$context.body=e.body)}stringify(e){if("string"==typeof e||e instanceof String)return e;try{return JSON.stringify(e,null,2)}catch(e){return"[object Object]"}}}(e,t)}
//OpenAPI-end
//Crypto-start
function Crypto(){function o(n,t){var r=c(n[0],o=n[1],u=n[2],e=n[3],t[0],7,-680876936),e=c(e,r,o,u,t[1],12,-389564586),u=c(u,e,r,o,t[2],17,606105819),o=c(o,u,e,r,t[3],22,-1044525330);r=c(r,o,u,e,t[4],7,-176418897),e=c(e,r,o,u,t[5],12,1200080426),u=c(u,e,r,o,t[6],17,-1473231341),o=c(o,u,e,r,t[7],22,-45705983),r=c(r,o,u,e,t[8],7,1770035416),e=c(e,r,o,u,t[9],12,-1958414417),u=c(u,e,r,o,t[10],17,-42063),o=c(o,u,e,r,t[11],22,-1990404162),r=c(r,o,u,e,t[12],7,1804603682),e=c(e,r,o,u,t[13],12,-40341101),u=c(u,e,r,o,t[14],17,-1502002290),r=i(r,o=c(o,u,e,r,t[15],22,1236535329),u,e,t[1],5,-165796510),e=i(e,r,o,u,t[6],9,-1069501632),u=i(u,e,r,o,t[11],14,643717713),o=i(o,u,e,r,t[0],20,-373897302),r=i(r,o,u,e,t[5],5,-701558691),e=i(e,r,o,u,t[10],9,38016083),u=i(u,e,r,o,t[15],14,-660478335),o=i(o,u,e,r,t[4],20,-405537848),r=i(r,o,u,e,t[9],5,568446438),e=i(e,r,o,u,t[14],9,-1019803690),u=i(u,e,r,o,t[3],14,-187363961),o=i(o,u,e,r,t[8],20,1163531501),r=i(r,o,u,e,t[13],5,-1444681467),e=i(e,r,o,u,t[2],9,-51403784),u=i(u,e,r,o,t[7],14,1735328473),r=l(r,o=i(o,u,e,r,t[12],20,-1926607734),u,e,t[5],4,-378558),e=l(e,r,o,u,t[8],11,-2022574463),u=l(u,e,r,o,t[11],16,1839030562),o=l(o,u,e,r,t[14],23,-35309556),r=l(r,o,u,e,t[1],4,-1530992060),e=l(e,r,o,u,t[4],11,1272893353),u=l(u,e,r,o,t[7],16,-155497632),o=l(o,u,e,r,t[10],23,-1094730640),r=l(r,o,u,e,t[13],4,681279174),e=l(e,r,o,u,t[0],11,-358537222),u=l(u,e,r,o,t[3],16,-722521979),o=l(o,u,e,r,t[6],23,76029189),r=l(r,o,u,e,t[9],4,-640364487),e=l(e,r,o,u,t[12],11,-421815835),u=l(u,e,r,o,t[15],16,530742520),r=a(r,o=l(o,u,e,r,t[2],23,-995338651),u,e,t[0],6,-198630844),e=a(e,r,o,u,t[7],10,1126891415),u=a(u,e,r,o,t[14],15,-1416354905),o=a(o,u,e,r,t[5],21,-57434055),r=a(r,o,u,e,t[12],6,1700485571),e=a(e,r,o,u,t[3],10,-1894986606),u=a(u,e,r,o,t[10],15,-1051523),o=a(o,u,e,r,t[1],21,-2054922799),r=a(r,o,u,e,t[8],6,1873313359),e=a(e,r,o,u,t[15],10,-30611744),u=a(u,e,r,o,t[6],15,-1560198380),o=a(o,u,e,r,t[13],21,1309151649),r=a(r,o,u,e,t[4],6,-145523070),e=a(e,r,o,u,t[11],10,-1120210379),u=a(u,e,r,o,t[2],15,718787259),o=a(o,u,e,r,t[9],21,-343485551),n[0]=h(r,n[0]),n[1]=h(o,n[1]),n[2]=h(u,n[2]),n[3]=h(e,n[3])}function f(n,t,r,e,u,o){return t=h(h(t,n),h(e,o)),h(t<>>32-u,r)}function c(n,t,r,e,u,o,c){return f(t&r|~t&e,n,t,u,o,c)}function i(n,t,r,e,u,o,c){return f(t&e|r&~e,n,t,u,o,c)}function l(n,t,r,e,u,o,c){return f(t^r^e,n,t,u,o,c)}function a(n,t,r,e,u,o,c){return f(r^(t|~e),n,t,u,o,c)}function t(n){/[\x80-\xFF]/.test(n)&&(n=unescape(encodeURI(n))),txt="";let t=n.length,r=[1732584193,-271733879,-1732584194,271733878],e;for(e=64;e<=n.length;e+=64)o(r,function(n){let t=[],r;for(r=0;r<64;r+=4)t[r>>2]=n.charCodeAt(r)+(n.charCodeAt(r+1)<<8)+(n.charCodeAt(r+2)<<16)+(n.charCodeAt(r+3)<<24);return t}(n.substring(e-64,e)));n=n.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]|=n.charCodeAt(e)<<(e%4<<3);if(u[e>>2]|=128<<(e%4<<3),55>8*r+4&15]+e[n>>8*r&15];return t}(t[n]);return t.join("")}function h(n,t){return n+t&4294967295}return{md5:function(n){return r(t(n))}}}
//Crypto-end