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