Files
writing-agent/tools/st-request-diff/dump-scripts.mjs
T
chenmoranzhi 1a5ef3b2bc 抓包对比工具补一批一次性脚本:拆预设、对请求、跑 A/B 与拒答抽样。
这些脚本都是我对着酒馆真实请求手工核对用的,留在仓库里方便下次重跑;跑出来的本地数据目录含接口 key,已经写进忽略规则。
2026-10-26 01:09:56 +08:00

32 lines
1.4 KiB
JavaScript

// 把预设里带的脚本(酒馆助手 / STscript / JS)挑出来看,判断脚本层要什么 API。
// 用法: node dump-scripts.mjs <preset.json> [每个脚本打印多少字符]
import { readFileSync } from "node:fs";
const preset = JSON.parse(readFileSync(process.argv[2], "utf8"));
const n = Number(process.argv[3] ?? 4000);
function walk(node, pathParts, out) {
if (node == null || typeof node !== "object") return;
if (Array.isArray(node)) {
node.forEach((v, i) => walk(v, [...pathParts, String(i)], out));
return;
}
for (const [k, v] of Object.entries(node)) {
if (typeof v === "string" && /(function|=>|TavernHelper|SillyTavern|jQuery|\$\(|await\s)/.test(v) && v.length > 60 && !/\.png|\.jpg|base64/.test(v.slice(0, 40))) {
out.push({ path: [...pathParts, k].join("."), len: v.length, code: v });
} else if (k === "scripts" || k === "Variables" || k === "variables" || k === "data" || k === "info" || k === "content") {
if (typeof v === "string" && v.length > 60) out.push({ path: [...pathParts, k].join("."), len: v.length, code: v });
else walk(v, [...pathParts, k], out);
} else if (typeof v === "object") {
walk(v, [...pathParts, k], out);
}
}
}
const out = [];
walk(preset, [], out);
console.log("候选脚本/代码块: " + out.length);
for (const item of out) {
console.log("\n=== " + item.path + " (" + item.len + " 字符) ===");
console.log(item.code.slice(0, n));
}