Files
2026-05-23 18:48:48 +00:00

1578 lines
48 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// # Source: https://github.com/lksky8/sign-ql/blob/main/invalid/tyqh.js
// # Raw: https://raw.githubusercontent.com/lksky8/sign-ql/main/invalid/tyqh.js
// # Repo: lksky8/sign-ql
// # Path: invalid/tyqh.js
// # UploadedAt: 2023-01-03T11:39:58Z
// # SHA256: 2fe8059609f086f32865e2d2463e2e54b532cae84923ca73cb64cf6d5432509c
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
/**
原作者:临渊
修改日期2022-11-15
作者https://github.com/lksky8/sign-ql
小程序:统一快乐星球
入口:活动->种番茄
功能:除了助力都能完成
抓包https://apig.xiaoyisz.com/qiehuang/ga/public/api/login 这个登录包里 body 部分的 全部
变量tybody='body@xxxx ' 多个账号用 @ 或者 换行 分割
定时一天三次,八个小时一次收取冒险奖励
cron: 10 12,18 * * *
*/
const $ = new Env("统一茄皇-修复版");
const crypto = require('crypto');
const notify = $.isNode() ? require("./sendNotify") : "";
const { log } = console;
const Notify = 1; //0为关闭通知1为打开通知,默认为1
const uaNum = 21; //随机UA从0-22随便选一个填上去
//////////////////////
let tyau = "";
let tybody = ($.isNode() ? process.env.tybody : $.getdata("tybody")) || "";
let UA = ($.isNode() ? process.env.UA : $.getdata("UA")) || "";
let UAArr = [];
let tybodyArr = [];
let newAuArr = [];
let tyPlantId = "";
let plantIdArr = [];
let auback = 0;
let data = "";
let msg = "";
let taskType = 0;
let taskBack = [];
let taskTypeArr = [];
let taskId = "";
let taskIdArr = [];
let challengeId = "";
let adventureId = "";
let name = "";
let id = "";
let idArr = [];
let progress = 0.0;
let plantStage = 0;
let plantStatus = "";
let helpTaskId = "";
let helpTaskIdArr = [];
let giveSunshineBack = 0;
let stealFull = false;
const User_Agents = [
"Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/532.0 (KHTML, like Gecko) CriOS/43.0.823.0 Mobile/65M532 Safari/532.0",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 3_1 like Mac OS X; rw-RW) AppleWebKit/531.9.3 (KHTML, like Gecko) Version/4.0.5 Mobile/8B118 Safari/6531.9.3",
"Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/532.0 (KHTML, like Gecko) FxiOS/18.2n0520.0 Mobile/50C216 Safari/532.0",
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.28(0x18001c29) NetType/WIFI",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat"
];
let ua = User_Agents[uaNum];
!(async () => {
if (typeof $request !== "undefined") {
await GetRewrite();
} else {
if (!(await Envs())) return;
else {
log(
`\n\n============================================= \n脚本执行 - 北京时间(UTC+8)${new Date(
new Date().getTime() +
new Date().getTimezoneOffset() * 60 * 1000 +
8 * 60 * 60 * 1000
).toLocaleString()} \n=============================================\n`
);
log(
`\n=================== 共找到 ${tybodyArr.length} 个账号 ===================`
);
for (let index = 0; index < tybodyArr.length; index++) {
ua = User_Agents[uaNum + index];
if (UA) {
if (index >= UAArr.length) {
let i = UAArr.length + randomInt(0, 2);
ua = User_Agents[uaNum + i];
} else ua = UAArr[index];
}
tybody = tybodyArr[index];
let num = index + 1;
log(`\n========= 开始【第 ${num} 个账号】=========\n`);
msg += `\n${num}个账号运行结果:`;
log("【开始获取AU】");
await refreshAu();
await $.wait(2 * 1000);
newAuArr[index] = tyau;
log("【开始查询任务】");
await getTask();
await $.wait(2 * 1000);
helpTaskIdArr[index] = helpTaskId;
if (auback != 1) {
for (let i = 0; i < 10; i++) {
if (taskBack[i]) {
if (i == 0) {
log(`\n助力任务还未完成,建议执行互助\n`);
} else
log(`【第${i + 1}个任务未完成,开始执行第${i + 1}个任务】`);
await report(i);
if (i == 2) {
await report(i);
await report(i);
await report(i);
await report(i);
}
await $.wait(2 * 1000);
await getDrawPriz(i);
await $.wait(2 * 1000);
}
}
log("【开始收取阳光】");
await getSunshine();
await $.wait(2 * 1000);
log("【开始进行挑战】");
await startCallenge();
await $.wait(2 * 1000);
log("【开始查询冒险奖励】");
await queryAdventure();
await $.wait(2 * 1000);
log("【开始获取植物详情】");
await getPlant(index);
await $.wait(2 * 1000);
plantIdArr[index] = tyPlantId;
log("【开始洒阳光】");
do {
await giveSunshine();
await $.wait(2 * 1000);
} while (giveSunshineBack == 1);
log("【开始获取植物详情】");
await getPlant(index);
await $.wait(2 * 1000);
log("【开始偷好友阳光】");
const stealAll = await stealFriendSunshine();
msg += `\n共偷取好友阳光${stealAll}g`;
log("【开始查询信息】");
await getUserInfo();
await $.wait(2 * 1000);
idArr[index] = id;
}
}
await SendMsg(msg);
}
}
})()
.catch((e) => log(e))
.finally(() => $.done());
/**
* 获取AU
*/
function refreshAu(timeout = 2 * 1000) {
let url = {
url: `https://apig.xiaoyisz.com/qiehuang/ga/public/api/login`,
headers: {
Host: "apig.xiaoyisz.com",
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
body: `${tybody}`,
};
return new Promise((resolve) => {
$.post(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 0) {
log(`获取AU成功`);
tyau = result.data;
} else if (result.code == 500) {
log(
`获取AU失败请检查你的变量是否正确如正确更换到环境变量或者配置文件重试`
);
auback = 1;
} else {
log(`获取AU失败原因是${result.message}`);
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 偷朋友阳光
*/
async function stealFriendSunshine(timeout = 2 * 1000) {
//--0 先获取好友列表
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/friend/list?'+sign()+`&page=1&size=50`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise(async (resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
} else if (result.code === 0) {
const {
data: { content },
} = result;
if (content.length > 0) {
//--1 过滤可偷好友列表
const stealList = content.filter((it) => it.stealAble);
log("可偷好友列表为", stealList.length);
if (stealList.length > 0) {
//--2 偷 然后汇总偷取的阳光
const stealNums = await stealList.reduce(async (pre, curt) => {
// 这里是关键,需要 await 前一个 task 执行的结果
// 实际上每个 reduce 每个循环执行都相当于 new Promise
// 但第二次执行可以拿到上一次执行的结果,也就是上一个 Promise
// 每次执行只要 await 上一个 Promise即可实现依次执行
const prev = await pre;
if (stealFull) {
console.log("最多偷取10人不再偷取");
return prev;
} else {
const next = await stealSunshine(curt.userId);
await $.wait(2 * 1000);
return prev + next;
}
}, 0);
console.log("偷取的数据", stealNums);
resolve(stealNums);
} else resolve(0);
} else {
log(`没有好友,退出`);
resolve(0);
}
} else {
log(`遇到错误,原因是:${result.message}`);
resolve(0);
}
} catch (e) {
log(e);
} finally {
resolve(0);
}
},
timeout
);
});
}
/**
* 偷好友阳光
*/
function stealSunshine(userId, timeout = 2 * 1000) {
return new Promise((resolve) => {
let url = {
url:
'https://apig.xiaoyisz.com/qiehuang/ga/user/daily/steal?'+sign()+'&friendUserId='+userId,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
} else if (result.code === 0) {
const { data: stealData } = result;
if (stealData > 0) {
log(`偷到好友阳光 ${stealData}g`);
return resolve(stealData);
} else return resolve(0);
} else {
log(`遇到错误,原因是:${JSON.stringify(result)}`);
stealFull = true;
resolve(0);
}
} catch (e) {
log(e);
stealFull = true;
resolve(0);
}
},
timeout
);
});
}
/**
* 上报任务
*/
function report(num) {
let url = {
url: `https://apig.xiaoyisz.com/qiehuang/ga/user/task/report?`+sign()+`&taskType=${taskTypeArr[num]}&attachId=${timestampMs()}&taskId=${taskIdArr[num]}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(url, async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 902) {
auback = 1;
log(`AU失效请重抓`);
msg += `\nAU失效请重抓`;
} else if (result.data.status === 1) {
log(`上报任务成功`);
} else if (result.data.status == -2 || result.data.status == 2) {
log(`上报任务失败,可能是已经完成`);
} else {
log(`上报任务失败,原因是:${result.message}`);
}
} catch (e) {
log(e);
} finally {
resolve();
}
});
});
}
/**
* 领取奖励
*/
function getDrawPriz(num) {
let url = {
url: `https://apig.xiaoyisz.com/qiehuang/ga/user/task/drawPrize?`+sign()+`&taskId=${taskIdArr[num]}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(url, async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 902) {
auback = 1;
log(`AU失效请重抓`);
msg += `\nAU失效请重抓`;
} else if (result.code === 1000) {
log(`任务不是待领取状态`);
} else if (result.code == 0) {
let back = eval(result.data);
log(`[${back.name}]任务领取奖励成功`);
} else {
log(`任务领取奖励失败,原因是:${result.message}`);
}
} catch (e) {
log(e);
} finally {
resolve();
}
});
});
}
/**
* 获取任务
*/
function getTask(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/task/list?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result);
if (result.code == 901 || result.code == 902 || result.code == 903) {
auback = 1;
log(`AU错误可能是获取失败请更换到环境变量或配置文件重试`);
msg += `\nAU错误可能是获取失败请更换到环境变量或配置文件重试`;
}
if (auback != 1 && result.code == 0) {
log(`获取任务列表成功`);
for (let i = 0; i < 10; i++) {
if (i == 0) {
helpTaskId = back.data[i].taskId;
}
taskType = back.data[i].taskType;
taskTypeArr[i] = taskType;
taskId = back.data[i].taskId;
taskIdArr[i] = taskId;
if (back.data[i].completeTimes != back.data[i].retryTimes) {
taskBack[i] = 1;
}
}
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 获取植物详情
*/
function getPlant(num) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/plant/info?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(url, async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result);
if (result.code == 904) {
refreshAu();
}
if (result.data.stage == -1) {
await $.wait(2 * 1000);
getNewPlant();
}
if (result.code == 0) {
log(`获取植物详情成功`);
tyPlantId = result.data.plantId;
progress =
+result.data.currentSunshineNum / result.data.needSunshineNum;
progress = progress * 100;
progress = progress.toFixed(2);
plantStage = +result.data.stage;
} else log(`获取植物详情失败`);
} catch (e) {
log(e);
} finally {
resolve();
}
});
});
}
/**
* 开始挑战
*/
function startCallenge(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/challenge/start?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (auback != 1 && result.code == 0) {
challengeId = result.data;
reportCallenge();
$.wait(2 * 1000);
} else if (result.code == 1000) {
log(`开始挑战失败,次数不足`);
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 上报挑战
*/
function reportCallenge(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/challenge/report?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
body: `{"battleId":${challengeId},"result":1,"costMillisecond":${randomInt(
6500,
12000
)}}`,
};
return new Promise((resolve) => {
$.post(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (auback != 1 && result.code == 0) {
log(`挑战成功`);
startCallenge();
} else log("挑战次数不足");
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 开始冒险
*/
function startAdventure(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/adventure/start?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log("冒险开始成功");
} else if (result.code == 1000) {
log(`冒险开始失败,可能是上报异常或者当前已有冒险`);
} else log(`${result.message}`);
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 查询冒险
*/
function queryAdventure(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/adventure/info?'+sign()+'&userId=-1&type=2',
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
adventureId = result.data.adventureId;
if (timestampS() >= result.data.endTime) {
reportAdventure();
} else {
let sleepTime = +result.data.endTime - timestampS();
if (sleepTime <= 60) {
log(`距离冒险结束小于一分钟,等待${sleepTime}秒后收取冒险奖励`);
await sleep(sleepTime * 1000);
reportAdventure();
} else
log(
`距离冒险结束还有:${parseInt(
sleepTime / 3600
)}小时${parseInt((sleepTime % 3600) / 60)}分钟${parseInt(
sleepTime % 60
)}秒,大于一分钟,不进行等待`
);
}
} else log("查询上一次冒险失败,可能是未进行");
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 上报冒险
*/
function reportAdventure(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/adventure/drawPrize?'+sign()+`&adventureId=${adventureId}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log(`冒险收取成功`);
} else if (result.code == 500) {
log(`当前无可收取的冒险`);
} else if (result.code == 1000) {
log(`冒险已收取`);
} else log("冒险未到时间");
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 洒阳光
*/
function giveSunshine(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/plant/batchgiveSunshine?'+sign()+`&plantId=${tyPlantId}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.message == "已达到收获阶段") {
log("【开始收取植物】");
$.wait(2 * 1000);
getHarvest();
} else if (result.message == "plantId错误") {
log(`plantId错误可能是运行的bug不用管`);
} else if (result.message == "只能给自己批量洒阳光") {
log("只能给自己批量洒阳光");
} else if (result.message == "阳光不足") {
log("阳光不足");
giveSunshineBack = 0;
} else if (result.message != "阳光不足") {
log("洒阳光成功");
if (back.currentSunshineNum == back.needSunshineNum) {
$.wait(3 * 1000);
upgrade();
}
giveSunshineBack = 1;
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 浇水
*/
function upgrade(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/plant/upgrade?'+sign()+`&plantId=${tyPlantId}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log("浇水升级成功");
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 查询番茄余额
*/
function getTomato(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/info?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
if (plantStage == 0) {
plantStatus = "发育期";
} else if (plantStage == 1) {
plantStatus = "幼苗期";
} else if (plantStage == 2) {
plantStatus = "开花期";
} else if (plantStage == 3) {
plantStatus = "结果期";
}
log(
`查询成功,账号[${name}]番茄余额为:${back.tomatoNum},植物状态为:${plantStatus},进度:${progress}%`
);
msg += `\n账号[${name}]番茄余额为:${back.tomatoNum},植物状态为:${plantStatus},进度:${progress}%`;
}
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 收取阳光
*/
function getSunshine(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/user/daily/pickup?'+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"content-type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log("收取阳光成功");
} else if (result.code == 1000) {
log("收取阳光失败,无可收取的阳光");
} else log(`收取失败,原因是:${result.message}`);
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 收植物
*/
function getHarvest(timeout = 2 * 1000) {
let url = {
url: 'https://apig.xiaoyisz.com/qiehuang/ga/plant/harvest?'+sign()+`&plantId=${tyPlantId}`,
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log(`植物奖励收取成功,获得${back.infos[0].num}个番茄`);
getNewPlant();
} else if (result.code == 1000) {
log(`植物奖励已收取`);
} else log(`植物奖励收取失败,原因是:${result.message}`);
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 种植物
*/
function getNewPlant(timeout = 2 * 1000) {
let url = {
url: `https://apig.xiaoyisz.com/qiehuang/ga/plant/start?`+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
log(`种新的植物成功`);
await $.wait(2 * 1000);
getPlant();
await $.wait(2 * 1000);
giveSunshine();
} else if (result.code == 1000) {
log(`种失败,原因是:已种植`);
} else log(`种新的植物失败,原因是:${result.message}`);
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
/**
* 获取信息
*/
function getUserInfo(timeout = 2 * 1000) {
let url = {
url: `https://apig.xiaoyisz.com/qiehuang/ga/user/info?`+sign(),
headers: {
Host: "apig.xiaoyisz.com",
authorization: `${tyau}`,
"user-agent": `${ua}`,
"Content-Type": "application/json",
},
};
return new Promise((resolve) => {
$.get(
url,
async (error, response, data) => {
try {
let result = JSON.parse(data);
let back = eval(result.data);
if (result.code == 904) {
refreshAu();
}
if (result.code == 0) {
name = back.nickName;
id = back.id;
await $.wait(2 * 1000);
getTomato();
} else log(`获取信息失败,原因是:${result.message}`);
} catch (e) {
log(e);
} finally {
resolve();
}
},
timeout
);
});
}
// ============================================重写============================================ \\
async function GetRewrite() {
if ($request.url.indexOf("qiehuang/ga/public/api/login") > -1) {
const ck = $request.body;
if (tybody) {
if (tybody.indexOf(ck) == -1) {
tybody = tybody + "@" + ck;
let tyhz = tyhz + "@" + ck;
$.setdata(tybody, "tybody");
$.setdata(tybody, "tyhz");
List = tybody.split("@");
$.msg(
$.name +
` 获取第${tybody.length}个 ck 成功: ${ck} ,不用请自行关闭重写!`
);
}
} else {
$.setdata(ck, "tybody");
$.msg($.name + ` 获取第1个 ck 成功: ${ck} ,不用请自行关闭重写!`);
}
}
}
// ============================================变量检查============================================ \\
async function Envs() {
if (UA) {
if (UA.indexOf("@") != -1) {
UA.split("@").forEach((item) => {
UAArr.push(item);
});
} else if (UA.indexOf("\n") != -1) {
UA.split("\n").forEach((item) => {
UAArr.push(item);
});
} else {
UAArr.push(UA);
}
}
if (tybody) {
if (tybody.indexOf("@") != -1) {
tybody.split("@").forEach((item) => {
tybodyArr.push(item);
});
} else if (tybody.indexOf("\n") != -1) {
tybody.split("\n").forEach((item) => {
tybodyArr.push(item);
});
} else {
tybodyArr.push(tybody);
}
} else {
log(`\n${$.name}】:未填写变量 tybody`);
return;
}
return true;
}
// ============================================发送消息============================================ \\
async function SendMsg(message) {
if (!message) return;
if (Notify > 0) {
if ($.isNode()) {
var notify = require("./sendNotify");
await notify.sendNotify($.name, message);
} else {
$.msg(message);
}
} else {
log(message);
}
}
/**
* 随机整数生成
*/
function randomInt(min, max) {
return Math.round(Math.random() * (max - min) + min);
}
var cryptoPassFunc = function(password) {
const md5 = crypto.createHash('md5');
return md5.update(password).digest('hex').toUpperCase();
};
function sign(){
var t = timestampMs();
return 'timestamp='+t+'&nonce=6M43dZciwRpSiFDY&signature='+cryptoPassFunc('clientKey=IfWu0xwXlWgqkIC7DWn20qpo6a30hXX6&clientSecret=A4rHhUJfMjw2I5CODh5g40Ja1d3Yk1CH&nonce=6M43dZciwRpSiFDY&timestamp='+t)
}
/**
* 获取秒时间戳
*/
function timestampS() {
return Date.parse(new Date()) / 1000;
}
function timestampMs(){
return new Date().getTime();
}
/**
* 修改配置文件
*/
function modify() {
fs.readFile("/ql/data/config/config.sh", "utf8", function (err, dataStr) {
if (err) {
return log("读取文件失败!" + err);
} else {
var result = dataStr.replace(
/tyau="[\w-\s/+@]{0,1000}"/g,
`tyau="${newAuArr[0]}@${newAuArr[1]}@${newAuArr[2]}"`
);
fs.writeFile("/ql/data/config/config.sh", result, "utf8", function (err) {
if (err) {
return log(err);
}
});
}
});
}
/**
* 休眠
*/
function sleep(timeout) {
return new Promise((resolve) => setTimeout(resolve, timeout));
}
function Env(t, e) {
"undefined" != typeof process &&
JSON.stringify(process.env).indexOf("GITHUB") > -1 &&
process.exit(0);
class s {
constructor(t) {
this.env = t;
}
send(t, e = "GET") {
t = "string" == typeof t ? { url: t } : t;
let s = this.get;
return (
"POST" === e && (s = this.post),
new Promise((e, i) => {
s.call(this, t, (t, s, r) => {
t ? i(t) : e(s);
});
})
);
}
get(t) {
return this.send.call(this.env, t);
}
post(t) {
return this.send.call(this.env, t, "POST");
}
}
return new (class {
constructor(t, e) {
(this.name = t),
(this.http = new s(this)),
(this.data = null),
(this.dataFile = "box.dat"),
(this.logs = []),
(this.isMute = !1),
(this.isNeedRewrite = !1),
(this.logSeparator = "\n"),
(this.startTime = new Date().getTime()),
Object.assign(this, e),
this.log("", `🔔${this.name}, 开始!`);
}
isNode() {
return "undefined" != typeof module && !!module.exports;
}
isQuanX() {
return "undefined" != typeof $task;
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
isLoon() {
return "undefined" != typeof $loon;
}
toObj(t, e = null) {
try {
return JSON.parse(t);
} catch {
return e;
}
}
toStr(t, e = null) {
try {
return JSON.stringify(t);
} catch {
return e;
}
}
getjson(t, e) {
let s = e;
const i = this.getdata(t);
if (i)
try {
s = JSON.parse(this.getdata(t));
} catch {}
return s;
}
setjson(t, e) {
try {
return this.setdata(JSON.stringify(t), e);
} catch {
return !1;
}
}
getScript(t) {
return new Promise((e) => {
this.get({ url: t }, (t, s, i) => e(i));
});
}
runScript(t, e) {
return new Promise((s) => {
let i = this.getdata("@chavy_boxjs_userCfgs.httpapi");
i = i ? i.replace(/\n/g, "").trim() : i;
let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
(r = r ? 1 * r : 20), (r = e && e.timeout ? e.timeout : r);
const [o, h] = i.split("@"),
n = {
url: `http://${h}/v1/scripting/evaluate`,
body: { script_text: t, mock_type: "cron", timeout: r },
headers: { "X-Key": o, Accept: "*/*" },
};
this.post(n, (t, e, i) => s(i));
}).catch((t) => this.logErr(t));
}
loaddata() {
if (!this.isNode()) return {};
{
(this.fs = this.fs ? this.fs : require("fs")),
(this.path = this.path ? this.path : require("path"));
const t = this.path.resolve(this.dataFile),
e = this.path.resolve(process.cwd(), this.dataFile),
s = this.fs.existsSync(t),
i = !s && this.fs.existsSync(e);
if (!s && !i) return {};
{
const i = s ? t : e;
try {
return JSON.parse(this.fs.readFileSync(i));
} catch (t) {
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),
e = this.path.resolve(process.cwd(), this.dataFile),
s = this.fs.existsSync(t),
i = !s && this.fs.existsSync(e),
r = JSON.stringify(this.data);
s
? this.fs.writeFileSync(t, r)
: i
? this.fs.writeFileSync(e, r)
: this.fs.writeFileSync(t, r);
}
}
lodash_get(t, e, s) {
const i = e.replace(/\[(\d+)\]/g, ".$1").split(".");
let r = t;
for (const t of i) if (((r = Object(r)[t]), void 0 === r)) return s;
return r;
}
lodash_set(t, e, s) {
return Object(t) !== t
? t
: (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []),
(e
.slice(0, -1)
.reduce(
(t, s, i) =>
Object(t[s]) === t[s]
? t[s]
: (t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}),
t
)[e[e.length - 1]] = s),
t);
}
getdata(t) {
let e = this.getval(t);
if (/^@/.test(t)) {
const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
r = s ? this.getval(s) : "";
if (r)
try {
const t = JSON.parse(r);
e = t ? this.lodash_get(t, i, "") : e;
} catch (t) {
e = "";
}
}
return e;
}
setdata(t, e) {
let s = !1;
if (/^@/.test(e)) {
const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
o = this.getval(i),
h = i ? ("null" === o ? null : o || "{}") : "{}";
try {
const e = JSON.parse(h);
this.lodash_set(e, r, t), (s = this.setval(JSON.stringify(e), i));
} catch (e) {
const o = {};
this.lodash_set(o, r, t), (s = this.setval(JSON.stringify(o), i));
}
} else s = this.setval(t, e);
return s;
}
getval(t) {
return this.isSurge() || this.isLoon()
? $persistentStore.read(t)
: this.isQuanX()
? $prefs.valueForKey(t)
: this.isNode()
? ((this.data = this.loaddata()), this.data[t])
: (this.data && this.data[t]) || null;
}
setval(t, e) {
return this.isSurge() || this.isLoon()
? $persistentStore.write(t, e)
: this.isQuanX()
? $prefs.setValueForKey(t, e)
: this.isNode()
? ((this.data = this.loaddata()),
(this.data[e] = t),
this.writedata(),
!0)
: (this.data && this.data[e]) || null;
}
initGotEnv(t) {
(this.got = this.got ? this.got : require("got")),
(this.cktough = this.cktough ? this.cktough : require("tough-cookie")),
(this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()),
t &&
((t.headers = t.headers ? t.headers : {}),
void 0 === t.headers.Cookie &&
void 0 === t.cookieJar &&
(t.cookieJar = this.ckjar));
}
get(t, e = () => {}) {
t.headers &&
(delete t.headers["Content-Type"], delete t.headers["Content-Length"]),
this.isSurge() || this.isLoon()
? (this.isSurge() &&
this.isNeedRewrite &&
((t.headers = t.headers || {}),
Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })),
$httpClient.get(t, (t, s, i) => {
!t && s && ((s.body = i), (s.statusCode = s.status)), e(t, s, i);
}))
: this.isQuanX()
? (this.isNeedRewrite &&
((t.opts = t.opts || {}), Object.assign(t.opts, { hints: !1 })),
$task.fetch(t).then(
(t) => {
const { statusCode: s, statusCode: i, headers: r, body: o } = t;
e(null, { status: s, statusCode: i, headers: r, body: o }, o);
},
(t) => e(t)
))
: this.isNode() &&
(this.initGotEnv(t),
this.got(t)
.on("redirect", (t, e) => {
try {
if (t.headers["set-cookie"]) {
const s = t.headers["set-cookie"]
.map(this.cktough.Cookie.parse)
.toString();
s && this.ckjar.setCookieSync(s, null),
(e.cookieJar = this.ckjar);
}
} catch (t) {
this.logErr(t);
}
})
.then(
(t) => {
const {
statusCode: s,
statusCode: i,
headers: r,
body: o,
} = t;
e(null, { status: s, statusCode: i, headers: r, body: o }, o);
},
(t) => {
const { message: s, response: i } = t;
e(s, i, i && i.body);
}
));
}
post(t, e = () => {}) {
if (
(t.body &&
t.headers &&
!t.headers["Content-Type"] &&
(t.headers["Content-Type"] = "application/x-www-form-urlencoded"),
t.headers && delete t.headers["Content-Length"],
this.isSurge() || this.isLoon())
)
this.isSurge() &&
this.isNeedRewrite &&
((t.headers = t.headers || {}),
Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })),
$httpClient.post(t, (t, s, i) => {
!t && s && ((s.body = i), (s.statusCode = s.status)), e(t, s, i);
});
else if (this.isQuanX())
(t.method = "POST"),
this.isNeedRewrite &&
((t.opts = t.opts || {}), Object.assign(t.opts, { hints: !1 })),
$task.fetch(t).then(
(t) => {
const { statusCode: s, statusCode: i, headers: r, body: o } = t;
e(null, { status: s, statusCode: i, headers: r, body: o }, o);
},
(t) => e(t)
);
else if (this.isNode()) {
this.initGotEnv(t);
const { url: s, ...i } = t;
this.got.post(s, i).then(
(t) => {
const { statusCode: s, statusCode: i, headers: r, body: o } = t;
e(null, { status: s, statusCode: i, headers: r, body: o }, o);
},
(t) => {
const { message: s, response: i } = t;
e(s, i, i && i.body);
}
);
}
}
time(t, e = null) {
const s = e ? new Date(e) : new Date();
let i = {
"M+": s.getMonth() + 1,
"d+": s.getDate(),
"H+": s.getHours(),
"m+": s.getMinutes(),
"s+": s.getSeconds(),
"q+": Math.floor((s.getMonth() + 3) / 3),
S: s.getMilliseconds(),
};
/(y+)/.test(t) &&
(t = t.replace(
RegExp.$1,
(s.getFullYear() + "").substr(4 - RegExp.$1.length)
));
for (let e in i)
new RegExp("(" + e + ")").test(t) &&
(t = t.replace(
RegExp.$1,
1 == RegExp.$1.length
? i[e]
: ("00" + i[e]).substr(("" + i[e]).length)
));
return t;
}
msg(e = t, s = "", i = "", r) {
const o = (t) => {
if (!t) return t;
if ("string" == typeof t)
return this.isLoon()
? t
: this.isQuanX()
? { "open-url": t }
: this.isSurge()
? { url: t }
: void 0;
if ("object" == typeof t) {
if (this.isLoon()) {
let e = t.openUrl || t.url || t["open-url"],
s = t.mediaUrl || t["media-url"];
return { openUrl: e, mediaUrl: s };
}
if (this.isQuanX()) {
let e = t["open-url"] || t.url || t.openUrl,
s = t["media-url"] || t.mediaUrl;
return { "open-url": e, "media-url": s };
}
if (this.isSurge()) {
let e = t.url || t.openUrl || t["open-url"];
return { url: e };
}
}
};
if (
(this.isMute ||
(this.isSurge() || this.isLoon()
? $notification.post(e, s, i, o(r))
: this.isQuanX() && $notify(e, s, i, o(r))),
!this.isMuteLog)
) {
let t = ["", "==============📣系统通知📣=============="];
t.push(e),
s && t.push(s),
i && t.push(i),
console.log(t.join("\n")),
(this.logs = this.logs.concat(t));
}
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator));
}
logErr(t, e) {
const s = !this.isSurge() && !this.isQuanX() && !this.isLoon();
s
? this.log("", `❗️${this.name}, 错误!`, t.stack)
: this.log("", `❗️${this.name}, 错误!`, t);
}
wait(t) {
return new Promise((e) => setTimeout(e, t));
}
done(t = {}) {
const e = new Date().getTime(),
s = (e - this.startTime) / 1e3;
this.log("", `🔔${this.name}, 结束! 🕛 ${s}`),
this.log(),
(this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t);
}
})(t, e);
}