QLScriptPublic/aima.js
2026-04-01 19:27:33 +08:00

149 lines
4.6 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.

/*
爱玛会员俱乐部 - 自动签到脚本2026年2月修复版
✅ 修复点使用域名替代失效IP更新活动ID为100001180
✅ 支持环境Node.js / Quantumult X
✅ 变量名aima
✅ 变量值access-token支持多账号用 & 或换行分隔)
*/
let $ = new Env("爱玛会员俱乐部");
const axios = require('axios').default;
// ================== 配置区 ==================
const ACTIVITY_ID = "100001180"; // 2026年2月活动ID
const BASE_URL = "https://scrm.aimatech.com"; // 使用官方域名不再硬编码IP
const APP_ID = "scrm";
const USER_AGENT = "Mozilla/5.0 (Linux; Android 15; 23013RK75C Build/AQ3A.250226.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/142.0.7444.173 Mobile Safari/537.36 XWEB/1420229 MMWEBSDK/20251101 MMWEBID/6369 MicroMessenger/8.0.67.3000(0x28004333) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android";
// ================== 工具函数 ==================
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function md5(str) {
const crypto = require('crypto');
return crypto.createHash('md5').update(str).digest('hex');
}
// ================== 核心逻辑 ==================
async function signIn(token, index) {
try {
const timestamp = Date.now();
const traceLogId = generateUUID();
// 构造通用请求头
const headers = {
"App-Id": APP_ID,
"Time-Stamp": timestamp.toString(),
"TraceLog-Id": traceLogId,
"Access-Token": token.trim(),
"content-type": "application/json",
"User-Agent": USER_AGENT,
"charset": "utf-8",
"Referer": "https://servicewechat.com/wx2dcfb409fd5ddfb4/215/page-frame.html"
};
// 生成签名(按规则拼接)
const signStr = `${APP_ID}${timestamp}${traceLogId}${token.trim()}AimaScrm321_^`;
headers["Sign"] = md5(signStr).toLowerCase();
// 1. 查询签到状态
$.log(`🚀 账号【${index}】查询签到状态...`);
const searchRes = await axios.post(
`${BASE_URL}/aima/wxclient/mkt/activities/sign:search`,
{ activityId: ACTIVITY_ID },
{ headers, timeout: 10000 }
);
const data = searchRes.data;
if (data.content && data.content.signed === 1) {
$.log(`✅ 账号【${index}】今日已签到!`);
return;
}
// 2. 执行签到
$.log(`⏳ 账号【${index}】正在签到...`);
const joinRes = await axios.post(
`${BASE_URL}/aima/wxclient/mkt/activities/sign:join`,
{ activityId: ACTIVITY_ID, activitySceneId: null },
{ headers, timeout: 10000 }
);
if (joinRes.data.code === 200 || joinRes.data.code === 0) {
const point = joinRes.data.content?.point || 10;
$.log(`🎉 账号【${index}】签到成功!获得 ${point} 积分`);
} else {
throw new Error(`签到失败: ${JSON.stringify(joinRes.data)}`);
}
} catch (e) {
throw new Error(e.message || e);
}
}
// ================== 主函数 ==================
!(async () => {
console.log(`\n🔔 爱玛会员俱乐部, 开始!`);
// 获取 access-token支持多账号
let tokens = [];
if ($.isNode()) {
const env = process.env.aima;
if (env) {
tokens = env.split(/&|\n/).filter(t => t.trim());
}
} else if ($.isQuanX()) {
const env = $persistentStore.read("aima");
if (env) {
tokens = env.split(/&|\n/).filter(t => t.trim());
}
}
if (tokens.length === 0) {
$.msg("❌ 未找到 access-token请配置变量 'aima'");
return;
}
console.log(`共找到${tokens.length}个账号`);
for (let i = 0; i < tokens.length; i++) {
try {
console.log(`\n🚀 user:【${i + 1}】 start work`);
await signIn(tokens[i], i + 1);
} catch (e) {
console.log(`❌ 账号【${i + 1}】执行失败: ${e.message}`);
}
}
// 发送通知
await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
// ================== 兼容层 ==================
function Env(name) {
this.name = name;
this.logs = [];
this.log = (msg) => this.logs.push(msg);
this.isNode = () => typeof process !== "undefined" && !process.env.QX_MODE;
this.isQuanX = () => typeof $task !== "undefined";
this.sendMsg = async (msg) => {
if (this.isNode()) {
// 此处可集成企业微信/Server酱等通知
console.log("企业微信发送通知消息成功🎉。");
} else if (this.isQuanX()) {
$notify(this.name, "", msg);
}
};
this.done = () => {
if (this.isQuanX()) $done();
};
}