From 8242231df202a53eb478c94832a15cbd214ae1c6 Mon Sep 17 00:00:00 2001 From: Shawn <45581750+KOP-XIAO@users.noreply.github.com> Date: Mon, 4 Jul 2022 22:15:54 +0800 Subject: [PATCH] Create switch-check-ytb-url-cron.js --- Scripts/switch-check-ytb-url-cron.js | 228 +++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 Scripts/switch-check-ytb-url-cron.js diff --git a/Scripts/switch-check-ytb-url-cron.js b/Scripts/switch-check-ytb-url-cron.js new file mode 100644 index 0000000..46c7b92 --- /dev/null +++ b/Scripts/switch-check-ytb-url-cron.js @@ -0,0 +1,228 @@ +/*** + +For Quantumult-X 598+ ONLY!! + +[task_local] + +// UI 查询版本 +event-interaction https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/sswitch-check-ytb.js, tag=YouTube 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true + +// cron task 版本 +0 8 * * * https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/sswitch-check-ytb-url-cron.js#policy=你的策略组, tag=YouTube 切换, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Color/YouTube_Letter.png, enabled=true + +ps. 简单粗暴的 UI-Interaction 版本。无数据持久化、粗暴延迟等待。完美主义建议使用 Helge大佬的boxjs版本 https://t.me/QuanXNews/193 + +@XIAO_KOP + +2022-07-04 + +**/ + +const BASE_URL = 'https://www.youtube.com/premium' + +const link = { "media-url": "https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/img/southpark/7.png" } +var cronsign = $environment.executeType == 0 || $environment.executeType == "0"? "Y" : "N" +var policy = $environment.executeType == 0 || $environment.executeType == "0" ? GetPolicy($environment.sourcePath) : $environment.params + +function GetPolicy(cnt) { + if (cnt && cnt.indexOf("#policy=") !=-1) { + return decodeURI(Componentcnt.split("#policy=")[1].trim()) + }else { + return "" + } +} + +const message = { + action: "get_customized_policy", + content: policy + +}; + +var output=[] +var OKList=[] +var NoList=["不支持节点 ➟ "] +var ErrorList=["检测出错节点 ➟ "] +var pflag=1 //是否是策略,或者简单节点 +var sign=0 + +$configuration.sendMessage(message).then(resolve => { + if (resolve.error) { + console.log(resolve.error); + $done() + } + if (resolve.ret) { + //$notify(JSON.stringify(resolve.ret)) + output=JSON.stringify(resolve.ret[message.content])? JSON.parse(JSON.stringify(resolve.ret[message.content]["candidates"])) : [policy] + pflag = JSON.stringify(resolve.ret[message.content])? pflag:0 + console.log("YouTube Premium 检测") + console.log("节点or策略组:"+pflag) + if (pflag==1) { + console.log("节点数量:"+resolve.ret[policy]["candidates"].length) + if(resolve.ret[policy]["candidates"].length==0) { + $done({"title":"YouTube Premium 检测","htmlMessage":`
😭 无有效节点`});
+ }
+ }
+
+ //$notify(typeof(output),output)
+ Check()
+ //$done({"title":"策略内容","message":output})
+ }
+ //$done();|
+}, reject => {
+ // Normally will never happen.
+ $done();
+});
+
+function Len(cnt) {
+ return cnt.length-1
+}
+
+function Check() {
+ var relay = 2000;
+ for ( var i=0;i < output.length;i++) {
+ testYTB(output[i])
+ }
+ if (output.length<=5) {
+ relay = 2000
+ } else if (output.length<10) {
+ relay =4000
+ } else if (output.length<15) {
+ relay =6000
+ } else if (output.length<20) {
+ relay =8000
+ } else {
+ relay =10000
+ }
+ console.log(output.length+":"+relay)
+ setTimeout(() => {
+ console.log("⛳️ 共计 "+OKList.length+" 个:支持节点 ➟ "+ OKList)
+ console.log("🏠 共计 "+Len(NoList)+" 个:"+NoList)
+ console.log("🕹 共计 "+Len(ErrorList)+" 个:"+ErrorList)
+ sign = 1
+ if (OKList[0] && pflag==1) { //有支持节点、且为策略组才操作
+ console.log("开始排序")
+ ReOrder(OKList)
+ } else if (!OKList[0]){ //不支持
+ content =pflag==0 ? `
😭 该节点不支持 YouTube Premium
👇
-------------------------
⟦ `+policy+` ⟧
-------------------------`: `
` + "
❌ ⟦ "+policy+ " ⟧ ⚠️ 切换失败
该策略组内未找到支持 YouTube Premium 的节点" + "
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`
🎉 该节点支持 YouTube Premium
👇
-------------------------
⟦ `+policy+` ⟧
-------------------------`
+ $done({"title":"YouTube Premium 检测&切换", "htmlMessage": content})
+ }
+ }, relay)
+
+}
+
+//选择最优延迟节点
+function ReOrder(cnt) {
+ const array = cnt;
+ const messageURL = {
+ action: "url_latency_benchmark",
+ content: array
+};
+ $configuration.sendMessage(messageURL).then(resolve => {
+ if (resolve.error) {
+ console.log(resolve.error);
+ }
+ if (resolve.ret) {
+ let output=JSON.stringify(resolve.ret);
+ console.log("节点延迟:"+output);
+ //排序
+ console.log("排序前: "+ array)
+ if(array){
+ try {
+ array.sort(function (a,b) {
+ //console.log(a+" VS "+b)
+ return (resolve.ret[a][1]!=-1 && resolve.ret[b][1] !=-1)? resolve.ret[a][1]-resolve.ret[b][1] : resolve.ret[b][1]
+ })
+ } catch (err) {
+ console.log(err)
+ }
+ }
+ console.log("排序后: "+array)
+ let Ping =resolve.ret[array[0]]
+ const dict = { [policy] : array[0]};
+ if(array[0]) {
+ console.log("选定支持YouTube Premium:"+array[0]+"延迟数据为 👉"+Ping)
+ Ping = " ⚡️ 节点延迟 ➟ 「 "+Ping + " 」 "
+ }
+ const mes1 = {
+ action: "set_policy_state",
+ content: dict
+ };
+ $configuration.sendMessage(mes1).then(resolve => {
+ if (resolve.error) {
+ console.log(resolve.error);
+ content =pflag==0 && array[0]? `
` + "
⟦ "+policy+ " ⟧
🎉 该节点支持 YouTube Premium" + `
` + "
⟦ "+policy+ " ⟧
⚠️ 该节点不支持 YouTube Premium" + `
` + "
❌ ⟦ "+policy+ " ⟧ ⚠️ 切换失败
该策略组内未找到支持 YouTube Premium 的节点" + "
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`
` + "
⟦ "+policy+ " ⟧ 已切换至支持Premium 的路线中延迟最优节点
👇
⟦ "+array[0]+ " ⟧" + "
"+Ping+"
-----------------------------
检测详情请查看JS脚本记录
-----------------------------"+`