diff --git a/Scripts/resource-parser.js b/Scripts/resource-parser.js index 93f1445..6eafc95 100644 --- a/Scripts/resource-parser.js +++ b/Scripts/resource-parser.js @@ -1,5 +1,5 @@ /** -# Quantumult X 资源解析器 (2020-05-22: 19:59 ) +# Quantumult X 资源解析器 (2020-05-23: 10:59 ) 本资源解析器作者: Shawn(请勿私聊问怎么用),有bug请反馈: @Shawn_KOP_bot 更新请关注tg频道: https://t.me/QuanX_API @@ -8,8 +8,9 @@ 附加功能: rewrite(重写) /filter(分流) 过滤, 可用于解决无法单独禁用远程引用中某(几)条 rewrite/hostname/filter, 以及直接导入 Surge 类型规则 list 的问题 -0️⃣ 请在“订阅链接”后加入 "#" 后再加参数, 不同参数间请使用 "&" 来连接, 如: +0️⃣ 请在"订阅链接"后加入 "#" 后再加参数, 不同参数间请使用 "&" 来连接, 如: "https://mysub.com#in=香港+台湾&emoji=1&tfo=1" +(如是本地资源引用,请将参数"#in=xxx"填入资源文件第一行) 1️⃣ "节点" 订阅--参数说明: - in, out, 分别为 保留/排除, 多参数用 "+" 连接(逻辑"或"), 逻辑"与"请用"."连接,可直接用中文, 空格用"%20"代替 (如 "in=香港.IPLC.04+台湾&out=香港%20BGP" ); @@ -38,30 +39,32 @@ https://Advertising.list#policy=MineGroup&out=aweme, tag=🚦去广告,update- 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, 请注意下面订阅链接后一定要加 ”#“ 符号 +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️⃣ 填入上述链接, 并打开的资源解析器开关 ------------------------------ ⚠️⚠️ 由于 rewrite/filter 的 UI 中暂时没有提供解析器开关,想使用的请自行去配置文件中的相关行,添加参数"opt-parser=true"以开启,如: https://Advertising.list#policy=Shawn&out=aweme, tag=🚦去广告,update-interval=86400, opt-parser=true, enabled=true */ - +//$notify("test",$resource.link) var content0=$resource.content; -var para=decodeURIComponent($resource.link); +var link0=$resource.link; +var para=(link0.indexOf("http")!=-1 && link0.indexOf("://")!=-1)?decodeURIComponent(link0):content0.split("\n")[0]; +var mark0=para.indexOf("#")!=-1? true:false; var type0=Type_Check(content0); -var Pin0=para.indexOf("in=")!=-1? para.split("#")[1].split("in=")[1].split("&")[0].split("+"):null; -var Pout0=para.indexOf("out=")!=-1? para.split("#")[1].split("out=")[1].split("&")[0].split("+"):null; -var Pemoji=para.indexOf("emoji=")!=-1? para.split("#")[1].split("emoji=")[1].split("&")[0].split("+"):null; -var Pudp0=para.indexOf("udp=")!=-1? para.split("#")[1].split("udp=")[1].split("&")[0].split("+"):0; -var Ptfo0=para.indexOf("tfo=")!=-1? para.split("#")[1].split("tfo=")[1].split("&")[0].split("+"):0; -var Pinfo=para.indexOf("info=")!=-1? para.split("#")[1].split("info=")[1].split("&")[0].split("+"):0; -var Prname=para.indexOf("rename=")!=-1? para.split("#")[1].split("rename=")[1].split("&")[0].split("+"):null; -var Ppolicy=para.indexOf("policy=")!=-1? para.split("#")[1].split("policy=")[1].split("&")[0].split("+"):"Shawn"; -var Pcert0=para.indexOf("cert=")!=-1? para.split("#")[1].split("cert=")[1].split("&")[0].split("+"):1; -var Psort0=para.indexOf("sort=")!=-1? para.split("#")[1].split("sort=")[1].split("&")[0].split("+"):0; -var PTls13=para.indexOf("tls13=")!=-1? para.split("#")[1].split("tls13=")[1].split("&")[0].split("+"):0; -var Pntf0= para.indexOf("ntf=")!=-1? para.split("#")[1].split("ntf=")[1].split("&")[0].split("+"):0; -//$notify(type0) +var Pin0=mark0 && para.indexOf("in=")!=-1? para.split("#")[1].split("in=")[1].split("&")[0].split("+"):null; +var Pout0=mark0 && para.indexOf("out=")!=-1? para.split("#")[1].split("out=")[1].split("&")[0].split("+"):null; +var Pemoji=mark0 && para.indexOf("emoji=")!=-1? para.split("#")[1].split("emoji=")[1].split("&")[0].split("+"):null; +var Pudp0=mark0 && para.indexOf("udp=")!=-1? para.split("#")[1].split("udp=")[1].split("&")[0].split("+"):0; +var Ptfo0=mark0 && para.indexOf("tfo=")!=-1? para.split("#")[1].split("tfo=")[1].split("&")[0].split("+"):0; +var Pinfo=mark0 && para.indexOf("info=")!=-1? para.split("#")[1].split("info=")[1].split("&")[0].split("+"):0; +var Prname=mark0 && para.indexOf("rename=")!=-1? para.split("#")[1].split("rename=")[1].split("&")[0].split("+"):null; +var Ppolicy=mark0 && para.indexOf("policy=")!=-1? para.split("#")[1].split("policy=")[1].split("&")[0].split("+"):"Shawn"; +var Pcert0=mark0 && para.indexOf("cert=")!=-1? para.split("#")[1].split("cert=")[1].split("&")[0].split("+"):1; +var Psort0=mark0 && para.indexOf("sort=")!=-1? para.split("#")[1].split("sort=")[1].split("&")[0].split("+"):0; +var PTls13=mark0 && para.indexOf("tls13=")!=-1? para.split("#")[1].split("tls13=")[1].split("&")[0].split("+"):0; +var Pntf0= mark0 && para.indexOf("ntf=")!=-1? para.split("#")[1].split("ntf=")[1].split("&")[0].split("+"):0; +//$notify(type0,"tt",content0) //响应头流量处理部分 var subinfo=$resource.info; @@ -105,14 +108,14 @@ if(type0=="Subs-B64Encode"){ total=content0.split("\n"); total=Rule_Handle(total,Pout0); }else if(content0.trim()==""){ - $notify("‼️链接內容为空","⁉️请自行检查原始链接以及过滤参数",para); + $notify("‼️链接返回內容为空","⁉️请自行复制原始链接到浏览器, 确认链接是否失效",para.split("#")[0]); flag=0; $done({content : ""}) -}else { +}else if(type0=="unknown"){ $notify("😭 太难写了", "👻 本解析器 暂未支持/未能识别 该订阅格式", "☠️ 已尝试直接导入Quantumult X"); $done({content : content0}); flag=-1; -} +}else { flag=0 } if(flag==3){ $done({content : total.join("\n")}); @@ -151,12 +154,13 @@ if(flag==3){ //判断订阅类型 function Type_Check(subs){ - var type="" + var type="unknown" var RuleK=["host","domain","ip-cidr","geoip","user-agent","ip6-cidr"]; var QuanXK=["shadowsocks=","trojan=","vmess=","http="]; var SurgeK=["=ss","=vmess","=trojan","=http","=custom"]; var SubK=["dm1lc3M6Ly","c3NyOi8v","dHJvamFu","c3M6Ly"]; var SubK2=["ss://","vmess://","ssr://","trojan://"]; + var html="" var subi=subs.replace(/ /g,"") const RuleCheck = (item) => subs.toLowerCase().indexOf(item)!=-1; const QuanXCheck = (item) => subi.toLowerCase().indexOf(item)!=-1; @@ -175,8 +179,11 @@ function Type_Check(subs){ type="Surge" } else if(subs.indexOf("hostname")!=-1){ type="rewrite" - } else if(RuleK.some(RuleCheck)){ + } else if(RuleK.some(RuleCheck) && subs.indexOf(html)==-1){ type="Rule"; + } else if(subs.indexOf(html)!=-1){ + $notify("‼️链接返回内容有误","⁉️请自行复制原始链接到浏览器, 确认链接是否失效",para.split("#")[0]); + type="web" } return type } @@ -313,7 +320,8 @@ function SubsEd2QX(subs,Pudp,Ptfo,Pcert,Ptls13){ node = Surge2QX(list0[i]) } //$notify("Final","results",node) - QXlist.push(node) + if(node!=""){ + QXlist.push(node)} } } return QXlist @@ -345,8 +353,10 @@ function Subs2QX(subs,Pudp,Ptfo,Pcert,Ptls13){ }else if(SurgeK.some(SurgeCheck)){ node = Surge2QX(list0[i]) } - QXlist.push(node) + if(node!=""){ + QXlist.push(node)} } + //$notify("final", "list", QXlist) return QXlist } @@ -360,11 +370,11 @@ function TagCheck_QX(content){ var nm=item.split("tag")[1].split("=")[1].trim() // get tag if(nm==""){ nm=" ["+item.split("=")[0]+"] "+item.split("=")[1].split(",")[0].split(":")[0] - $notify("⚠️ 订阅内出现空节点名:", "✅ 已自动将节点“类型+IP”作为节点名","✅ "+nm) + $notify("⚠️ 订阅内出现空节点名:", "✅ 已自动将节点"类型+IP"作为节点名","✅ "+nm) item=item.split("tag")[0]+"tag="+nm } while(nmlist.indexOf(nm)!=-1){ - $notify("⚠️ 订阅内出现重复节点名:", "⚠️ "+ nm, "✅ 已自动添加“”符号作为区分:"+nm+"") + $notify("⚠️ 订阅内出现重复节点名:", "⚠️ "+ nm, "✅ 已自动添加""符号作为区分:"+nm+"") nm=nm+"" item=item.split("tag")[0]+"tag="+nm }