const axios = require('axios'); // 环境变量名称 const TOKEN_ENV_VAR = 'BAOZI_TOKEN'; // API 端点 const API_SIGN = 'https://lucky.5202030.xyz/api/sign/'; const API_LOTTERY = 'https://lucky.5202030.xyz/api/lottery/'; // 两次抽奖之间的延迟(毫秒),避免请求过快 const LOTTERY_DELAY_MS = 200; // 抽奖安全锁:防止无限循环,单次运行最多抽这么多次 const MAX_LOTTERY_ATTEMPTS = 200; // 从环境变量读取 Token const AUTH_TOKEN = process.env[TOKEN_ENV_VAR]; if (!AUTH_TOKEN) { console.error(`❌ 错误:未找到环境变量 ${TOKEN_ENV_VAR}。`); console.log('请在青龙面板 "环境变量" 中添加此变量,值为你的 Authorization Token (包含 "Bearer ")。'); process.exit(1); // 退出脚本 } // 统一的请求头 const HEADERS = { 'accept': 'application/json, text/plain, */*', 'authorization': AUTH_TOKEN, 'cache-control': 'no-cache', 'pragma': 'no-cache', 'origin': 'https://lucky.5202030.xyz', 'user-agent': 'QingLong_Script_NodeJS/1.0', // 伪装一个 User Agent }; // 简单的延迟函数 function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } /** * 任务1:执行每日签到 */ async function doSignIn() { console.log('--- 任务1: 开始执行每日签到(修炼) ---'); try { const response = await axios.post(API_SIGN, null, { headers: HEADERS }); const data = response.data; if (data.success) { console.log(`✅ 签到成功: ${data.message}`); console.log(` - 获得奖励: ${data.reward}`); console.log(` - 当前余额: ${data.current_balance}`); } else { // 假设已签到也会返回 success: false 或特定的 message console.warn(`🔔 签到提示: ${data.message || '签到失败或已签到'}`); } } catch (error) { if (error.response) { console.error(`❌ 签到请求失败: ${error.response.status} - ${error.response.statusText}`); console.error(` - 响应内容: ${JSON.stringify(error.response.data)}`); } else { console.error(`❌ 签到时发生网络错误: ${error.message}`); } } console.log('--- 签到任务结束 ---\n'); } /** * 任务2:执行自动抽奖(直到次数用完) */ async function doLottery() { console.log('--- 任务2: 开始执行自动抽奖 ---'); // 抽奖统计 const stats = { totalNet: 0, draws: 0, positiveDraws: 0, negativeDraws: 0, zeroDraws: 0, startBalance: null, endBalance: 0, }; let remainingAttempts = -1; // -1 表示尚未开始 for (let i = 1; i <= MAX_LOTTERY_ATTEMPTS; i++) { try { // 执行抽奖 const response = await axios.post(API_LOTTERY, null, { headers: HEADERS }); const data = response.data; // 检查 API 返回是否成功 if (data.success) { stats.draws++; stats.totalNet += data.net_change; stats.endBalance = data.current_balance; if (stats.startBalance === null) { // 通过净变化推算初始余额 stats.startBalance = data.current_balance - data.net_change; } if (data.net_change > 0) stats.positiveDraws++; else if (data.net_change < 0) stats.negativeDraws++; else stats.zeroDraws++; // 打印单次结果 console.log(`[第 ${i} 抽] 结果: ${data.message} | 净变化: ${data.net_change} | 剩余次数: ${data.remaining_attempts}`); // 检查剩余次数 remainingAttempts = data.remaining_attempts; if (remainingAttempts === 0) { console.log('🎉 所有抽奖次数已用完。'); break; // 正常结束循环 } } else { // API 返回 success: false,例如“次数不足” console.warn(`🔔 抽奖提示: ${data.message || '抽奖API返回错误'}。 停止抽奖。`); break; // 异常,结束循环 } // 在两次请求间稍作等待 await delay(LOTTERY_DELAY_MS); } catch (error) { if (error.response) { console.error(`❌ 抽奖请求失败: ${error.response.status} - ${error.response.statusText}`); console.error(` - 响应内容: ${JSON.stringify(error.response.data)}`); } else { console.error(`❌ 抽奖时发生网络错误: ${error.message}`); } console.error('抽奖任务因错误而终止。'); break; // 发生错误,终止循环 } } if (remainingAttempts > 0) { console.warn(`⚠️ 警告: 抽奖在达到 ${MAX_LOTTERY_ATTEMPTS} 次上限后停止,但可能仍有剩余次数。`); } // 打印最终统计 console.log('\n--- 抽奖统计报告 ---'); if (stats.draws > 0) { console.log(` - 初始余额: ${stats.startBalance.toFixed(2)}`); console.log(` - 最终余额: ${stats.endBalance.toFixed(2)}`); console.log(` - 总计盈亏: ${stats.totalNet.toFixed(2)}`); console.log(` - 总抽奖数: ${stats.draws} 次`); console.log(` - 盈利次数: ${stats.positiveDraws} 次`); console.log(` - 亏损次数: ${stats.negativeDraws} 次`); console.log(` - 无变化: ${stats.zeroDraws} 次`); } else { console.log(' - 本次未执行任何有效抽奖。'); } console.log('--- 自动抽奖任务结束 ---'); } /** * 主执行函数 */ async function main() { console.log(`🚀 开始执行 Lucky XYZ 自动任务... (Token: ...${AUTH_TOKEN.slice(-10)})`); // 1. 执行签到 await doSignIn(); // 2. 执行抽奖 await doLottery(); console.log('✅ 所有任务执行完毕。'); } // 运行主函数 main().catch(error => { console.error('❌ 脚本执行过程中发生未捕获的致命错误:'); console.error(error); process.exit(1); });