kuaibao/sign.js

453 lines
18 KiB
JavaScript
Raw Normal View History

2023-08-09 14:59:44 +08:00
const axios = require('axios');
const qs = require('qs');
2023-08-20 22:26:24 +08:00
const {saveToFile, readFromFile} = require("./fileOperations");
2023-08-09 14:59:44 +08:00
const API = 'https://huodong3.3839.com/n/hykb/grow/ajax.php';
const DAILY_URL = 'https://huodong3.3839.com/n/hykb/grow/daily.php';
const ACTION = {
DAILY_LOGIN: 'Dailylogin',
DAILY_SHARE: 'DailyShare',
DAILY_SHARE_CALLBACK: 'DailyShareCallb',
DAILY_GAME_LING: 'DailyGameLing',
DAILY_GAME_PLAY: 'DailyGamePlay',
DAILY_APP_LING: 'DailyAppLing',
2023-08-20 22:26:24 +08:00
DAILY_APP_JUMP: 'DailyAppJump',
2023-08-09 14:59:44 +08:00
DAILY_DATI: 'DailyDati',
DAILY_DATI_ANSWER: 'DailyDatiAnswer',
DAILY_DATI_ID: 4,
2023-08-09 15:25:55 +08:00
DAILY_GAME_CATE_JUMP: 'DailyGameCateJump',
2023-08-20 22:26:24 +08:00
DAILY_GAME_CATE_LING: 'DailyGameCateLing',
2023-08-10 03:24:39 +08:00
DAILY_WATERING: 'Watering', // 浇水
GOU_MAI: 'GouMai', // 购买种子
PLANT_SOW: 'PlantSow', // 种植
PLANT_RIPE: 'PlantRipe', //收割
2023-08-11 01:15:27 +08:00
PRODUCE: 'Produce', // 查询爆米花数量
START_PRODUCE: 'StartProduce', //兑换爆米花
2023-08-09 14:59:44 +08:00
};
2023-08-11 01:15:27 +08:00
const HYKB_SCOOKIE = process.env.HYKB_SCOOKIE;
const HYKB_DEVICE_ID = process.env.HYKB_DEVICE_ID;
2023-08-09 14:59:44 +08:00
const headers = {
'Host': 'huodong3.3839.com',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; RMX3562 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.129 Mobile Safari/537.36Androidkb/1.5.6.903(android;RMX3562;13;1080x2316;4G);@4399_sykb_android_activity@',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://huodong3.3839.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Dest': 'empty',
'Referer': 'https://huodong3.3839.com/n/hykb/grow/daily.php',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
// 'Cookie': process.env.HYKB_COOKIE
};
async function postApiData(url, data, headers) {
try {
let axiosConfig = {
method: 'post',
maxBodyLength: Infinity,
url: url,
headers: headers,
data: data
};
let response = await axios.request(axiosConfig);
if (response.status >= 200 && response.status < 300) {
// console.log('JSON Data:', JSON.stringify(jsonData));
2023-08-11 01:15:27 +08:00
return response.data
2023-08-09 14:59:44 +08:00
} else {
console.error('Request was not successful. Status:', response.status);
return null;
}
} catch (error) {
console.error('Error:', error.message);
return null;
}
}
/**
* random
* @returns
*/
function generateRandom() {
const randomNum = Math.random();
return randomNum.toFixed(17);
}
function isFalsy(value) {
return !value;
}
2023-08-09 15:25:55 +08:00
async function sleep(ms) {
console.log("等待" + (ms / 1000) + "秒后继续执行");
2023-08-09 14:59:44 +08:00
return new Promise(resolve => setTimeout(resolve, ms));
}
function buildData(action, id, scookie, deviceId, requireMode) {
let data;
2023-08-10 03:24:39 +08:00
if (ACTION.GOU_MAI === 'action') {
data = qs.stringify({
'ac': action,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId,
'resure': 0,
'gmmode': 'seed',
'tmpNum': 1
});
} else if (isFalsy(id)) {
2023-08-09 14:59:44 +08:00
data = qs.stringify({
'ac': action,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId
});
} else if (requireMode) {
data = qs.stringify({
'ac': action,
'id': id,
'mode': 'weixin',
'r': generateRandom(),
'scookie': scookie,
'device': deviceId
});
} else {
data = qs.stringify({
'ac': action,
'id': id,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId
});
}
return data;
}
function checkParams(scookie, devices) {
if (!scookie || !devices) {
console.log('未设置HYKB_SCOOKIE或HYKB_DEVICE_ID环境变量多个使用#分割');
process.exit(1); // 1 表示退出程序,可以使用其他值表示不同的退出状态
}
}
async function execTodayTask() {
checkParams(HYKB_SCOOKIE, HYKB_DEVICE_ID);
let cookies = HYKB_SCOOKIE.split('#');
let devices = HYKB_DEVICE_ID.split('#');
if (cookies.length !== devices.length) {
console.log('HYKB_SCOOKIE或HYKB_DEVICE_ID设置错误数量不一致');
process.exit(1);
}
for (let i = 0; i < cookies.length; i++) {
let scookie = cookies[i];
let deviceId = devices[i];
let response = await axios.get(DAILY_URL, {headers: headers});
// 获取每日数据
let dailyData = await postApiData(API, buildData(ACTION.DAILY_LOGIN, null, scookie, deviceId, false));
2023-08-11 01:15:27 +08:00
2023-08-09 14:59:44 +08:00
let dailyIdList = [];
if (dailyData.key === 'ok') {
2023-08-10 03:47:18 +08:00
let seed = dailyData.config.seed; // 种子数量
let corn = dailyData.config.corn; // 玉米数量
let chengshoudu = dailyData.config.chengshoudu; // 成熟度
let baomihua = dailyData.config.baomihua; // 爆米花数量
let username = dailyData.config.name;
2023-08-09 14:59:44 +08:00
dailyData.config.daily_user_Task
.filter(task => task.success === "2")
.map(task => task.rwid)
.forEach(rwid => dailyIdList.push(rwid));
2023-08-11 01:15:27 +08:00
console.log(`账号${username},爆米花${baomihua}个,玉米${corn}个,任务开始执行`);
if (chengshoudu === 100) {
// 收割、兑换、种植
await doPlantTask(scookie, deviceId, seed);
}
2023-08-09 14:59:44 +08:00
} else if (dailyData.key === 'no_login') {
console.log("账号" + (i + 1) + "登录信息已失效");
continue;
}
if (response.status === 200) {
let html = response.data;
const shareRegexPattern = /DailyShare\((\d+)\)/g;
const gameRegexPattern = /DailyGameLing\((\d+)\)/g;
const appRegexPattern = /DailyAppLing\((\d+)\)/g;
2023-08-20 22:26:24 +08:00
const cateRegexPattern = /DailyGameCateLing\((\d+)\)/g;
2023-08-09 18:04:26 +08:00
// 每日浇水
await doWateringTask(scookie, deviceId);
2023-08-09 14:59:44 +08:00
// 分享任务
let dailyShareIdList = [...html.matchAll(shareRegexPattern)]
.filter(match => !dailyIdList.includes(match[1]))
.map(match => match[1]);
await doShareTask(dailyShareIdList, scookie, deviceId);
// 体验任务
let dailyGameIdList = [...html.matchAll(gameRegexPattern)]
.filter(match => !dailyIdList.includes(match[1]))
.map(match => match[1]);
await doGameTask(dailyGameIdList, scookie, deviceId);
let dailyAppIdList = [...html.matchAll(appRegexPattern)]
.filter(match => !dailyIdList.includes(match[1]))
.map(match => match[1]);
2023-08-20 22:26:24 +08:00
await doDailyAppJumpTask(dailyAppIdList, scookie, deviceId);
let cateAppIdList = [...html.matchAll(cateRegexPattern)]
.filter(match => !dailyIdList.includes(match[1]))
.map(match => match[1]);
await doDailyGameCateJumpTask(cateAppIdList, scookie, deviceId);
2023-08-09 14:59:44 +08:00
// 答题任务
await doDatiTask(scookie, deviceId);
2023-08-09 15:25:55 +08:00
console.log("任务结束");
2023-08-09 14:59:44 +08:00
}
}
}
2023-08-10 03:24:39 +08:00
async function doWateringTask(scookie, deviceId) {
2023-08-09 18:04:26 +08:00
console.log("开始执行每日浇水任务");
let watering = await postApiData(API, buildData(ACTION.DAILY_WATERING, null, scookie, deviceId, false), headers);
2023-08-10 03:24:39 +08:00
if (watering.key === 'ok') {
2023-08-09 18:04:26 +08:00
console.log(JSON.stringify(watering))
console.log("开始执行每日浇水成功");
} else {
console.log(JSON.stringify(watering))
console.log("每日浇水任务失败,原因:" + watering.info);
}
}
2023-08-09 14:59:44 +08:00
async function doShareTask(idList, scookie, deviceId) {
for (const id of idList) {
// 执行分享前查询
let view = await postApiData(API, buildData(ACTION.DAILY_SHARE, id, scookie, deviceId, false), headers);
if (view.key === '501') {
await sleep(3000);
let taskName = view.share_title;
console.log("分享任务【" + taskName + "】正在执行");
let shareCallback = await postApiData(API, buildData(ACTION.DAILY_SHARE_CALLBACK, id, scookie, deviceId, true), headers);
if (shareCallback.key === '501') {
await sleep(3000);
// 领奖
let reward = await postApiData(API, buildData(ACTION.DAILY_SHARE, id, scookie, deviceId, false), headers);
if (reward.key === '503') {
let csd = reward.reward_csd_num;
let bmh = reward.reward_bmh_num;
2023-08-09 15:25:55 +08:00
console.log("分享任务【" + taskName + "】领取成功,成熟度+" + csd + "爆米花+" + bmh);
2023-08-09 14:59:44 +08:00
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(shareCallback));
2023-08-09 15:25:55 +08:00
console.log("分享任务【" + taskName + "】领奖失败, 失败原因:" + shareCallback.info);
2023-08-09 14:59:44 +08:00
}
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(shareCallback));
2023-08-09 15:25:55 +08:00
console.log("分享任务【" + taskName + "】分享失败, 失败原因:" + shareCallback.info);
2023-08-09 14:59:44 +08:00
}
2023-08-11 01:15:27 +08:00
} else if (view.key === '503') {
let csd = view.reward_csd_num;
let bmh = view.reward_bmh_num;
console.log("分享任务领取成功,成熟度+" + csd + "爆米花+" + bmh);
2023-08-09 14:59:44 +08:00
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(view));
2023-08-09 14:59:44 +08:00
console.log("分享任务执行失败,任务id:" + id + "失败原因:" + view.info);
}
}
}
async function doGameTask(idList, scookie, deviceId) {
for (const id of idList) {
2023-08-09 15:25:55 +08:00
// 执行打开操作
console.log("下载体验任务[" + id + "]开始");
let view = await postApiData(API, buildData(ACTION.DAILY_GAME_PLAY, id, scookie, deviceId, false), headers);
2023-08-10 03:24:39 +08:00
if (view.key === 'ok' || view.key === '501') {
2023-08-09 15:25:55 +08:00
await sleep(180000);
// 领奖
let reward = await postApiData(API, buildData(ACTION.DAILY_GAME_LING, id, scookie, deviceId, false), headers);
if (reward.key === '503') {
let csd = reward.reward_csd_num;
let bmh = reward.reward_bmh_num;
console.log("下载体验任务[" + id + "]领取成功,成熟度+" + csd + "爆米花+" + bmh);
2023-08-09 14:59:44 +08:00
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(reward));
2023-08-09 15:25:55 +08:00
console.log("下载体验任务[" + id + "]领奖失败, 失败原因:" + reward.info);
2023-08-09 14:59:44 +08:00
}
2023-08-11 01:15:27 +08:00
} else if (view.key === '503') {
let csd = view.reward_csd_num;
let bmh = view.reward_bmh_num;
console.log("分享任务领取成功,成熟度+" + csd + "爆米花+" + bmh);
2023-08-09 14:59:44 +08:00
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(view));
2023-08-10 03:24:39 +08:00
console.log("下载体验任务执行失败,任务id:" + id);
2023-08-09 14:59:44 +08:00
}
}
}
async function doDatiTask(scookie, deviceId) {
console.log("开始执行每日答题任务");
let dati = await postApiData(API, buildData(ACTION.DAILY_DATI, ACTION.DAILY_DATI_ID, scookie, deviceId, false), headers);
if (dati.key === '501') {
let answerData = buildData(ACTION.DAILY_DATI_ANSWER, ACTION.DAILY_DATI_ID, scookie, deviceId, false);
2023-08-20 22:26:24 +08:00
// 查询题目答案
let queryAnswer = readFromFile(dati.title);
if (queryAnswer) {
const optionKeys = Object.keys(dati).filter(key => key.startsWith('option'));
const randomOptionKey = optionKeys[Math.floor(Math.random() * optionKeys.length)];
queryAnswer = dati[randomOptionKey];
}
answerData += "&option=" + queryAnswer;
2023-08-09 14:59:44 +08:00
let answer = await postApiData(API, answerData, headers);
2023-08-20 22:33:37 +08:00
if (answer.key === 'ok') {
2023-08-09 14:59:44 +08:00
await sleep(3000);
let result = await postApiData(API, buildData(ACTION.DAILY_DATI, ACTION.DAILY_DATI_ID, scookie, deviceId, false), headers);
if (result.key === '501') {
2023-08-22 10:33:38 +08:00
console.log("每日答题完成!");
2023-08-10 03:24:39 +08:00
console.log(JSON.stringify(result));
2023-08-22 10:33:38 +08:00
let backTimu = dati.title;
2023-08-20 22:26:24 +08:00
let question = {};
2023-08-22 10:33:38 +08:00
question[backTimu] = queryAnswer;
2023-08-20 22:26:24 +08:00
saveToFile(question);
2023-08-22 10:33:38 +08:00
console.log("记录题目答案!");
} else if (result.key === '503') {
//保存题目信息
if(result.back_timu) {
console.log("每日答题-保存题目信息!");
let backTimu = result.back_timu;
let question = {};
question[backTimu] = result.back_answer;
saveToFile(question);
}
2023-08-09 14:59:44 +08:00
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(result));
2023-08-22 10:33:38 +08:00
console.log("每日答题失败");
2023-08-09 14:59:44 +08:00
}
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(answer));
2023-08-09 14:59:44 +08:00
console.log("每日答题失败,原因:" + answer.info);
}
} else {
2023-08-09 17:56:43 +08:00
console.log(JSON.stringify(dati));
2023-08-09 14:59:44 +08:00
console.log("每日答题失败,原因:" + dati.info);
}
}
2023-08-20 22:26:24 +08:00
async function doDailyAppJumpTask(idList, scookie, deviceId) {
for (const id of idList) {
let res = await postApiData(API, buildData(ACTION.DAILY_APP_JUMP, id, scookie, deviceId, false), headers);
if (res.key === 'ok') {
await sleep(180000);
let reward = await postApiData(API, buildData(ACTION.DAILY_APP_LING, id, scookie, deviceId, false), headers);
2023-08-20 22:33:37 +08:00
if (reward.key === 'ok') {
2023-08-20 22:26:24 +08:00
let csd = reward.reward_csd_num;
let bmh = reward.reward_bmh_num;
console.log("体验任务【在线玩频道】领取成功,成熟度+" + csd + "爆米花+" + bmh);
} else {
console.log(JSON.stringify(reward));
console.log("体验任务【在线玩频道】领奖失败, 失败原因:" + reward.info);
}
} else {
console.log(JSON.stringify(res));
console.log("任务执行失败,任务id:" + id + "失败原因:" + res.info);
}
}
2023-08-09 18:09:44 +08:00
}
2023-08-20 22:26:24 +08:00
async function doDailyGameCateJumpTask(idList, scookie, deviceId) {
for (const id of idList) {
let res = await postApiData(API, buildData(ACTION.DAILY_GAME_CATE_JUMP, id, scookie, deviceId, false), headers);
if (res.key === 'ok') {
await sleep(180000);
let reward = await postApiData(API, buildData(ACTION.DAILY_GAME_CATE_LING, id, scookie, deviceId, false), headers);
2023-08-20 22:33:37 +08:00
if (reward.key === 'ok') {
2023-08-20 22:26:24 +08:00
let csd = reward.reward_csd_num;
let bmh = reward.reward_bmh_num;
console.log("体验任务【近期爆友热玩游戏】领取成功,成熟度+" + csd + "爆米花+" + bmh);
} else {
console.log(JSON.stringify(reward));
console.log("体验任务【近期爆友热玩游戏】领奖失败, 失败原因:" + reward.info);
}
} else {
console.log(JSON.stringify(res));
console.log("任务执行失败,任务id:" + id + "失败原因:" + res.info);
}
}
}
2023-08-09 18:09:44 +08:00
/**
* 种植
* @param scookie
* @param deviceId
2023-08-11 01:15:27 +08:00
* @param seed
2023-08-09 18:09:44 +08:00
* @returns {Promise<void>}
*/
2023-08-11 01:15:27 +08:00
async function doPlantTask(scookie, deviceId, seed) {
let ripe = await postApiData(API, buildData(ACTION.PLANT_RIPE, null, scookie, deviceId, false), headers);
// console.log(JSON.stringify(ripe));
if (ripe && ripe.key === '513') {
console.log(`收割成功,获得爆米花${ripe.add_corn}`);
}
// 兑换爆米花
await productBmh(scookie, deviceId);
if (parseInt(seed) === 0) {
// 购买种子
let goumai = await postApiData(API, buildData(ACTION.GOU_MAI, null, scookie, deviceId, false), headers);
if (goumai && goumai.key === '503' && goumai.need_bmh <= parseInt(goumai.baomihua)) {
let data = qs.stringify({
'ac': action,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId,
'resure': 1,
'gmmode': 'seed',
'tmpNum': 1
});
let resureGm = await postApiData(API, data, headers);
if (resureGm && resureGm.key === 'ok') {
console.log('种子购买成功');
} else {
console.log('种子购买失败');
}
}
}
// 种植
let sow = await postApiData(API, buildData(ACTION.PLANT_SOW, null, scookie, deviceId, false), headers);
if (sow && sow.key === 'ok') {
console.log("播种完成");
}
}
async function productBmh(scookie, deviceId) {
let produce = await postApiData(API, buildData(ACTION.PRODUCE, null, scookie, deviceId, false), headers);
// console.log(JSON.stringify(produce));
if (produce && produce.key === 'ok' && parseInt(produce.corn) >= 1) {
let data = qs.stringify({
'ac': ACTION.START_PRODUCE,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId,
'resure': 0,
'preNum': produce.corn
});
let startProduct = await postApiData(API, data, headers);
if (startProduct && startProduct.key === '502') {
let data = qs.stringify({
'ac': ACTION.START_PRODUCE,
'r': generateRandom(),
'scookie': scookie,
'device': deviceId,
'resure': 1,
'preNum': produce.corn
});
let finish = await postApiData(API, data, headers);
if (finish && finish.key === 'ok') {
console.log(`兑换成功,获得爆米花${finish.add_bmh},拥有爆米花${finish.baomihua}`);
}
}
}
2023-08-09 18:09:44 +08:00
}
2023-08-10 03:24:39 +08:00
2023-08-11 01:15:27 +08:00
execTodayTask();