更新 js/nfsq.js

This commit is contained in:
chickliu 2025-12-08 18:21:20 +08:00
parent d67699b899
commit 08c38b61fa

View File

@ -141,51 +141,39 @@ async function handleRewrite() {
let bodyObj = {};
try { bodyObj = JSON.parse(bodyStr); } catch (e) { }
// 构建标准账号对象
// 构建标准账号对象 (严格对齐用户提供的标准示例)
const newAccount = {
uid: uid,
token: token,
body: bodyObj,
headers_json: headers,
timestamp: new Date().getTime(),
remark: `自动抓包 ${new Date().toLocaleString()}`
headers_json: headers
};
// 3. 读取现有账号列表
let accounts = [];
// 3. 本地存储逻辑 (BoxJs 仍然保持本地全量备份)
let localAccounts = [];
const cachedData = $.getdata(ENV_NAME);
if (cachedData) {
try {
// 兼容可能被存为 JSON 字符串的情况
const parsed = JSON.parse(cachedData);
accounts = Array.isArray(parsed) ? parsed : [parsed];
} catch (e) {
// 如果解析失败,说明格式不对,覆盖即可
accounts = [];
}
localAccounts = Array.isArray(parsed) ? parsed : [parsed];
} catch (e) { localAccounts = []; }
}
// 4. 更新或添加账号
const idx = accounts.findIndex(u => u.uid === uid);
const idx = localAccounts.findIndex(u => u.uid === uid);
if (idx > -1) {
accounts[idx] = newAccount; // 更新
$.log(`♻️ 更新旧账号: ${uid}`);
localAccounts[idx] = newAccount; // 更新
} else {
accounts.push(newAccount); // 新增
$.log(`🆕 添加新账号: ${uid}`);
localAccounts.push(newAccount); // 新增
}
// 5. 保存到本地
const saved = $.setdata(JSON.stringify(accounts, null, 2), ENV_NAME);
const saved = $.setdata(JSON.stringify(localAccounts, null, 2), ENV_NAME);
if (saved) {
$.msg(SCRIPT_NAME, `✅ 账号抓取成功`, `当前共 ${accounts.length} 个账号`);
} else {
$.msg(SCRIPT_NAME, `❌ 保存失败`, `BoxJs/本地存储 写入失败`);
$.msg(SCRIPT_NAME, `✅ 账号抓取成功`, `UID: ${uid.slice(0, 6)}... 已保存到本地`);
}
// 6. 推送到青龙 (如果有配置)
// 4. 推送到青龙 (智能合并模式)
if (QL_CONFIG.URL && QL_CONFIG.CLIENT_ID && QL_CONFIG.CLIENT_SECRET) {
await pushToQingLong(accounts);
await pushToQingLong(newAccount);
} else {
$.log("⚠️ 未配置青龙信息,跳过推送。(请在脚本 QL_CONFIG 中填写,或手动复制 BoxJs 数据)");
}
@ -363,17 +351,17 @@ async function checkAllPrizes(token, uid, userAgent) {
// ================= 青龙推送相关 =================
async function pushToQingLong(accounts) {
$.log("📤 正在推送到青龙面板...");
async function pushToQingLong(accountToPush) {
$.log(`📤 正在尝试处理青龙推送 (UID: ${accountToPush.uid.slice(0, 6)}...)`);
const { URL, CLIENT_ID, CLIENT_SECRET } = QL_CONFIG;
// 1. 获取 Token
const tokenUrl = `${URL}/open/auth/token?client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}`;
try {
// 1. 获取 Token
const tokenUrl = `${URL}/open/auth/token?client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}`;
const tReq = await $.http.get({ url: tokenUrl });
const tBody = JSON.parse(tReq.body);
if (tBody.code !== 200) {
$.msg(SCRIPT_NAME, "青龙推送失败", "获取 Token 失败,请检查 Client ID/Secret");
$.msg(SCRIPT_NAME, "青龙推送失败", "获取 Token 失败,请检查密钥");
return;
}
const qlToken = tBody.data.token;
@ -385,33 +373,66 @@ async function pushToQingLong(accounts) {
headers: { 'Authorization': `Bearer ${qlToken}` }
});
const eBody = JSON.parse(eReq.body);
const exists = eBody.data && eBody.data.length > 0;
const newValue = JSON.stringify(accounts);
// 3. 准备数据:读取现有 -> 合并
let remoteList = [];
let existingEnv = null;
if (exists) {
// 更新
const envId = eBody.data[0].id;
if (eBody.data && eBody.data.length > 0) {
existingEnv = eBody.data[0];
try {
// 尝试解析现有的值为 JSON 数组
// 注意:青龙里可能存的是字符串,也可能已经是 JSON
let rawValue = existingEnv.value;
// 有时候青龙返回的 value 是被转义过的字符串,尝试解析
let parsedValue = JSON.parse(rawValue);
if (Array.isArray(parsedValue)) {
remoteList = parsedValue;
} else {
// 如果不是数组,可能是单个对象,或者其他格式,清空
remoteList = [];
}
} catch (e) {
console.log(" ⚠️ 解析青龙现有变量失败,将覆盖为新列表");
remoteList = [];
}
}
// 4. 执行合并逻辑
const targetIdx = remoteList.findIndex(u => u.uid === accountToPush.uid);
let action = "";
if (targetIdx > -1) {
remoteList[targetIdx] = accountToPush;
action = "更新";
} else {
remoteList.push(accountToPush);
action = "新增";
}
const newValue = JSON.stringify(remoteList); // 保持紧凑格式,或者用 JSON.stringify(remoteList, null, 2) 美化
// 5. 推送回青龙
if (existingEnv) {
// update
const updateUrl = `${URL}/open/envs`;
const uReq = await $.http.put({
await $.http.put({
url: updateUrl,
headers: {
'Authorization': `Bearer ${qlToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: envId,
id: existingEnv.id,
name: ENV_NAME,
value: newValue,
remarks: "自动抓包更新: " + new Date().toLocaleString()
remarks: existingEnv.remarks || (`自动抓包更新: ${new Date().toLocaleString()}`)
})
});
$.log(" ✅ 已更新青龙环境变量");
$.msg(SCRIPT_NAME, "推送成功", "已更新青龙环境变量 " + ENV_NAME);
$.msg(SCRIPT_NAME, `✅ 推送成功 [${action}]`, `UID: ${accountToPush.uid.slice(0, 6)}... 已同步至青龙`);
} else {
// 新建
// create
const addUrl = `${URL}/open/envs`;
const aReq = await $.http.post({
await $.http.post({
url: addUrl,
headers: {
'Authorization': `Bearer ${qlToken}`,
@ -423,8 +444,7 @@ async function pushToQingLong(accounts) {
remarks: "自动抓包创建"
}])
});
$.log(" ✅ 已新建青龙环境变量");
$.msg(SCRIPT_NAME, "推送成功", "已新建青龙环境变量 " + ENV_NAME);
$.msg(SCRIPT_NAME, `✅ 推送成功 [新建]`, `UID: ${accountToPush.uid.slice(0, 6)}... 已创建青龙变量`);
}
} catch (e) {