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