2021-05-12 19:16:00 +08:00
|
|
|
/*
|
|
|
|
捷径策略切换脚本, 该脚本需与捷径配合使用.
|
|
|
|
|
|
|
|
脚本兼容: Surge4.7, QuanX1.0.22(545+), Loon2.1.10(290+)
|
|
|
|
捷径地址: https://www.icloud.com/shortcuts/0f5b9a825cad47488a78ff2876b822dd
|
|
|
|
|
|
|
|
脚本配置:
|
|
|
|
-----------Surge------------
|
|
|
|
[Script]
|
|
|
|
捷径策略切换 = type=http-request,pattern=^http:\/\/nobyda\.policy,requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js
|
|
|
|
|
|
|
|
--------QuantumuitX---------
|
|
|
|
[rewrite_local]
|
|
|
|
^http:\/\/nobyda\.policy url script-analyze-echo-response https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js
|
|
|
|
|
|
|
|
------------Loon------------
|
|
|
|
[Script]
|
|
|
|
http-request ^http:\/\/nobyda\.policy script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js, requires-body=true, tag=捷径策略切换
|
|
|
|
|
|
|
|
----------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
const $ = new nobyda();
|
|
|
|
const url = $request.url;
|
|
|
|
const body = JSON.parse($request.body || '{}');
|
|
|
|
|
|
|
|
(async function SwitchPoliy() {
|
|
|
|
let res = {};
|
|
|
|
if (/\/getGroup$/.test(url))
|
|
|
|
res.group = await $.getGroup();
|
|
|
|
if (/\/getPolicy$/.test(url))
|
|
|
|
res.policy = await $.getPolicy(body.group);
|
|
|
|
if (/\/setPolicy$/.test(url))
|
|
|
|
res.success = await $.setPolicy(body.group, body.policy);
|
|
|
|
$.done(res);
|
|
|
|
})()
|
|
|
|
|
|
|
|
function nobyda() {
|
2022-11-11 23:32:09 +08:00
|
|
|
const isLoon = typeof($loon) !== "undefined";
|
2021-05-12 19:16:00 +08:00
|
|
|
const isQuanX = typeof($configuration) !== 'undefined';
|
|
|
|
const isSurge = typeof($httpAPI) !== 'undefined';
|
|
|
|
const m = `不支持您的APP版本, 请等待APP更新 ⚠️`;
|
|
|
|
this.getGroup = () => {
|
|
|
|
if (isSurge) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$httpAPI("GET", "v1/policies", {}, (b) => resolve(b['policy-groups']))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if (isLoon) {
|
|
|
|
const getName = JSON.parse($config.getConfig());
|
|
|
|
return getName['all_policy_groups'];
|
|
|
|
}
|
|
|
|
if (isQuanX) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$configuration.sendMessage({
|
|
|
|
action: "get_customized_policy"
|
|
|
|
}).then(b => {
|
|
|
|
if (b.ret) {
|
|
|
|
resolve(Object.keys(b.ret).filter(s => b.ret[s].type == "static"));
|
|
|
|
} else resolve();
|
|
|
|
}, () => resolve());
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
this.getPolicy = (groupName) => {
|
|
|
|
if (isSurge) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$httpAPI("GET", "v1/policy_groups", {}, (b) => {
|
|
|
|
resolve(b[groupName].map(g => g.name))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if (isLoon) {
|
2021-05-16 12:17:01 +08:00
|
|
|
return new Promise((resolve) => {
|
|
|
|
$config.getSubPolicys(groupName, (b) => {
|
|
|
|
const get = JSON.parse(b || '[]').map(n => n.name);
|
|
|
|
resolve(get)
|
|
|
|
})
|
|
|
|
})
|
2021-05-12 19:16:00 +08:00
|
|
|
}
|
|
|
|
if (isQuanX) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$configuration.sendMessage({
|
|
|
|
action: "get_customized_policy",
|
|
|
|
content: groupName
|
|
|
|
}).then(b => {
|
|
|
|
if (b.ret && b.ret[groupName]) {
|
|
|
|
resolve(b.ret[groupName].candidates);
|
|
|
|
} else resolve();
|
|
|
|
}, () => resolve());
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
this.setPolicy = (group, policy) => {
|
|
|
|
if (isSurge) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$httpAPI("POST", "v1/policy_groups/select", {
|
|
|
|
group_name: group,
|
|
|
|
policy: policy
|
|
|
|
}, (b) => resolve(!b.error))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if (isLoon) {
|
|
|
|
const set = $config.setSelectPolicy(group, policy);
|
|
|
|
return set;
|
|
|
|
}
|
|
|
|
if (isQuanX) {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
$configuration.sendMessage({
|
|
|
|
action: "set_policy_state",
|
|
|
|
content: {
|
|
|
|
[group]: policy
|
|
|
|
}
|
|
|
|
}).then((b) => resolve(!b.error), () => resolve());
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
this.done = (body) => {
|
|
|
|
const e = {
|
|
|
|
response: {
|
|
|
|
body: JSON.stringify(body)
|
|
|
|
}
|
|
|
|
};
|
|
|
|
$done(typeof($task) != "undefined" ? e.response : e);
|
|
|
|
}
|
|
|
|
}
|