mirror of
https://github.com/KOP-XIAO/QuantumultX.git
synced 2026-01-25 21:25:09 +00:00
支持Shadowrocket/quantumult 格式的vmess的uri写法转换
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-06-25 22:59⟧
|
☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-06-28 11:59⟧
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
🚫 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot
|
🚫 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot
|
||||||
⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API
|
⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
🤖 主要功能:
|
🤖 主要功能:
|
||||||
A. 将各格式的服务器订阅解析成 𝐐𝐮𝐚𝐧𝐭𝐮𝐦𝐮𝐥𝐭 𝐗 格式引用
|
A. 将各格式的服务器订阅解析成 𝐐𝐮𝐚𝐧𝐭𝐮𝐦𝐮𝐥𝐭 𝐗 格式引用
|
||||||
✔︎ 支持 V2RayN/SSR/SS/SSD/Trojan/QuanX/Surge/https 订阅
|
✔︎ 支持 Vmess/SS(R/D)/Trojan/QuanX/Surge/http(s) 订阅
|
||||||
✔︎ 提供说明 1⃣️ 中的可选个性化参数(筛选、重命名 等)
|
✔︎ 提供说明 1⃣️ 中的可选个性化参数(筛选、重命名 等)
|
||||||
B. rewrite(重写) /filter(分流) 的转换&筛选
|
B. rewrite(重写) /filter(分流) 的转换&筛选
|
||||||
✔︎ 用于禁用远程引用中某(几)项 rewrite/hostname/filter
|
✔︎ 用于禁用远程引用中某(几)项 rewrite/hostname/filter
|
||||||
@@ -23,19 +23,20 @@ B. rewrite(重写) /filter(分流) 的转换&筛选
|
|||||||
❖ 国行设备请用 emoji=2
|
❖ 国行设备请用 emoji=2
|
||||||
⦿ udp=1, tfo=1, tls13=1, 分别开启 udp-relay/fast-open/tls1.3;
|
⦿ udp=1, tfo=1, tls13=1, 分别开启 udp-relay/fast-open/tls1.3;
|
||||||
⦿ cert=0, 强制"tls-verification=false" 跳过证书验证;
|
⦿ cert=0, 强制"tls-verification=false" 跳过证书验证;
|
||||||
⦿ regex=正则筛选, 请自行折腾正则表达式的写法;
|
|
||||||
⦿ in, out, 分别为 保留/删除 节点, 多参数用 "+" 连接(逻辑"或"), 逻辑"与"用 "." 连接;
|
⦿ in, out, 分别为 保留/删除 节点, 多参数用 "+" 连接(逻辑"或"), 逻辑"与"用 "." 连接;
|
||||||
❖ 可直接用中文, 特殊字符请 urlencode 后使用, 如
|
❖ 支持中文(字母大小写忽略), 特殊字符 urlencode 后使用
|
||||||
∎ "@"☞"%40", "+"☞"%2B", 空格☞"%20", "&"☞"%26"
|
∎ "@"☞"%40", "+"☞"%2B", 空格☞"%20", "&"☞"%26"
|
||||||
❖ 如 "in=香港.IPLC.04+台湾&out=香港%20BGP"
|
❖ 如 "in=香港.IPLC.04+台湾&out=香港%20BGP"
|
||||||
|
⦿ regex=正则筛选(字母大小写忽略), 请自行折腾正则表达式;
|
||||||
|
❖ 可用上面的 in/out 搭配使用,in/out 会优先执行;
|
||||||
⦿ rename 重命名、删除字段, "旧名@新名", "删除字段1.删除字段2☠️", 以及 "前缀@", "@后缀",用 "+" 连接多个参数;
|
⦿ rename 重命名、删除字段, "旧名@新名", "删除字段1.删除字段2☠️", 以及 "前缀@", "@后缀",用 "+" 连接多个参数;
|
||||||
❖ 如 "rename=香港@HK+[SS]@+@[1X]+倍率.流量☠️"
|
❖ 如 "rename=香港@HK+[SS]@+@[1X]+倍率.流量☠️"
|
||||||
❖ 如想删除 ".", 请用"rename=.@點+點☠️" 类似操作
|
❖ 如想删除 ".", 请用"rename=.@點+點☠️" 类似操作
|
||||||
⦿ sort=1, -1, x,排序参数, 分别根据节点名 正序/逆序/随机 排列;
|
⦿ sort=1, -1, x,分别根据节点名 正序/逆序/随机 排序;
|
||||||
|
|
||||||
2⃣️ ⟦rewrite 重写⟧/⟦filter 分流⟧ ➠ 参数说明:
|
2⃣️ ⟦rewrite 重写⟧/⟦filter 分流⟧ ➠ 参数说明:
|
||||||
⦿ in, out, 根据关键词 保留/禁用 相关的规则、重写;
|
⦿ in, out, 根据关键词 保留/禁用 相关的规则、重写;
|
||||||
⦿ inhn, outhn, 根据关键词 保留/删除 相关的主机名(hostname);
|
⦿ inhn, outhn, “保留/删除”主机名(hostname);
|
||||||
⦿ 分流规则另有 "policy=xxx" 参数, 可用于直接指定策略组,或为 Surge 类型 rule-set 生成策略组(默认"Shawn"策略组);
|
⦿ 分流规则另有 "policy=xxx" 参数, 可用于直接指定策略组,或为 Surge 类型 rule-set 生成策略组(默认"Shawn"策略组);
|
||||||
⦿ 示范: 禁用某重写引用中的 "淘宝比价 js" 以及 "weibo 的 js"
|
⦿ 示范: 禁用某重写引用中的 "淘宝比价 js" 以及 "weibo 的 js"
|
||||||
⚠️ ☞ https://myrewrite.list#out=tb_price.js+wb_ad.js
|
⚠️ ☞ https://myrewrite.list#out=tb_price.js+wb_ad.js
|
||||||
@@ -70,7 +71,7 @@ var type0=Type_Check(content0);
|
|||||||
para1=para.slice(para.indexOf("#")+1) //防止参数中其它位置也存在"#"
|
para1=para.slice(para.indexOf("#")+1) //防止参数中其它位置也存在"#"
|
||||||
var Pin0=mark0 && para1.indexOf("in=")!=-1? (para1.split("in=")[1].split("&")[0].split("+")).map(decodeURIComponent):null;
|
var Pin0=mark0 && para1.indexOf("in=")!=-1? (para1.split("in=")[1].split("&")[0].split("+")).map(decodeURIComponent):null;
|
||||||
var Pout0=mark0 && para1.indexOf("out=")!=-1? (para1.split("out=")[1].split("&")[0].split("+")).map(decodeURIComponent):null;
|
var Pout0=mark0 && para1.indexOf("out=")!=-1? (para1.split("out=")[1].split("&")[0].split("+")).map(decodeURIComponent):null;
|
||||||
var Preg=mark0 && para1.indexOf("regex=")!=-1? decodeURIComponent(para1.split("regex=")[1].split("&")[0]):null; //正则过滤参数
|
var Preg=mark0 && para1.indexOf("regex=")!=-1? decodeURIComponent(para1.split("regex=")[1].split("&")[0]):null; //server正则过滤参数
|
||||||
//$notify(link0,"type0",Preg)
|
//$notify(link0,"type0",Preg)
|
||||||
var Phin0=mark0 && para1.indexOf("inhn=")!=-1? (para1.split("inhn=")[1].split("&")[0].split("+")).map(decodeURIComponent):null; //hostname
|
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
|
var Phout0=mark0 && para1.indexOf("outhn=")!=-1? (para1.split("outhn=")[1].split("&")[0].split("+")).map(decodeURIComponent):null; //hostname
|
||||||
@@ -465,8 +466,14 @@ function SubsEd2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
|||||||
var listi=list0[i].replace(/ /g,"")
|
var listi=list0[i].replace(/ /g,"")
|
||||||
const QuanXCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
const QuanXCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
||||||
const SurgeCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
const SurgeCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
||||||
if(type=="vmess"){
|
if(type=="vmess" && list0[i].indexOf("remarks=")==-1){
|
||||||
node= V2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
var bnode=Base64.decode(list0[i].split("vmess://")[1])
|
||||||
|
if(bnode.indexOf("over-tls=")==-1){ //v2rayN
|
||||||
|
node= V2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
||||||
|
}else{ //quantumult 类型
|
||||||
|
node= VQ2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)}
|
||||||
|
}else if(type=="vmess" && list0[i].indexOf("remarks=")!=-1){
|
||||||
|
node= VR2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
||||||
}else if(type=="ssr"){
|
}else if(type=="ssr"){
|
||||||
node= SSR2QX(list0[i],Pudp,Ptfo)
|
node= SSR2QX(list0[i],Pudp,Ptfo)
|
||||||
}else if(type=="ss"){
|
}else if(type=="ss"){
|
||||||
@@ -502,8 +509,14 @@ function Subs2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
|||||||
var listi=list0[i].replace(/ /g,"")
|
var listi=list0[i].replace(/ /g,"")
|
||||||
const QuanXCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
const QuanXCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
||||||
const SurgeCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
const SurgeCheck = (item) => listi.toLowerCase().indexOf(item)!=-1;
|
||||||
if(type=="vmess"){
|
if(type=="vmess" && list0[i].indexOf("remarks=")==-1){
|
||||||
node= V2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
var bnode=Base64.decode(list0[i].split("vmess://")[1])
|
||||||
|
if(bnode.indexOf("over-tls=")==-1){ //v2rayN
|
||||||
|
node= V2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
||||||
|
}else{ //quantumult 类型
|
||||||
|
node= VQ2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)}
|
||||||
|
}else if(type=="vmess" && list0[i].indexOf("remarks=")!=-1){
|
||||||
|
node= VR2QX(list0[i],Pudp,Ptfo,Pcert,Ptls13)
|
||||||
}else if(type=="ssr"){
|
}else if(type=="ssr"){
|
||||||
node= SSR2QX(list0[i],Pudp,Ptfo)
|
node= SSR2QX(list0[i],Pudp,Ptfo)
|
||||||
}else if(type=="ss"){
|
}else if(type=="ss"){
|
||||||
@@ -594,6 +607,65 @@ function HPS2QX(subs,Ptfo,Pcert,Ptls13){
|
|||||||
//$notify("ts","content",QX)
|
//$notify("ts","content",QX)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//quantumult 格式的 vmess URI 转换
|
||||||
|
function VQ2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
||||||
|
var server=String(Base64.decode(subs.replace("vmess://","").trim()).split("\u0000")[0])
|
||||||
|
//console.log(server)
|
||||||
|
var node=""
|
||||||
|
var ip="vmess="+server.split(",")[1].trim()+":"+server.split(",")[2].trim()+", "+"method=aes-128-gcm, "+"password="+server.split(",")[4].split("\"")[1]+", "
|
||||||
|
var tag="tag="+server.split("=")[0]
|
||||||
|
var tfo=subs.indexOf("tfo=1")!=-1? "fast-open=true, ":"fast-open=false, "
|
||||||
|
var udp= Pudp==1? "udp-relay=true, ":"udp-relay=false, ";
|
||||||
|
node=ip+tfo+udp
|
||||||
|
var obfs=""
|
||||||
|
if(server.indexOf("obfs=")==-1){ // 非 ws 类型
|
||||||
|
obfs=server.indexOf("over-tls=true")!=-1? "obfs=over-tls, ":"" //over-tls
|
||||||
|
var host=server.indexOf("tls-host")!=-1? "obfs-host="+server.split("tls-host=")[1].split(",")[0]+", ":""
|
||||||
|
obfs=obfs+host
|
||||||
|
}else if(server.indexOf("obfs=ws")!=-1){
|
||||||
|
obfs=server.indexOf("over-tls=true")!=-1? "obfs=wss, ":"obfs=ws, " //ws,wss 类型
|
||||||
|
var uri=server.indexOf("obfs-path=")!=-1? "obfs-uri="+server.split("obfs-path=")[1].split("\"")[1]+", ":"obfs-uri=/, "
|
||||||
|
obfs=obfs+uri
|
||||||
|
var host=server.indexOf("obfs-header=")!=-1? "obfs-host="+server.split("obfs-header=\"Host:")[1].split("[")[0].trim()+", ":""
|
||||||
|
obfs=obfs+host
|
||||||
|
}
|
||||||
|
if(obfs.indexOf("obfs=over-tls")!=-1||obfs.indexOf("obfs=wss")!=-1 ){
|
||||||
|
var cert= Pcert!=0 || subs.indexOf("allowInsecure=1")!=-1 ? "tls-verification=false, ":"tls-verification=true, "
|
||||||
|
var tls13=Ptls13==1? "tls13=true, ":""
|
||||||
|
obfs=obfs+cert+tls13
|
||||||
|
}
|
||||||
|
node=node+obfs+tag
|
||||||
|
//console.log(node)
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
//Shadowrocket 格式的 vmess URI 转换
|
||||||
|
function VR2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
||||||
|
var server=String(Base64.decode(subs.replace("vmess://","").split("?remarks")[0]).trim()).split("\u0000")[0]
|
||||||
|
var node=""
|
||||||
|
var ip="vmess="+server.split("@")[1]+", "+"method=aes-128-gcm, "+"password="+server.split("@")[0].split(":")[1]+", "
|
||||||
|
var tag="tag="+decodeURIComponent(subs.split("remarks=")[1].split("&")[0])
|
||||||
|
var tfo=subs.indexOf("tfo=1")!=-1? "fast-open=true, ":"fast-open=false, "
|
||||||
|
var udp= Pudp==1? "udp-relay=true, ":"udp-relay=false, ";
|
||||||
|
node=ip+tfo+udp
|
||||||
|
var obfs=subs.split("obfs=")[1].split("&")[0]
|
||||||
|
if(obfs=="none"){ //
|
||||||
|
obfs=subs.indexOf("tls=1")!=-1? "obfs=over-tls, ":"" //over-tls
|
||||||
|
}else if(obfs=="websocket"){
|
||||||
|
obfs=subs.indexOf("tls=1")!=-1? "obfs=wss, ":"obfs=ws," //ws,wss 类型
|
||||||
|
obfs=obfs+"obfs-uri="+subs.split("&path=")[1].split("&")[0]+", "
|
||||||
|
var host=subs.indexOf("&obfsParam=")!=-1? "obfs-host="+subs.split("&obfsParam=")[1].split("&")[0]+", ":""
|
||||||
|
obfs=obfs+host
|
||||||
|
}
|
||||||
|
if(obfs.indexOf("obfs=over-tls")!=-1||obfs.indexOf("obfs=wss")!=-1 ){
|
||||||
|
var cert= Pcert!=0 || subs.indexOf("allowInsecure=1")!=-1 ? "tls-verification=false, ":"tls-verification=true, "
|
||||||
|
var tls13=Ptls13==1? "tls13=true, ":""
|
||||||
|
obfs=obfs+cert+tls13
|
||||||
|
}
|
||||||
|
node=node+obfs+tag
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
//V2RayN uri转换成 QUANX 格式
|
//V2RayN uri转换成 QUANX 格式
|
||||||
function V2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
function V2QX(subs,Pudp,Ptfo,Pcert,Ptls13){
|
||||||
var cert=Pcert
|
var cert=Pcert
|
||||||
@@ -647,7 +719,7 @@ function Pobfs(jsonl,Pcert,Ptls13){
|
|||||||
|
|
||||||
//正则筛选
|
//正则筛选
|
||||||
function Regex(content){
|
function Regex(content){
|
||||||
Preg=RegExp(Preg)
|
Preg=RegExp(Preg,"i")
|
||||||
cnt=content.split("tag=")[1]
|
cnt=content.split("tag=")[1]
|
||||||
if(Preg.test(cnt)){
|
if(Preg.test(cnt)){
|
||||||
return content
|
return content
|
||||||
|
|||||||
Reference in New Issue
Block a user