kuaibao/sign.js
2023-08-20 22:33:37 +08:00

445 lines
18 KiB
JavaScript
Raw 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.

const axios = require('axios');
const qs = require('qs');
const {saveToFile, readFromFile} = require("./fileOperations");
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',
DAILY_APP_JUMP: 'DailyAppJump',
DAILY_DATI: 'DailyDati',
DAILY_DATI_ANSWER: 'DailyDatiAnswer',
DAILY_DATI_ID: 4,
DAILY_GAME_CATE_JUMP: 'DailyGameCateJump',
DAILY_GAME_CATE_LING: 'DailyGameCateLing',
DAILY_WATERING: 'Watering', // 浇水
GOU_MAI: 'GouMai', // 购买种子
PLANT_SOW: 'PlantSow', // 种植
PLANT_RIPE: 'PlantRipe', //收割
PRODUCE: 'Produce', // 查询爆米花数量
START_PRODUCE: 'StartProduce', //兑换爆米花
};
const HYKB_SCOOKIE = process.env.HYKB_SCOOKIE;
const HYKB_DEVICE_ID = process.env.HYKB_DEVICE_ID;
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));
return response.data
} 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;
}
async function sleep(ms) {
console.log("等待" + (ms / 1000) + "秒后继续执行");
return new Promise(resolve => setTimeout(resolve, ms));
}
function buildData(action, id, scookie, deviceId, requireMode) {
let data;
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)) {
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));
let dailyIdList = [];
if (dailyData.key === 'ok') {
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;
dailyData.config.daily_user_Task
.filter(task => task.success === "2")
.map(task => task.rwid)
.forEach(rwid => dailyIdList.push(rwid));
console.log(`账号${username},爆米花${baomihua}个,玉米${corn}个,任务开始执行`);
if (chengshoudu === 100) {
// 收割、兑换、种植
await doPlantTask(scookie, deviceId, seed);
}
} 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;
const cateRegexPattern = /DailyGameCateLing\((\d+)\)/g;
// 每日浇水
await doWateringTask(scookie, deviceId);
// 分享任务
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]);
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);
// 答题任务
await doDatiTask(scookie, deviceId);
console.log("任务结束");
}
}
}
async function doWateringTask(scookie, deviceId) {
console.log("开始执行每日浇水任务");
let watering = await postApiData(API, buildData(ACTION.DAILY_WATERING, null, scookie, deviceId, false), headers);
if (watering.key === 'ok') {
console.log(JSON.stringify(watering))
console.log("开始执行每日浇水成功");
} else {
console.log(JSON.stringify(watering))
console.log("每日浇水任务失败,原因:" + watering.info);
}
}
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;
console.log("分享任务【" + taskName + "】领取成功,成熟度+" + csd + "爆米花+" + bmh);
} else {
console.log(JSON.stringify(shareCallback));
console.log("分享任务【" + taskName + "】领奖失败, 失败原因:" + shareCallback.info);
}
} else {
console.log(JSON.stringify(shareCallback));
console.log("分享任务【" + taskName + "】分享失败, 失败原因:" + shareCallback.info);
}
} else if (view.key === '503') {
let csd = view.reward_csd_num;
let bmh = view.reward_bmh_num;
console.log("分享任务领取成功,成熟度+" + csd + "爆米花+" + bmh);
} else {
console.log(JSON.stringify(view));
console.log("分享任务执行失败,任务id:" + id + "失败原因:" + view.info);
}
}
}
async function doGameTask(idList, scookie, deviceId) {
for (const id of idList) {
// 执行打开操作
console.log("下载体验任务[" + id + "]开始");
let view = await postApiData(API, buildData(ACTION.DAILY_GAME_PLAY, id, scookie, deviceId, false), headers);
if (view.key === 'ok' || view.key === '501') {
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);
} else {
console.log(JSON.stringify(reward));
console.log("下载体验任务[" + id + "]领奖失败, 失败原因:" + reward.info);
}
} else if (view.key === '503') {
let csd = view.reward_csd_num;
let bmh = view.reward_bmh_num;
console.log("分享任务领取成功,成熟度+" + csd + "爆米花+" + bmh);
} else {
console.log(JSON.stringify(view));
console.log("下载体验任务执行失败,任务id:" + id);
}
}
}
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);
// 查询题目答案
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;
let answer = await postApiData(API, answerData, headers);
if (answer.key === 'ok') {
await sleep(3000);
let result = await postApiData(API, buildData(ACTION.DAILY_DATI, ACTION.DAILY_DATI_ID, scookie, deviceId, false), headers);
if (result.key === '501') {
console.log(JSON.stringify(result));
console.log("每日答题完成,随机选择的答案" + answerData.option);
} else if (result.key === '503') {
//保存题目信息
let backTimu = result.back_timu;
let question = {};
question[backTimu] = result.back_answer;
saveToFile(question);
} else {
console.log(JSON.stringify(result));
console.log("每日答题失败,原因:" + result.info);
}
} else {
console.log(JSON.stringify(answer));
console.log("每日答题失败,原因:" + answer.info);
}
} else {
console.log(JSON.stringify(dati));
console.log("每日答题失败,原因:" + dati.info);
}
}
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);
if (reward.key === 'ok') {
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);
}
}
}
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);
if (reward.key === 'ok') {
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);
}
}
}
/**
* 种植
* @param scookie
* @param deviceId
* @param seed
* @returns {Promise<void>}
*/
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}`);
}
}
}
}
execTodayTask();