diff --git a/维誉链.js b/维誉链.js index 4314a70..1b90587 100644 --- a/维誉链.js +++ b/维誉链.js @@ -2,130 +2,145 @@ * @File: wyl_signin.js * @Author: Gemini * @Date: 2025-10-02 - * @Description: 维誉链项目每日签到脚本,适配青龙面板,并支持运行后发送通知。 + * @Description: 维誉链每日签到脚本(青龙面板/普通 Node 均可) + * 积分自动 +1,无需再设 WYL_INTEGRAL 环境变量 * cron: 0 0,12 * * * */ -// 引入 axios 依赖 +// ========== 依赖 ========== const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { sendNotify } = require('./sendNotify'); // 通知文件路径保持与你原来一致 +// ============================= -// ======================= 主要修改点 ======================= -// 从旧版 sendNotify.js 导出的对象中,解构出 sendNotify 函数 -// 这样就可以兼容您的通知文件了 -const { sendNotify } = require('./sendNotify'); -// ======================================================= +// ========== 积分持久化 ========== +const INTEGRAL_FILE = path.join(__dirname, '.wyl_integral'); // 存在脚本同目录 - -// --- 配置区 --- -// 请在青龙面板 -> 环境变量 中添加新变量 -// 名称: WYL_USER_IDS -// 值: 你的用户ID (例如: 1003153) -// 备注: 维誉链签到 -// -// 多账号支持: 如果有多个账号,用 & 或者 换行符 分隔 - -const userIdsEnv = process.env.WYL_USER_IDS; -const userIds = userIdsEnv ? userIdsEnv.split(/&|\n/).filter(id => !!id) : []; - -// --- 工具函数 --- -const logSeparator = () => console.log("-" .repeat(40)); - -// --- 主逻辑 --- - -/** - * 为指定的用户ID执行签到操作,并返回结果字符串 - * @param {string} userId - 用户ID - * @returns {Promise} 包含执行结果的单行消息 - */ -async function signIn(userId) { - const url = `https://zjz.114kaili.com:200/webapi/AddUsersIntegral?users_id=${userId}&type=1`; - const headers = { - 'Host': 'zjz.114kaili.com:200', - 'User-Agent': 'Mozilla/5.0 (Linux; Android 15; Mi 10 Pro Build/AQ3A.240812.002; wv) AppleWebKit/5.0 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20230805 MMWEBID/909 MicroMessenger/8.0.42.29(0x28002A49) WeChat/arm64 Weixin GPVersion/1 Android Tablet NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android' - }; - - const config = { - method: 'POST', - url: url, - headers: headers, - timeout: 10000 // 设置10秒超时 - }; - - let resultMessage = `账号 [${userId}]`; - - try { - console.log(`正在为账号 [${userId}] 执行签到...`); - const response = await axios.request(config); - const data = response.data; - - console.log(`账号 [${userId}] 服务器返回:`, JSON.stringify(data)); - - if (data.Status === 1) { - resultMessage += ` ✅ 签到成功: ${data.Message || '操作成功'}`; - } else if (data.Message) { - resultMessage += ` ❕ 操作提示: ${data.Message}`; - } else { - resultMessage += ` ❌ 操作失败: 服务器返回了未知状态。`; - } - - } catch (error) { - console.error(`❌ 账号 [${userId}] 请求发生严重错误:`); - if (error.response) { - console.error(` - 状态码: ${error.response.status}, 返回数据: ${JSON.stringify(error.response.data)}`); - resultMessage += ` ❌ 请求失败: 服务器返回状态码 ${error.response.status}`; - } else if (error.request) { - console.error(' - 网络错误,服务器未响应。'); - resultMessage += ` ❌ 请求失败: 服务器未响应`; - } else { - console.error(' - 请求配置错误:', error.message); - resultMessage += ` ❌ 请求失败: 脚本配置错误`; - } - } - - return resultMessage; +/* 读上次积分,文件不存在就给个默认值 100 */ +function readLastIntegral() { + try { + return Number(fs.readFileSync(INTEGRAL_FILE, 'utf8').trim()); + } catch { + return 100; // 首次运行起点,可自行修改 + } } -// --- 任务入口 --- -(async () => { - let notificationContent = ''; - const taskName = "【维誉链】签到通知"; +/* 把本次积分写盘,下次继续 +1 */ +function saveIntegral(val) { + fs.writeFileSync(INTEGRAL_FILE, String(val)); +} +// ================================= - console.log(`===== 开始执行${taskName} =====`); +// ========== 配置区 ========== +const usersDataEnv = process.env.WYL_USER_IDS; +const users = usersDataEnv ? usersDataEnv.split(/&|\n/).filter(Boolean) : []; +// 不再需要 WYL_INTEGRAL 环境变量 +// ============================= + +// ========== 工具 ========== +const logSeparator = () => console.log('-'.repeat(40)); +// =========================== + +// ========== 签到逻辑 ========== +async function signIn(userData, integral) { + const [userId, openId] = userData.split('#'); + if (!userId || !openId) { + return { + resultMessage: `账号 [${userData}] 格式错误,请使用 "用户ID#openId" 格式。`, + success: false + }; + } + + const url = `https://zjz.114kaili.com:200/webapi/AddUsersIntegral` + + `?business_id=2&users_id=${userId}&remark=%E7%AD%BE%E5%88%B0%E8%B5%A0%E7%A7%AF%E5%88%86&type=1` + + `&integral=${integral}&open_id=${openId}`; + + const headers = { + Host: 'zjz.114kaili.com:200', + 'User-Agent': 'Mozilla/5.0 (Linux; Android 15; Mi 10 Pro Build/AQ3A.240812.002; wv) AppleWebKit/5.0 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220067 MMWEBSDK/20230805 MMWEBID/909 MicroMessenger/8.0.42.29(0x28002A49) WeChat/arm64 Weixin GPVersion/1 Android Tablet NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android', + 'content-type': 'application/x-www-form-urlencoded', + Referer: 'https://servicewechat.com/wx6da7c2450ef6e28f/4/page-frame.html' + }; + + let resultMessage = `账号 [${userId}]`; + let success = false; + + try { + console.log(`正在为账号 [${userId}] 签到,使用积分: ${integral}`); + const { data } = await axios.post(url, '', { headers, timeout: 10000 }); + + console.log(`账号 [${userId}] 返回:`, JSON.stringify(data)); + + if (data.Status === 1) { + resultMessage += ` ✅ 签到成功(积分:${integral}): ${data.Message || '操作成功'}`; + success = true; + } else if (data.Message && data.Message.includes('今天已签到')) { + resultMessage += ` ❕ 操作提示: ${data.Message}`; + success = true; // 认为已签到也算成功,需要把积分 +1 + } else if (data.Message) { + resultMessage += ` ❕ 操作提示: ${data.Message}`; + } else { + resultMessage += ` ❌ 操作失败:服务器返回未知状态`; + } + } catch (e) { + console.error(`❌ 账号 [${userId}] 请求异常:`, e.message); + resultMessage += ` ❌ 请求失败: ${e.message}`; + } + return { resultMessage, success }; +} +// ================================ + +// ========== 入口 ========== +(async () => { + const taskName = '【维誉链】签到通知'; + let notificationContent = ''; + + console.log(`===== 开始执行 ${taskName} =====`); + logSeparator(); + + if (!users.length) { + const err = '错误:未找到任何账号信息!\n请在环境变量里添加 WYL_USER_IDS'; + console.log(err); + notificationContent = err; + } else { + let currentIntegral = readLastIntegral(); + console.log(`共检测到 ${users.length} 个账号`); + console.log(`本次起始积分:${currentIntegral}`); logSeparator(); - if (userIds.length === 0) { - const errorMsg = "错误: 未找到任何用户ID。\n请先在青龙面板【环境变量】中添加名为 WYL_USER_IDS 的变量。"; - console.log(errorMsg); - notificationContent = errorMsg; - } else { - console.log(`共检测到 ${userIds.length} 个账号,即将开始执行...`); - logSeparator(); - - let summary = []; - for (let i = 0; i < userIds.length; i++) { - console.log(`--> 开始执行第 ${i + 1} 个账号`); - const result = await signIn(userIds[i]); - console.log(result); - summary.push(result); - logSeparator(); - } - notificationContent = summary.join('\n'); - console.log("✅ 所有账号任务已执行完毕。"); - } - - // 发送通知 - // 您的旧版 sendNotify 函数需要两个参数: 标题(text) 和 内容(desp) - if (sendNotify) { - try { - console.log("正在发送通知..."); - await sendNotify(taskName, notificationContent); - console.log("通知发送成功!"); - } catch (e) { - console.error("通知发送失败:", e); - } - } else { - console.log("未找到通知函数,请检查 sendNotify.js 文件。"); - } + const summary = []; + let firstSuccess = false; - console.log(`===== ${taskName} 执行结束 =====`); + for (let i = 0; i < users.length; i++) { + console.log(`--> 开始执行第 ${i + 1} 个账号`); + const { resultMessage, success } = await signIn(users[i], currentIntegral); + console.log(resultMessage); + summary.push(resultMessage); + + if (success && !firstSuccess) { + firstSuccess = true; + const newIntegral = currentIntegral + 1; + saveIntegral(newIntegral); + console.log(`已自动把积分更新为 ${newIntegral}(下次使用)`); + } + logSeparator(); + } + notificationContent = summary.join('\n'); + console.log('✅ 所有账号任务已执行完毕'); + } + + if (sendNotify) { + try { + console.log('正在发送通知...'); + await sendNotify(taskName, notificationContent); + console.log('通知发送成功!'); + } catch (e) { + console.error('通知发送失败:', e); + } + } else { + console.log('未找到 sendNotify,跳过通知'); + } + + console.log(`===== ${taskName} 执行结束 =====`); })(); \ No newline at end of file