Refactor the check-in process
This commit is contained in:
parent
b097383e7f
commit
adf67b94a7
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/node_modules/
|
||||||
@ -1,6 +1,5 @@
|
|||||||
const axios = require('axios');
|
const axios = require('axios');
|
||||||
const qs = require('qs');
|
const qs = require('qs');
|
||||||
const { stringify } = require('querystring');
|
|
||||||
const headers = {
|
const headers = {
|
||||||
'Host': 'huodong3.3839.com',
|
'Host': 'huodong3.3839.com',
|
||||||
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
||||||
1367
package-lock.json
generated
1367
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
21
package.json
Normal file
21
package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "kuaibao-sign",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "kuaibao sign",
|
||||||
|
"main": "daily.js",
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^1.4.0",
|
||||||
|
"module": "^1.2.5",
|
||||||
|
"qs": "^6.11.2"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"scripts": {
|
||||||
|
"test": "node daily.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@git.rainss.cn:rainerosion/kuaibao.git"
|
||||||
|
},
|
||||||
|
"author": "rainerosion",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
254
sign.js
Normal file
254
sign.js
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
const axios = require('axios');
|
||||||
|
const qs = require('qs');
|
||||||
|
|
||||||
|
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_DATI: 'DailyDati',
|
||||||
|
DAILY_DATI_ANSWER: 'DailyDatiAnswer',
|
||||||
|
DAILY_DATI_ID: 4,
|
||||||
|
DAILY_GAME_CATE_JUMP:'DailyGameCateJump',
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
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) {
|
||||||
|
let jsonData = response.data;
|
||||||
|
// console.log('JSON Data:', JSON.stringify(jsonData));
|
||||||
|
return jsonData
|
||||||
|
} 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildData(action, id, scookie, deviceId, requireMode) {
|
||||||
|
let data;
|
||||||
|
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') {
|
||||||
|
dailyData.config.daily_user_Task
|
||||||
|
.filter(task => task.success === "2")
|
||||||
|
.map(task => task.rwid)
|
||||||
|
.forEach(rwid => dailyIdList.push(rwid));
|
||||||
|
} 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;
|
||||||
|
// 分享任务
|
||||||
|
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 doDatiTask(scookie, deviceId);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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("任务【" + taskName + "】领奖失败, 失败原因:" + shareCallback.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("任务【" + taskName + "】分享失败, 失败原因:" + shareCallback.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("分享任务执行失败,任务id:" + id + "失败原因:" + view.info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function doGameTask(idList, scookie, deviceId) {
|
||||||
|
for (const id of idList) {
|
||||||
|
// 执行分享前查询
|
||||||
|
let view = await postApiData(API, buildData(ACTION.DAILY_GAME_LING, 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_GAME_PLAY, id, scookie, deviceId, true), headers);
|
||||||
|
if (shareCallback.key === '501') {
|
||||||
|
await sleep(3000);
|
||||||
|
// 领奖
|
||||||
|
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("任务【" + taskName + "】领取成功,成熟度+" + csd + "爆米花+" + bmh);
|
||||||
|
} else {
|
||||||
|
console.log("任务【" + taskName + "】领奖失败, 失败原因:" + shareCallback.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("任务【" + taskName + "】分享失败, 失败原因:" + shareCallback.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("分享任务执行失败,任务id:" + id + "失败原因:" + view.info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
const optionKeys = Object.keys(dati).filter(key => key.startsWith('option'));
|
||||||
|
const randomOptionKey = optionKeys[Math.floor(Math.random() * optionKeys.length)];
|
||||||
|
answerData.option = dati[randomOptionKey];
|
||||||
|
let answer = await postApiData(API, answerData, headers);
|
||||||
|
if (answer.key === '501') {
|
||||||
|
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("每日答题完成,随机选择的答案" + answerData.option);
|
||||||
|
} else {
|
||||||
|
console.log("每日答题失败,原因:" + answer.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("每日答题失败,原因:" + answer.info);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log("每日答题失败,原因:" + dati.info);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
execTodayTask()
|
||||||
Loading…
Reference in New Issue
Block a user