This commit is contained in:
Shawn
2020-08-24 10:16:03 +08:00
parent 9772708c9a
commit af93f8ec54

View File

@@ -1,5 +1,5 @@
/** /**
☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-08-23 23:39 ☑️ 资源解析器 ©𝐒𝐡𝐚𝐰𝐧 ⟦2020-08-24 10:30
---------------------------------------------------------- ----------------------------------------------------------
🛠 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot 🛠 发现 𝐁𝐔𝐆 请反馈: @Shawn_KOP_bot
⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API ⛳️ 关注 🆃🅶 相关频道: https://t.me/QuanX_API
@@ -22,7 +22,7 @@
⦿ 𝗲𝗺𝗼𝗷𝗶=1(国行设备用2)/-1, 添加/删除节点名内地区旗帜; ⦿ 𝗲𝗺𝗼𝗷𝗶=1(国行设备用2)/-1, 添加/删除节点名内地区旗帜;
⦿ 𝘂𝗱𝗽=1/-1, 𝘁𝗳𝗼=1/-1, 分别强制开启(关闭) 𝐮𝐝𝐩-𝐫𝐞𝐥𝐚𝐲/𝐟𝐚𝐬𝐭-𝐨𝐩𝐞𝐧; ⦿ 𝘂𝗱𝗽=1/-1, 𝘁𝗳𝗼=1/-1, 分别强制开启(关闭) 𝐮𝐝𝐩-𝐫𝐞𝐥𝐚𝐲/𝐟𝐚𝐬𝐭-𝐨𝐩𝐞𝐧;
⦿ 𝘁𝗹𝘀13=1, 开启 𝐭𝐥𝐬1.3, 请自行确认服务端是否已开启; ⦿ 𝘁𝗹𝘀13=1, 开启 𝐭𝐥𝐬1.3, 请自行确认服务端是否已开启;
⦿ 𝗰𝗲𝗿𝘁=0, 强制"𝐭𝐥𝐬-𝐯𝐞𝐫𝐢𝐟𝐢𝐜𝐚𝐭𝐢𝐨𝐧=𝐟𝐚𝐥𝐬𝐞" 跳过证书验证; ⦿ 𝗰𝗲𝗿𝘁=1, "𝐭𝐥𝐬-𝐯𝐞𝐫𝐢𝐟𝐢𝐜𝐚𝐭𝐢𝐨𝐧=𝐭𝐫𝐮𝐞" 开启证书验证(默认关闭);
⦿ 𝗶𝗻, 𝗼𝘂𝘁, 分别为 保留、删除 节点; ⦿ 𝗶𝗻, 𝗼𝘂𝘁, 分别为 保留、删除 节点;
❖ 多参数(逻辑"或")用 "+", 逻辑"与"用 "." 表示; ❖ 多参数(逻辑"或")用 "+", 逻辑"与"用 "." 表示;
❖ 支持中文, 操作以下特殊字符时请先替换 ❖ 支持中文, 操作以下特殊字符时请先替换
@@ -874,7 +874,7 @@ function V2QX(subs, Pudp, Ptfo, Pcert, Ptls13) {
obfs = Pobfs(ss, cert, tls13); obfs = Pobfs(ss, cert, tls13);
if (obfs == "" || obfs == undefined) { if (obfs == "" || obfs == undefined) {
nss.push(ip, mtd, pwd, tfo, udp, tag) nss.push(ip, mtd, pwd, tfo, udp, tag)
} else { } else if(obfs != "NOT-SUPPORTTED"){
nss.push(ip, mtd, pwd, obfs, tfo, udp, tag); nss.push(ip, mtd, pwd, obfs, tfo, udp, tag);
} }
QX = nss.join(", "); QX = nss.join(", ");
@@ -900,12 +900,14 @@ function Pobfs(jsonl, Pcert, Ptls13) {
host0 = jsonl.host && jsonl.host != "" ? "obfs-host=" + jsonl.host + "," : ""; host0 = jsonl.host && jsonl.host != "" ? "obfs-host=" + jsonl.host + "," : "";
obfsi.push(obfs0, host0 + uri0); obfsi.push(obfs0, host0 + uri0);
return obfsi.join(", ") return obfsi.join(", ")
} else if (jsonl.tls == "tls") { } else if (jsonl.tls == "tls" && !jsonl.net) { // 过滤掉 h2/http 等类型
obfs0 = "obfs=over-tls, " + tcert + ", " + tls13; obfs0 = "obfs=over-tls, " + tcert + ", " + tls13;
uri0 = jsonl.path && jsonl.path != "" ? "obfs-uri=" + jsonl.path : ""; uri0 = jsonl.path && jsonl.path != "" ? "obfs-uri=" + jsonl.path : "";
host0 = jsonl.host && jsonl.host != "" ? ", obfs-host=" + jsonl.host : ""; host0 = jsonl.host && jsonl.host != "" ? ", obfs-host=" + jsonl.host : "";
obfsi.push(obfs0 + host0) obfsi.push(obfs0 + host0)
return obfsi.join(", ") return obfsi.join(", ")
} else if(jsonl.net){ // 过滤掉 h2/http 等类型
return "NOT-SUPPORTTED"
} }
} }
@@ -1371,117 +1373,117 @@ function SVmess2QX(content) {
// 用于过滤非节点部分(比如整份配置中其它内容) // 用于过滤非节点部分(比如整份配置中其它内容)
function isSurge(content) { function isSurge(content) {
if (content.indexOf("=") != -1) { if (content.indexOf("=") != -1) {
cnt = content.split("=")[1].split(",")[0].trim() cnt = content.split("=")[1].split(",")[0].trim()
if (cnt == "http" || cnt == "ss" || cnt == "trojan" || cnt == "vmess" || cnt == "custom") { if (cnt == "http" || cnt == "ss" || cnt == "trojan" || cnt == "vmess" || cnt == "custom") {
return content return content
}
} }
}
} }
// 用于参数检查 // 用于参数检查
function paraCheck(content, para) { function paraCheck(content, para) {
content=content.replace(/ /g,"") content=content.replace(/ /g,"")
if (content.indexOf(para+"=") == -1) { if (content.indexOf(para+"=") == -1) {
return "false" return "false"
} else { } else {
//console.log(para) //console.log(para)
return content.split(para+"=")[1].split(",")[0].trim() return content.split(para+"=")[1].split(",")[0].trim()
} }
} }
//surge中 trojan 类型转换 //surge中 trojan 类型转换
function Strojan2QX(content) { function Strojan2QX(content) {
var cnt = content; var cnt = content;
var tag = "tag=" + cnt.split("=")[0].trim(); var tag = "tag=" + cnt.split("=")[0].trim();
var ipport = cnt.split(",")[1].trim() + ":" + cnt.split(",")[2].trim(); var ipport = cnt.split(",")[1].trim() + ":" + cnt.split(",")[2].trim();
var pwd = "password=" + cnt.split("password")[1].split(",")[0].split("=")[1].trim(); var pwd = "password=" + cnt.split("password")[1].split(",")[0].split("=")[1].trim();
var ptls = "over-tls=true"; var ptls = "over-tls=true";
var ptfo = paraCheck(cnt, "tfo") == "true" ? "fast-open=true" : "fast-open=false"; var ptfo = paraCheck(cnt, "tfo") == "true" ? "fast-open=true" : "fast-open=false";
var pverify = paraCheck(cnt, "skip-cert-verify") == "true" ? "tls-verification=false" : "tls-verification=true"; var pverify = paraCheck(cnt, "skip-cert-verify") == "true" ? "tls-verification=false" : "tls-verification=true";
var ptls13 = paraCheck(cnt, "tls13") == "true" ? "tls13=true" : "tls13=false"; var ptls13 = paraCheck(cnt, "tls13") == "true" ? "tls13=true" : "tls13=false";
var nserver = "trojan= " + [ipport, pwd, ptls, ptfo, ptls13, pverify, tag].join(", "); var nserver = "trojan= " + [ipport, pwd, ptls, ptfo, ptls13, pverify, tag].join(", ");
return nserver return nserver
} }
// surge 中的 http 类型 // surge 中的 http 类型
function Shttp2QX(content) { function Shttp2QX(content) {
var cnt = content; var cnt = content;
var tag = "tag=" + cnt.split("=")[0].trim(); var tag = "tag=" + cnt.split("=")[0].trim();
var ipport = cnt.split(",")[1].trim() + ":" + cnt.split(",")[2].trim(); var ipport = cnt.split(",")[1].trim() + ":" + cnt.split(",")[2].trim();
var puname = cnt.indexOf("username") != -1 ? "username=" + cnt.split("username")[1].split(",")[0].split("=")[1].trim() : ""; var puname = cnt.indexOf("username") != -1 ? "username=" + cnt.split("username")[1].split(",")[0].split("=")[1].trim() : "";
var pwd = cnt.indexOf("password") != -1 ? "password=" + cnt.split("password")[1].split(",")[0].split("=")[1].trim() : ""; var pwd = cnt.indexOf("password") != -1 ? "password=" + cnt.split("password")[1].split(",")[0].split("=")[1].trim() : "";
var ptls = cnt.split("=")[1].split(",")[0].trim() == "https" ? "over-tls=true" : "over-tls=false"; var ptls = cnt.split("=")[1].split(",")[0].trim() == "https" ? "over-tls=true" : "over-tls=false";
var ptfo = paraCheck(cnt, "tfo") == "true" ? "fast-open=true" : "fast-open=false"; var ptfo = paraCheck(cnt, "tfo") == "true" ? "fast-open=true" : "fast-open=false";
if (ptls == "over-tls=true") { if (ptls == "over-tls=true") {
var pverify = paraCheck(cnt, "skip-cert-verify") == "true" ? "tls-verification=false" : "tls-verification=true"; var pverify = paraCheck(cnt, "skip-cert-verify") == "true" ? "tls-verification=false" : "tls-verification=true";
var ptls13 = paraCheck(cnt, "tls13") == "true" ? "tls13=true" : "tls13=false"; var ptls13 = paraCheck(cnt, "tls13") == "true" ? "tls13=true" : "tls13=false";
ptls = ptls + ", " + pverify + ", " + ptls13 ptls = ptls + ", " + pverify + ", " + ptls13
} }
var nserver = puname != "" ? "http= " + [ipport, puname, pwd, ptls, ptfo, tag].join(", ") : "http= " + [ipport, ptls, ptfo, tag].join(", "); var nserver = puname != "" ? "http= " + [ipport, puname, pwd, ptls, ptfo, tag].join(", ") : "http= " + [ipport, ptls, ptfo, tag].join(", ");
return nserver return nserver
} }
function Loon2QX(cnt) { function Loon2QX(cnt) {
var type = cnt.split("=")[1].split(",")[0].trim() var type = cnt.split("=")[1].split(",")[0].trim()
var node = "" var node = ""
if (type == "Shadowsocks") { //ss 类型 if (type == "Shadowsocks") { //ss 类型
node = LoonSS2QX(cnt) node = LoonSS2QX(cnt)
} else if (type == "ShadowsocksR") { //ssr 类型 } else if (type == "ShadowsocksR") { //ssr 类型
node = LoonSSR2QX(cnt) node = LoonSSR2QX(cnt)
} }
return node return node
} }
//Loon 的 ss 部分 //Loon 的 ss 部分
function LoonSS2QX(cnt) { function LoonSS2QX(cnt) {
var node = "shadowsocks=" var node = "shadowsocks="
var ip = [cnt.split(",")[1].trim(), cnt.split(",")[2].trim()].join(":") var ip = [cnt.split(",")[1].trim(), cnt.split(",")[2].trim()].join(":")
var mtd = "method=" + cnt.split(",")[3].trim() var mtd = "method=" + cnt.split(",")[3].trim()
var pwd = "password=" + cnt.split(",")[4].trim().split("\"")[1] var pwd = "password=" + cnt.split(",")[4].trim().split("\"")[1]
var obfs = cnt.split(",").length == 7 ? ", " + ["obfs=" + cnt.split(",")[5].trim(), "obfs-host=" + cnt.split(",")[6].trim()].join(",") : "" var obfs = cnt.split(",").length == 7 ? ", " + ["obfs=" + cnt.split(",")[5].trim(), "obfs-host=" + cnt.split(",")[6].trim()].join(",") : ""
var tag = ", tag=" + cnt.split("=")[0].trim() var tag = ", tag=" + cnt.split("=")[0].trim()
node = node + [ip, mtd, pwd].join(", ") + obfs + tag node = node + [ip, mtd, pwd].join(", ") + obfs + tag
return node return node
} }
//Loon 的 ssr 部分 //Loon 的 ssr 部分
//# SSR 格式:名称=协议类型,地址,端口,加密方式,密码,协议类型,{协议参数},混淆类型,{混淆参数} //# SSR 格式:名称=协议类型,地址,端口,加密方式,密码,协议类型,{协议参数},混淆类型,{混淆参数}
//3 = ShadowsocksR, 1.2.3.4, 443, aes-256-cfb,"password",auth_aes128_md5,{},tls1.2_ticket_auth,{} //3 = ShadowsocksR, 1.2.3.4, 443, aes-256-cfb,"password",auth_aes128_md5,{},tls1.2_ticket_auth,{}
function LoonSSR2QX(cnt) { function LoonSSR2QX(cnt) {
var node = "shadowsocks=" var node = "shadowsocks="
var ip = [cnt.split(",")[1].trim(), cnt.split(",")[2].trim()].join(":") var ip = [cnt.split(",")[1].trim(), cnt.split(",")[2].trim()].join(":")
var mtd = "method=" + cnt.split(",")[3].trim() var mtd = "method=" + cnt.split(",")[3].trim()
var pwd = "password=" + cnt.split(",")[4].trim().split("\"")[1] var pwd = "password=" + cnt.split(",")[4].trim().split("\"")[1]
var ssrp = "ssr-protocol=" + cnt.split(",")[5].trim() var ssrp = "ssr-protocol=" + cnt.split(",")[5].trim()
var ssrpara = "ssr-protocol-param=" + cnt.split(",")[6].replace(/\{|\}/g, "").trim() var ssrpara = "ssr-protocol-param=" + cnt.split(",")[6].replace(/\{|\}/g, "").trim()
var obfs = "obfs=" + cnt.split(",")[7].trim() var obfs = "obfs=" + cnt.split(",")[7].trim()
var obfshost = "obfs-host=" + cnt.split(",")[8].replace(/\{|\}/g, "").trim() var obfshost = "obfs-host=" + cnt.split(",")[8].replace(/\{|\}/g, "").trim()
var tag = ", tag=" + cnt.split("=")[0].trim() var tag = ", tag=" + cnt.split("=")[0].trim()
node = node + [ip, mtd, pwd, ssrp, ssrpara, obfs, obfshost].join(", ") + tag node = node + [ip, mtd, pwd, ssrp, ssrpara, obfs, obfshost].join(", ") + tag
return node return node
} }
// Clash parser // Clash parser
function Clash2QX(cnt) { function Clash2QX(cnt) {
const yaml = new YAML() const yaml = new YAML()
var aa = JSON.stringify(yaml.parse(cnt)) var aa = JSON.stringify(yaml.parse(cnt))
var bb = JSON.parse(aa).proxies var bb = JSON.parse(aa).proxies
console.log(bb) console.log(bb)
var nl = bb.length var nl = bb.length
var nodelist=[] var nodelist=[]
var node="" var node=""
for (i=0; i<nl; i++){ for (i=0; i<nl; i++){
node=bb[i] node=bb[i]
typec = node.type typec = node.type
if (typec == "ss") { if (typec == "ss") {
node = CSS2QX(node) node = CSS2QX(node)
} else if (typec == "vmess"){ } else if (typec == "vmess"){
node = CV2QX(node) node = CV2QX(node)
} else if (typec == "trojan"){ } else if (typec == "trojan"){
node = CT2QX(node) node = CT2QX(node)
} else if (typec == "http"){ } else if (typec == "http"){
node = CH2QX(node) node = CH2QX(node)
}
nodelist.push(node)
} }
return nodelist.join("\n") nodelist.push(node)
}
return nodelist.join("\n")
} }
//Clash ss type server //Clash ss type server