diff --git a/.DS_Store b/.DS_Store index 6c54a75..18afe41 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Scripts/resource-parser.js b/Scripts/resource-parser.js index 41ca00d..d0177d6 100644 --- a/Scripts/resource-parser.js +++ b/Scripts/resource-parser.js @@ -1,5 +1,5 @@ /** -☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-09-06 18:49⟧ +☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-09-07 21:59⟧ ---------------------------------------------------------- 🛠 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot ⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API @@ -69,16 +69,13 @@ /** * 使用说明, -0️⃣ 在QuantumultX 配置文件中[general] 部分,加入 resource_parser_url=https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/resource-parser.js +0️⃣ 在QuantumultX 配置文件中[general] 部分,加入 +resource_parser_url = https://raw.githubusercontent.com/KOP-XIAO/QuantumultX/master/Scripts/resource-parser.js ⚠️⚠️如提示"没有自定义解析器",请长按右下角图标后点击左侧刷新按钮,更新资源,后台退出 app,直到出现解析器说明 1️⃣ 假设原始订阅连接为: https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt , 2️⃣ 假设你想要保留的参数为 in=tls+ss, 想要过滤的参数为 out=http+2, 请注意下面订阅链接后一定要加 ”#“ 符号 3️⃣ 则填入 Quanx 节点引用的的总链接为 https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt#in=tls+ss&out=http+2 4️⃣ 填入上述链接, 并打开的资源解析器开关 - -PS. 隐藏参数 ntf=0/1, 用于关闭/打开资源解析器的提示通知 -⦿ rewrite/filter 资源在有 in/out 参数时会默认开启通知提示, 以防规则误删除 - ------------------------------ */ @@ -145,7 +142,7 @@ var flow = ""; var exptime = ""; var type0 = Type_Check(content0); // 类型判断 -//$notify(type0) +//$notify(type0,"hh",content0) //响应头流量处理部分 function SubFlow() { @@ -289,7 +286,7 @@ function Type_Check(subs) { var SubK = ["dm1lc3M", "c3NyOi8v", "dHJvamFu", "c3M6Ly", "c3NkOi8v", "c2hhZG93"]; var RewriteK = [" url "] var SubK2 = ["ss://", "vmess://", "ssr://", "trojan://", "ssd://", "https://"]; - var ModuleK = ["[Script]", "[Rule]", "[URL Rewrite]", "[Map Local]", "[MITM]"] + var ModuleK = ["[Script]", "[Rule]", "[URL Rewrite]", "[Map Local]", "[MITM]", "\nhttp-r"] var html = "DOCTYPE html" var subi = subs.replace(/ /g, "") const RuleCheck = (item) => subi.toLowerCase().indexOf(item) != -1; @@ -304,7 +301,7 @@ function Type_Check(subs) { content0 = Clash2QX(subs) } else if ( (ModuleK.some(RewriteCheck) || para1.indexOf("dst=rewrite") != -1) && (para1.indexOf("dst=filter") == -1) && subs.indexOf("[Proxy]") == -1) { // Surge 类型 module /rule-set(含url-regex) 类型 type = "sgmodule" - } else if ((subi.indexOf("hostname=") != -1 || RewriteK.some(RewriteCheck)) && subs.indexOf("[Proxy]") == -1 && subs.indexOf("[server_local]") == -1) { + } else if ((subi.indexOf("hostname=") != -1 || RewriteK.some(RewriteCheck)) && subs.indexOf("[Proxy]") == -1 && subs.indexOf("[server_local]") == -1 && subs.indexOf("\nhttp-r") == -1) { type = "rewrite" //Quantumult X 类型 rewrite } else if (RuleK.some(RuleCheck) && subs.indexOf(html) == -1 && subs.indexOf("[Proxy]") == -1 && subs.indexOf("[server_local]") == -1) { type = "Rule"; @@ -377,7 +374,10 @@ function URX2QX(subs) { var nrw = [] var rw = "" subs = subs.split("\n") + var NoteK = ["//", "#", ";"]; //排除注释项 for (var i = 0; i < subs.length; i++) { + const notecheck = (item) => subs[i].indexOf(item) == 0 + if (!NoteK.some(notecheck)) { if (subs[i].slice(0, 9) == "URL-REGEX") { // regex 类型 rw = subs[i].replace(/ /g, "").split(",REJECT")[0].split("GEX,")[1] + " url " + "reject-200" nrw.push(rw) @@ -386,6 +386,7 @@ function URX2QX(subs) { nrw.push(rw) } } + } return nrw } @@ -400,49 +401,54 @@ function SCP2QX(subs) { nrw.push(hn) } var SC = ["type=", ".js", "pattern=", "script-path="] + var NoteK = ["//", "#", ";"]; //排除注释项 const sccheck = (item) => subs[i].indexOf(item) != -1 - if (SC.every(sccheck)) { // surge js 新格式 + const notecheck = (item) => subs[i].indexOf(item) == 0 + if (!NoteK.some(notecheck)){ + if (SC.every(sccheck)) { // surge js 新格式 ptn = subs[i].split("pattern=")[1].split(",")[0] js = subs[i].split("script-path=")[1].split(",")[0] type = subs[i].split("type=")[1].split(",")[0].trim() if (type == "http-response" && subs[i].indexOf("requires-body=1") != -1) { - type = "script-response-body " + type = "script-response-body " } else if (type == "http-response" && subs[i].indexOf("requires-body=1") == -1) { - type = "script-response-header " + type = "script-response-header " } else if (type == "http-request" && subs[i].indexOf("requires-body=1") != -1) { - type = "script-request-body " + type = "script-request-body " } else if (type == "http-request" && subs[i].indexOf("requires-body=1") == -1) { - type = "script-request-header " + type = "script-request-header " } rw = ptn + " url " + type + js nrw.push(rw) - } else if (subs[i].indexOf(" 302") != -1 || subs[i].indexOf(" 307") != -1) { //rewrite 302&307 复写 + } else if (subs[i].indexOf(" 302") != -1 || subs[i].indexOf(" 307") != -1) { //rewrite 302&307 复写 rw = subs[i].split(" ")[0] + " url " + subs[i].split(" ")[2] + " " + subs[i].split(" ")[1] nrw.push(rw) - } else if(subs[i].split(" ")[2] == "header") { // rewrite header 类型 + } else if(subs[i].split(" ")[2] == "header") { // rewrite header 类型 var pget = subs[i].split(" ")[0].split(".com")[1] var pgetn = subs[i].split(" ")[1].split(".com")[1] rw = subs[i].split(" ")[0] + " url request-header ^GET " + pget +"(.+\\r\\n)Host:.+(\\r\\n) request-header GET " + pgetn + "$1Host: " + subs[i].split(" ")[1].split("://")[1].split(".com")[0] + ".com$2" nrw.push(rw) - } else if(subs[i].indexOf(" - reject") != -1) { // rewrite reject 类型 + } else if(subs[i].indexOf(" - reject") != -1) { // rewrite reject 类型 rw = subs[i].split(" ")[0] + " url reject-200" nrw.push(rw) - } else if (subs[i].indexOf("script-path") != -1) { //surge js 旧写法 + } else if (subs[i].indexOf("script-path") != -1) { //surge js 旧写法 type = subs[i].split(" ")[0] js = subs[i].split("script-path")[1].split("=")[1].split(",")[0] ptn = subs[i].split(" ")[1] if (type == "http-response" && subs[i].indexOf("requires-body=1") != -1) { - type = "script-response-body " + type = "script-response-body " } else if (type == "http-response" && subs[i].indexOf("requires-body=1") == -1) { - type = "script-response-header " + type = "script-response-header " } else if (type == "http-request" && subs[i].indexOf("requires-body=1") != -1) { - type = "script-request-body " + type = "script-request-body " } else if (type == "http-request" && subs[i].indexOf("requires-body=1") == -1) { - type = "script-request-header " + type = "script-request-header " } rw = ptn + " url " + type + js nrw.push(rw) + } } + } return nrw } @@ -1451,12 +1457,15 @@ function LoonSSR2QX(cnt) { // fix yaml parse mistakes function YAMLFix(cnt){ if (cnt.indexOf("{") != -1){ - cnt = cnt.replace(/ - /g," - ").replace(/:(?!\s)/g,": ").replace(/\,\"/g,", \"").replace(/: {/g, ": {, ").replace(/, (host|path|tls|mux|skip)/g,", $1") - cnt = cnt.replace(/{name: /g,"{name: \"").replace(/, server:/g,"\", server:") - cnt = cnt.replace(/{|}/g,"").replace(/,/g,"\n ") - } - cnt = cnt.replace(/ -\n.*name/g," - name").replace(/\$|\`/g,"").split("proxy-providers:")[0].split("proxy-groups:")[0].replace(/\"(name|type|server|port|cipher|password|)\"/g,"$1") - return cnt + cnt = cnt.replace(/(^|\n)- /g, "$1 - ").replace(/ - /g," - ").replace(/:(?!\s)/g,": ").replace(/\,\"/g,", \"").replace(/: {/g, ": {, ").replace(/, (host|path|tls|mux|skip)/g,", $1") + //console.log(cnt) + cnt = cnt.replace(/{name: /g,"{name: \"").replace(/, server:/g,"\", server:") + cnt = cnt.replace(/{|}/g,"").replace(/,/g,"\n ") + } + cnt = cnt.replace(/ -\n.*name/g," - name").replace(/\$|\`/g,"").split("proxy-providers:")[0].split("proxy-groups:")[0].replace(/\"(name|type|server|port|cipher|password|)\"/g,"$1") + //console.log(cnt) + cnt = cnt.indexOf("proxies:") == -1? "proxies:\n" + cnt :cnt + return cnt } // Clash parser