122 lines
3.2 KiB
JavaScript
122 lines
3.2 KiB
JavaScript
/**
|
|
* 主脚本模板 - 纯 Node.js 算法还原
|
|
*
|
|
* 适用场景:加密逻辑可完整提取,无浏览器环境依赖
|
|
*
|
|
* TODO: 根据逆向分析结果修改以下配置和逻辑
|
|
*/
|
|
|
|
const { generateM, generateSign } = require('./utils/encrypt');
|
|
const { RequestClient } = require('./utils/request');
|
|
|
|
// ============ 配置区域 ============
|
|
|
|
const CONFIG = {
|
|
// 目标信息
|
|
name: '示例项目',
|
|
description: '采集全部5页数据,计算数值总和',
|
|
|
|
// 接口配置
|
|
baseURL: 'https://target.com',
|
|
apiPath: '/api/data',
|
|
referer: 'https://target.com/page',
|
|
|
|
// 采集配置
|
|
totalPages: 5,
|
|
delay: 1500,
|
|
|
|
// 认证信息
|
|
cookies: {
|
|
// sessionid: 'your_session_id',
|
|
},
|
|
|
|
// 自定义请求头
|
|
headers: {
|
|
// 'X-Custom-Header': 'value',
|
|
},
|
|
};
|
|
|
|
// ============ 主逻辑 ============
|
|
|
|
async function fetchPage(client, page) {
|
|
// TODO: 根据实际接口修改参数构造逻辑
|
|
const m = generateM(page);
|
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
|
|
const params = {
|
|
page,
|
|
m,
|
|
t: timestamp,
|
|
};
|
|
|
|
const response = await client.requestWithDelay({
|
|
method: 'GET',
|
|
url: CONFIG.apiPath,
|
|
params,
|
|
});
|
|
|
|
return response.data;
|
|
}
|
|
|
|
function extractData(responseData) {
|
|
// TODO: 根据实际响应格式修改数据提取逻辑
|
|
if (responseData && responseData.data) {
|
|
return responseData.data;
|
|
}
|
|
return [];
|
|
}
|
|
|
|
function calculateResult(allData) {
|
|
// TODO: 根据题目要求修改计算逻辑
|
|
// 示例:求所有数值的总和
|
|
const sum = allData.reduce((acc, item) => {
|
|
const value = typeof item === 'number' ? item : (item.value || 0);
|
|
return acc + value;
|
|
}, 0);
|
|
return sum;
|
|
}
|
|
|
|
async function main() {
|
|
console.log(`[*] 项目:${CONFIG.name}`);
|
|
console.log(`[*] 目标:${CONFIG.description}`);
|
|
console.log('');
|
|
|
|
const client = new RequestClient({
|
|
baseURL: CONFIG.baseURL,
|
|
cookies: CONFIG.cookies,
|
|
headers: CONFIG.headers,
|
|
referer: CONFIG.referer,
|
|
delay: CONFIG.delay,
|
|
});
|
|
|
|
const allData = [];
|
|
|
|
for (let page = 1; page <= CONFIG.totalPages; page++) {
|
|
try {
|
|
const responseData = await fetchPage(client, page);
|
|
const pageData = extractData(responseData);
|
|
allData.push(...pageData);
|
|
console.log(`[+] 正在采集第 ${page}/${CONFIG.totalPages} 页... ✓ 获取 ${pageData.length} 条数据`);
|
|
} catch (error) {
|
|
console.error(`[-] 第 ${page} 页采集失败: ${error.message}`);
|
|
if (error.response) {
|
|
console.error(` 状态码: ${error.response.status}`);
|
|
console.error(` 响应: ${JSON.stringify(error.response.data).substring(0, 200)}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(`\n[+] 采集完成,共 ${allData.length} 条数据`);
|
|
|
|
const result = calculateResult(allData);
|
|
|
|
console.log('\n' + '='.repeat(30) + ' 计算结果 ' + '='.repeat(30));
|
|
console.log(`答案:${result}`);
|
|
console.log('='.repeat(70));
|
|
}
|
|
|
|
main().catch(error => {
|
|
console.error('\n[!] 运行错误:', error.message);
|
|
process.exit(1);
|
|
});
|