diff --git a/.DS_Store b/.DS_Store index 83883fb..752232e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Scripts/resource-parser.js b/Scripts/resource-parser.js index 5182085..ee8fbc1 100644 --- a/Scripts/resource-parser.js +++ b/Scripts/resource-parser.js @@ -1,5 +1,5 @@ /** -☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2021-09-08 17:45⟧ +☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2021-09-10 20:45⟧ ---------------------------------------------------------- 🛠 发现 𝐁𝐔𝐆 请反馈: @ShawnKOP_bot ⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API @@ -7,7 +7,7 @@ 🤖 主要功能: ❶ 将其它格式的⟦服务器订阅⟧解析成 𝐐𝐮𝐚𝐧𝐭𝐮𝐦𝐮𝐥𝐭 𝐗 格式 -☑︎ 支持 𝗩𝗺𝗲𝘀𝘀/𝗦𝗦(𝗥/𝗗)/𝗛𝗧𝗧𝗣(𝗦)/𝗧𝗿𝗼𝗷𝗮𝗻/𝗤𝘂𝗮𝗻𝘁𝘂𝗺𝘂𝗹𝘁(𝗫)/𝗦𝘂𝗿𝗴𝗲/𝐂𝐥𝐚𝐬𝐡/𝐒𝐡𝐚𝐝𝐨𝐰𝐫𝐨𝐜𝐤𝐞𝐭/𝐋𝐨𝐨𝐧 格式 +☑︎ 支持 𝐕2𝐫𝐚𝐲𝐍/𝗦𝗦(𝗥/𝗗)/𝗛𝗧𝗧𝗣(𝗦)/𝗧𝗿𝗼𝗷𝗮𝗻/𝗤𝘂𝗮𝗻𝘁𝘂𝗺𝘂𝗹𝘁(𝗫)/𝗦𝘂𝗿𝗴𝗲/𝐂𝐥𝐚𝐬𝐡/𝐒𝐡𝐚𝐝𝐨𝐰𝐫𝐨𝐜𝐤𝐞𝐭/𝐋𝐨𝐨𝐧 格式 ☑︎ 提供说明 1⃣️ 中的可选个性化参数(筛选、重命名 等) ❷ 𝗿𝗲𝘄𝗿𝗶𝘁𝗲(重写) & 𝗳𝗶𝗹𝘁𝗲𝗿(分流) 的 转换 & 筛选 ☑︎ 用于禁用/修改远程引用中某(几)项 𝗿𝗲𝘄𝗿𝗶𝘁𝗲/𝗵𝗼𝘀𝘁𝗻𝗮𝗺𝗲/𝗳𝗶𝗹𝘁𝗲𝗿 @@ -24,9 +24,9 @@ ⦿ emoji=1(国行设备用2)/-1, 添加/删除节点名内地区旗帜; ⦿ udp=1/-1, tfo=1/-1, 分别强制开启(关闭) 𝐮𝐝𝐩-𝐫𝐞𝐥𝐚𝐲/𝐟𝐚𝐬𝐭-𝐨𝐩𝐞𝐧; ⦿ tls13=1, cert=1, 分别开启 𝐭𝐥𝐬1.3 及 𝐭𝐥𝐬 证书验证(默认关闭); -⦿ in, out, regex 分别为 保留、删除、正则筛选 节点; +⦿ in, out, regex, regexout 分别为 保留、删除、正则保留、正则删除 节点; ❖ in, out 中多参数(逻辑"或")用 "+", 逻辑"与"用 "." 表示; - ❖ in/out/regex 均对节点的完整信息进行匹配(类型、端口、加密等); + ❖ in/out/regex/regout 均对节点的完整信息进行匹配(类型、端口、加密等); ❖ 示范: "in=香港.0\.2倍率+台湾&out=香港%20BGP®ex=(?i)iplc" ⦿ rename 重命名, "旧名@新名", "前缀@", "@后缀", 用 "+" 连接多个参数; ❖ 删除字段: "字段1.字段2☠️", 想删除 "." 时用 "\." 替代 @@ -62,7 +62,7 @@ ⦿ inhn, outhn, “保留/删除”主机名(𝒉𝒐𝒔𝒕𝒏𝒂𝒎𝒆); ❖ 示范: 禁用 "淘宝比价" 及 "weibo" 的 js 同主机名 𝐡𝐭𝐭𝐩𝐬://𝐦𝐲𝐥𝐢𝐬𝐭#𝒐𝒖𝒕=tb_price.js+wb_ad.js&outhn=weibo -⦿ regex, 正则筛选, 请自行折腾正则表达式; +⦿ regex/regout, 正则保留/删除, 请自行折腾正则表达式; ❖ 可与 in(hn)/out(hn) 一起使用,in(hn)/out(hn) 会优先执行; ❖ 对 𝒉𝒐𝒔𝒕𝒏𝒂𝒎𝒆 & 𝐫𝐞𝐰𝐫𝐢𝐭𝐞/𝐟𝐢𝐥𝐭𝐞𝐫 同时生效(⚠️ 慎用) ⦿ policy 参数, 用于直接指定策略组,或为 𝐒𝐮𝐫𝐠𝐞 类型 𝗿𝘂𝗹𝗲-𝘀𝗲𝘁 生成策略组(默认"𝐒𝐡𝐚𝐰𝐧"策略组); @@ -134,6 +134,7 @@ var Pin0 = mark0 && para1.indexOf("in=") != -1 ? (para1.split("in=")[1].split("& var Pout0 = mark0 && para1.indexOf("out=") != -1 ? (para1.split("out=")[1].split("&")[0].split("+")).map(decodeURIComponent) : null; var Psfilter = mark0 && para1.indexOf("sfilter=") != -1 ? Base64.decode(para1.split("sfilter=")[1].split("&")[0]) : null; // script filter var Preg = mark0 && para1.indexOf("regex=") != -1 ? decodeURIComponent(para1.split("regex=")[1].split("&")[0]).replace(/\,/g,",") : null; //server正则过滤参数 +var Pregout = mark0 && para1.indexOf("regout=") != -1 ? decodeURIComponent(para1.split("regout=")[1].split("&")[0]).replace(/\,/g,",") : null; //server正则删除参数 var Pregdel = mark0 && para1.indexOf("delreg=") != -1 ? decodeURIComponent(para1.split("delreg=")[1].split("&")[0]).replace(/\,/g,",") : null; // 正则删除参数 var Phin0 = mark0 && para1.indexOf("inhn=") != -1 ? (para1.split("inhn=")[1].split("&")[0].split("+")).map(decodeURIComponent) : null; //hostname var Phout0 = mark0 && para1.indexOf("outhn=") != -1 ? (para1.split("outhn=")[1].split("&")[0].split("+")).map(decodeURIComponent) : null; //hostname @@ -249,13 +250,13 @@ function ResourceParse() { } else if (type0 == "sgmodule") { // surge module 模块/含 url-regex 的 rule-set flag = 2 total = SGMD2QX(content0) // 转换 - total = Rewrite_Filter(total, Pin0, Pout0,Preg); // 筛选过滤 + total = Rewrite_Filter(total, Pin0, Pout0,Preg,Pregout); // 筛选过滤 if (Preplace) { total = ReplaceReg(total, Preplace) } if (Pcdn) {total = CDN(total) } else { total = total.join("\n")} } else if (type0 == "rewrite") { // rewrite 类型 flag = 2; - total = Rewrite_Filter(isQuanXRewrite(content0.split("\n")), Pin0, Pout0,Preg); + total = Rewrite_Filter(isQuanXRewrite(content0.split("\n")), Pin0, Pout0,Preg,Pregout); if (Preplace) { total = ReplaceReg(total, Preplace) } if (Pcdn) {total = CDN(total) } else {total = total.join("\n")} @@ -264,6 +265,7 @@ function ResourceParse() { total = Rule_Handle(content0.split("\n"), Pout0, Pin0).filter(Boolean); if (Preg && total.length!=0) { // 正则筛选规则 filter total = total.map(Regex).filter(Boolean) + total = total.map(RegexOut).filter(Boolean) RegCheck(total, "分流引用", Preg)} if (Preplace) { total = ReplaceReg(total, Preplace) } if (Ppolicyset) {total = policy_sets(total, Ppolicyset)} @@ -285,6 +287,8 @@ function ResourceParse() { if (Pin0 || Pout0) { total = Filter(total, Pin0, Pout0) } // in & out if (Preg) { total = total.map(Regex).filter(Boolean) // regex RegCheck(total, "节点订阅", Preg)} + if (Pregout) { total = total.map(RegexOut).filter(Boolean) // regex + RegCheck(total, "节点订阅", Preg)} if (Psfilter) { total = FilterScript(total, Psfilter) } if (Prrname) { Prn = Prrname; @@ -783,7 +787,7 @@ function SGMD2QX(subs) { } //Rewrite过滤,使用+连接多个关键词(逻辑"或"):in 为保留,out 为排除 -function Rewrite_Filter(subs, Pin, Pout,Preg) { +function Rewrite_Filter(subs, Pin, Pout,Preg,Pregout) { var Nlist = []; var noteK = ["//", "#", ";"]; var hnc = 0; @@ -797,7 +801,7 @@ function Rewrite_Filter(subs, Pin, Pout,Preg) { if (noteK.some(notecheck)) { // 注释项跳过 continue; } else if (hnc == 0 && subii.indexOf("hostname=") == 0) { //hostname 部分 - hostname = (Phin0 || Phout0 || Preg) ? HostNamecheck(subi, Phin0, Phout0) : subi;//hostname 部分 + hostname = (Phin0 || Phout0 || Preg || Pregout) ? HostNamecheck(subi, Phin0, Phout0) : subi;//hostname 部分 } else if (subii.indexOf("hostname=") != 0) { //rewrite 部分 var inflag = Rcheck(subi, Pin); var outflag = Rcheck(subi, Pout); @@ -823,6 +827,8 @@ function Rewrite_Filter(subs, Pin, Pout,Preg) { if (Nlist.length == 0) { $notify("🤖 " + "重写引用 ➟ " + "⟦" + subtag + "⟧", "⛔️ 筛选参数: " + pfi + pfo, "⚠️ 筛选后剩余rewrite规则数为 0️⃣ 条, 请检查参数及原始链接", nan_link) } if(Preg){ Nlist = Nlist.map(Regex).filter(Boolean) // regex to filter rewrites RegCheck(Nlist, "重写引用", Preg) } + if(Pregout){ Nlist = Nlist.map(RegexOut).filter(Boolean) // regex to delete rewrites + RegCheck(Nlist, "重写引用", Preg) } if (hostname != "") { Nlist.push(hostname) } Nlist =Phide ==1? Nlist : [...dwrite,...Nlist] return Nlist @@ -1363,6 +1369,15 @@ function Regex(content) { } } +//正则删除, 完整内容匹配 +function RegexOut(content) { + var Preg0 = RegExp(Pregout, "i") + cnt = content //.split("tag=")[1] + if (!Preg0.test(cnt)) { + return content + } +} + // 判断节点过滤的函数 function Scheck(content, param) { name = content.split("tag=")[1].toUpperCase()