179 lines
4.4 KiB
JavaScript
179 lines
4.4 KiB
JavaScript
const fs = require("fs");
|
||
const axios = require("axios");
|
||
|
||
const ARRAY_FIELDS = ["sites", "lives", "flags", "parses", "rules", "ads"];
|
||
|
||
// ------------------------------
|
||
// 自动获取 Wex 最新 spider
|
||
// ------------------------------
|
||
async function getWexSpider() {
|
||
try {
|
||
const url = "https://9280.kstore.space/newwex.json";
|
||
const res = await axios.get(url, { timeout: 10000 });
|
||
if (res.data && res.data.spider) {
|
||
console.log("🕷️ 已获取最新 Wex spider:", res.data.spider);
|
||
return res.data.spider;
|
||
}
|
||
} catch (e) {
|
||
console.error("❌ 获取 Wex spider 失败:", e);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
// ------------------------------
|
||
// 自动获取 Fish 最新 spider
|
||
// ------------------------------
|
||
async function getFishSpider() {
|
||
try {
|
||
const url = "https://6800.kstore.vip/fish.json";
|
||
const res = await axios.get(url, { timeout: 10000 });
|
||
|
||
// 兼容服务器返回 JSON 对象或 JSON 字符串
|
||
const data =
|
||
typeof res.data === "string"
|
||
? JSON.parse(res.data)
|
||
: res.data;
|
||
|
||
if (data && data.spider) {
|
||
console.log("🐟 已获取最新 Fish spider:", data.spider);
|
||
return data.spider;
|
||
}
|
||
|
||
console.error("❌ Fish 配置中未找到 spider 字段");
|
||
} catch (e) {
|
||
console.error("❌ 获取 Fish spider 失败:", e.message || e);
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
// ------------------------------
|
||
// 合并数组逻辑(保持原样)
|
||
// ------------------------------
|
||
function mergeArrays(apiArr, editedArr, keyName) {
|
||
if (!Array.isArray(editedArr)) return apiArr;
|
||
|
||
const editedMap = new Map();
|
||
for (const item of editedArr) {
|
||
if (!item || !item[keyName]) continue;
|
||
editedMap.set(item[keyName], item);
|
||
}
|
||
|
||
const result = [];
|
||
|
||
for (const apiItem of apiArr) {
|
||
const k = apiItem[keyName];
|
||
const editedItem = editedMap.get(k);
|
||
|
||
if (!editedItem) {
|
||
result.push(apiItem);
|
||
continue;
|
||
}
|
||
|
||
if (editedItem.delete === true) continue;
|
||
|
||
const { delete: _del, ...pure } = editedItem;
|
||
result.push(pure);
|
||
editedMap.delete(k);
|
||
}
|
||
|
||
for (const [_, item] of editedMap) {
|
||
if (item.delete === true) continue;
|
||
const { delete: _del, ...pure } = item;
|
||
result.push(pure);
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
// ------------------------------
|
||
// 深度合并
|
||
// ------------------------------
|
||
function deepMerge(api, edited) {
|
||
const result = JSON.parse(JSON.stringify(api));
|
||
|
||
for (const key in edited) {
|
||
const value = edited[key];
|
||
|
||
if (ARRAY_FIELDS.includes(key) && Array.isArray(value)) {
|
||
const keyName = key === "sites" ? "key" : "name";
|
||
result[key] = mergeArrays(api[key] || [], value, keyName);
|
||
continue;
|
||
}
|
||
|
||
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
||
result[key] = deepMerge(api[key] || {}, value);
|
||
continue;
|
||
}
|
||
|
||
result[key] = value;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
// ------------------------------
|
||
// 主流程
|
||
// ------------------------------
|
||
(async () => {
|
||
try {
|
||
const api = JSON.parse(fs.readFileSync("天神IY.txt", "utf8"));
|
||
const edited = JSON.parse(fs.readFileSync("edited.json", "utf8"));
|
||
|
||
// 先合并
|
||
const merged = deepMerge(api, edited);
|
||
|
||
// 同时获取最新 Wex 和 Fish spider
|
||
const [wexSpider, fishSpider] = await Promise.all([
|
||
getWexSpider(),
|
||
getFishSpider()
|
||
]);
|
||
|
||
// ------------------------------
|
||
// 为指定站点注入对应 jar/ext
|
||
// ------------------------------
|
||
|
||
if (merged.sites && Array.isArray(merged.sites)) {
|
||
merged.sites = merged.sites.map(site => {
|
||
// 为 csp_SportKaFeiGuard 注入 Wex spider
|
||
if (site.api === "csp_SportKaFeiGuard" && wexSpider) {
|
||
console.log(`✨ 为 ${site.key} 注入最新 Wex spider`);
|
||
|
||
return {
|
||
...site,
|
||
jar: wexSpider,
|
||
ext: "https://9280.kstore.space/newwex.json"
|
||
};
|
||
}
|
||
|
||
// 为 csp_ALLLive 和 csp_FishConfig 注入 Fish spider
|
||
if (
|
||
(site.api === "csp_ALLLive" || site.api === "csp_FishConfig") &&
|
||
fishSpider
|
||
) {
|
||
console.log(`🐟 为 ${site.key}(${site.api})注入最新 Fish spider`);
|
||
|
||
return {
|
||
...site,
|
||
jar: fishSpider,
|
||
ext: "https://6800.kstore.vip/fish.json"
|
||
};
|
||
}
|
||
|
||
return site;
|
||
|
||
});
|
||
}
|
||
|
||
// 写入最终接口
|
||
fs.writeFileSync("iy_merged.json", JSON.stringify(merged, null, 2), "utf8");
|
||
|
||
console.log("🎉 合并完成:已为指定站点注入spider");
|
||
|
||
} catch (e) {
|
||
console.error("❌ 合并失败");
|
||
console.error(e);
|
||
process.exit(1);
|
||
}
|
||
})();
|