bug fixed

This commit is contained in:
Shawn
2020-09-07 21:50:49 +08:00
parent c737f56d69
commit 4daa23b293
2 changed files with 37 additions and 28 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -1,5 +1,5 @@
/** /**
☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-09-06 18:49⟧ ☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-09-07 21:59⟧
---------------------------------------------------------- ----------------------------------------------------------
🛠 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot 🛠 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot
⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API ⛳️ 关注 🆃🅶 相关频道: 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直到出现解析器说明 ⚠️⚠️如提示"没有自定义解析器",请长按右下角图标后点击左侧刷新按钮,更新资源,后台退出 app直到出现解析器说明
1⃣ 假设原始订阅连接为: https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt , 1⃣ 假设原始订阅连接为: https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt ,
2⃣ 假设你想要保留的参数为 in=tls+ss, 想要过滤的参数为 out=http+2, 请注意下面订阅链接后一定要加 ”#“ 符号 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 3⃣ 则填入 Quanx 节点引用的的总链接为 https://raw.githubusercontent.com/crossutility/Quantumult-X/master/server-complete.txt#in=tls+ss&out=http+2
4⃣ 填入上述链接, 并打开的资源解析器开关 4⃣ 填入上述链接, 并打开的资源解析器开关
PS. 隐藏参数 ntf=0/1, 用于关闭/打开资源解析器的提示通知
⦿ rewrite/filter 资源在有 in/out 参数时会默认开启通知提示, 以防规则误删除
------------------------------ ------------------------------
*/ */
@@ -145,7 +142,7 @@ var flow = "";
var exptime = ""; var exptime = "";
var type0 = Type_Check(content0); // 类型判断 var type0 = Type_Check(content0); // 类型判断
//$notify(type0) //$notify(type0,"hh",content0)
//响应头流量处理部分 //响应头流量处理部分
function SubFlow() { function SubFlow() {
@@ -289,7 +286,7 @@ function Type_Check(subs) {
var SubK = ["dm1lc3M", "c3NyOi8v", "dHJvamFu", "c3M6Ly", "c3NkOi8v", "c2hhZG93"]; var SubK = ["dm1lc3M", "c3NyOi8v", "dHJvamFu", "c3M6Ly", "c3NkOi8v", "c2hhZG93"];
var RewriteK = [" url "] var RewriteK = [" url "]
var SubK2 = ["ss://", "vmess://", "ssr://", "trojan://", "ssd://", "https://"]; 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 html = "DOCTYPE html"
var subi = subs.replace(/ /g, "") var subi = subs.replace(/ /g, "")
const RuleCheck = (item) => subi.toLowerCase().indexOf(item) != -1; const RuleCheck = (item) => subi.toLowerCase().indexOf(item) != -1;
@@ -304,7 +301,7 @@ function Type_Check(subs) {
content0 = Clash2QX(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) 类型 } 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" 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 type = "rewrite" //Quantumult X 类型 rewrite
} else if (RuleK.some(RuleCheck) && subs.indexOf(html) == -1 && subs.indexOf("[Proxy]") == -1 && subs.indexOf("[server_local]") == -1) { } else if (RuleK.some(RuleCheck) && subs.indexOf(html) == -1 && subs.indexOf("[Proxy]") == -1 && subs.indexOf("[server_local]") == -1) {
type = "Rule"; type = "Rule";
@@ -377,7 +374,10 @@ function URX2QX(subs) {
var nrw = [] var nrw = []
var rw = "" var rw = ""
subs = subs.split("\n") subs = subs.split("\n")
var NoteK = ["//", "#", ";"]; //排除注释项
for (var i = 0; i < subs.length; i++) { 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 类型 if (subs[i].slice(0, 9) == "URL-REGEX") { // regex 类型
rw = subs[i].replace(/ /g, "").split(",REJECT")[0].split("GEX,")[1] + " url " + "reject-200" rw = subs[i].replace(/ /g, "").split(",REJECT")[0].split("GEX,")[1] + " url " + "reject-200"
nrw.push(rw) nrw.push(rw)
@@ -386,6 +386,7 @@ function URX2QX(subs) {
nrw.push(rw) nrw.push(rw)
} }
} }
}
return nrw return nrw
} }
@@ -400,49 +401,54 @@ function SCP2QX(subs) {
nrw.push(hn) nrw.push(hn)
} }
var SC = ["type=", ".js", "pattern=", "script-path="] var SC = ["type=", ".js", "pattern=", "script-path="]
var NoteK = ["//", "#", ";"]; //排除注释项
const sccheck = (item) => subs[i].indexOf(item) != -1 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] ptn = subs[i].split("pattern=")[1].split(",")[0]
js = subs[i].split("script-path=")[1].split(",")[0] js = subs[i].split("script-path=")[1].split(",")[0]
type = subs[i].split("type=")[1].split(",")[0].trim() type = subs[i].split("type=")[1].split(",")[0].trim()
if (type == "http-response" && subs[i].indexOf("requires-body=1") != -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) { } 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) { } 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) { } 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 rw = ptn + " url " + type + js
nrw.push(rw) 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] rw = subs[i].split(" ")[0] + " url " + subs[i].split(" ")[2] + " " + subs[i].split(" ")[1]
nrw.push(rw) 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 pget = subs[i].split(" ")[0].split(".com")[1]
var pgetn = subs[i].split(" ")[1].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" 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) 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" rw = subs[i].split(" ")[0] + " url reject-200"
nrw.push(rw) 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] type = subs[i].split(" ")[0]
js = subs[i].split("script-path")[1].split("=")[1].split(",")[0] js = subs[i].split("script-path")[1].split("=")[1].split(",")[0]
ptn = subs[i].split(" ")[1] ptn = subs[i].split(" ")[1]
if (type == "http-response" && subs[i].indexOf("requires-body=1") != -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) { } 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) { } 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) { } 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 rw = ptn + " url " + type + js
nrw.push(rw) nrw.push(rw)
}
} }
} }
return nrw return nrw
} }
@@ -1451,12 +1457,15 @@ function LoonSSR2QX(cnt) {
// fix yaml parse mistakes // fix yaml parse mistakes
function YAMLFix(cnt){ function YAMLFix(cnt){
if (cnt.indexOf("{") != -1){ 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(/(^|\n)- /g, "$1 - ").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:") //console.log(cnt)
cnt = cnt.replace(/{|}/g,"").replace(/,/g,"\n ") 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.*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 // Clash parser