mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-08-10 04:49:03 +08:00
Add support for Loon UDP relay (SS/SSR/Trojan)
This commit is contained in:
parent
265a88fc5f
commit
093102e791
@ -773,7 +773,7 @@ function service() {
|
||||
}
|
||||
|
||||
async function refreshCache(req, res) {
|
||||
const { url, ua } = req.body;
|
||||
const {url, ua} = req.body;
|
||||
$.info(`Refreshing cache for URL: ${url}`);
|
||||
try {
|
||||
const raw = await getResource(url, false, ua);
|
||||
@ -824,7 +824,7 @@ function service() {
|
||||
settings.syncTime = new Date().getTime();
|
||||
$.write(settings, SETTINGS_KEY);
|
||||
content = $.read("#sub-store");
|
||||
if($.env.isNode) content = JSON.stringify($.cache,null,` `)
|
||||
if ($.env.isNode) content = JSON.stringify($.cache, null, ` `)
|
||||
$.info(`上传备份中...`);
|
||||
await gist.upload({filename: GIST_BACKUP_FILE_NAME, content});
|
||||
break;
|
||||
@ -833,10 +833,10 @@ function service() {
|
||||
content = await gist.download(GIST_BACKUP_FILE_NAME);
|
||||
// restore settings
|
||||
$.write(content, "#sub-store");
|
||||
if($.env.isNode){
|
||||
if ($.env.isNode) {
|
||||
content = JSON.parse(content)
|
||||
Object.keys(content).forEach(key=>{
|
||||
$.write(content[key],key)
|
||||
Object.keys(content).forEach(key => {
|
||||
$.write(content[key], key)
|
||||
})
|
||||
}
|
||||
break;
|
||||
@ -883,7 +883,7 @@ function service() {
|
||||
if (typeof userAgent == "undefined" || userAgent == null || userAgent.trim().length == 0) {
|
||||
ua = "Quantumult%20X"
|
||||
}
|
||||
|
||||
|
||||
const $http = HTTP({
|
||||
headers: {
|
||||
"User-Agent": ua,
|
||||
@ -1373,7 +1373,7 @@ var ProxyUtils = (function () {
|
||||
const [server, port] = line.split("@")[1].split("?")[0].split(":");
|
||||
const name = decodeURIComponent(line.split("#")[1].trim());
|
||||
let paramArr = line.split("?")
|
||||
let sni=null
|
||||
let sni = null
|
||||
if (paramArr.length > 1) {
|
||||
paramArr = paramArr[1].split("#")[0].split("&")
|
||||
const params = new Map(paramArr.map((item) => {
|
||||
@ -2294,67 +2294,67 @@ var ProxyUtils = (function () {
|
||||
function getFlag(name) {
|
||||
// flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js
|
||||
const flags = {
|
||||
"🇦🇿":["阿塞拜疆"],
|
||||
"🇦🇿": ["阿塞拜疆"],
|
||||
"🇦🇹": ["奥地利", "奧地利", "Austria", "维也纳"],
|
||||
"🇦🇺": ["AU", "Australia", "Sydney", "澳大利亚", "澳洲", "墨尔本", "悉尼" ,"土澳", "京澳","廣澳","滬澳","沪澳","广澳"],
|
||||
"🇧🇪": ["BE", "比利時","比利时"],
|
||||
"🇧🇬": ["保加利亚", "保加利亞","Bulgaria"],
|
||||
"🇵🇰":["巴基斯坦"],
|
||||
"🇰🇭":["柬埔寨"],
|
||||
"🇺🇦":["烏克蘭","乌克兰"],
|
||||
"🇭🇷":["克罗地亚","HR","克羅地亞"],
|
||||
"🇨🇦": ["Canada","CANADA", "CAN", "Waterloo", "加拿大", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多"],
|
||||
"🇨🇭": ["瑞士", "苏黎世", "Switzerland"],
|
||||
"🇦🇺": ["AU", "Australia", "Sydney", "澳大利亚", "澳洲", "墨尔本", "悉尼", "土澳", "京澳", "廣澳", "滬澳", "沪澳", "广澳"],
|
||||
"🇧🇪": ["BE", "比利時", "比利时"],
|
||||
"🇧🇬": ["保加利亚", "保加利亞", "Bulgaria"],
|
||||
"🇵🇰": ["巴基斯坦"],
|
||||
"🇰🇭": ["柬埔寨"],
|
||||
"🇺🇦": ["烏克蘭", "乌克兰"],
|
||||
"🇭🇷": ["克罗地亚", "HR", "克羅地亞"],
|
||||
"🇨🇦": ["Canada", "CANADA", "CAN", "Waterloo", "加拿大", "蒙特利尔", "温哥华", "楓葉", "枫叶", "滑铁卢", "多伦多"],
|
||||
"🇨🇭": ["瑞士", "苏黎世", "Switzerland"],
|
||||
"🇳🇬": ["尼日利亚", "NG", "尼日利亞"],
|
||||
"🇨🇿": ["Czechia", "捷克"],
|
||||
"🇸🇰":["斯洛伐克", "SK"],
|
||||
"🇷🇸":["RS", "塞尔维亚"],
|
||||
"🇲🇩":["摩爾多瓦","MD","摩尔多瓦"],
|
||||
"🇩🇪": ["DE", "German", "GERMAN", "德国", "德國", "法兰克福","京德","滬德","廣德","沪德","广德"],
|
||||
"🇩🇰": ["DK","DNK","丹麦","丹麥"],
|
||||
"🇪🇸": ["ES", "西班牙", "Spain"],
|
||||
"🇪🇺": ["EU", "欧盟", "欧罗巴"],
|
||||
"🇫🇮": ["Finland", "芬兰","芬蘭","赫尔辛基"],
|
||||
"🇫🇷": ["FR", "France", "法国", "法國", "巴黎"],
|
||||
"🇬🇧": ["UK", "GB", "England", "United Kingdom", "英国", "伦敦", "英"],
|
||||
"🇲🇴": ["MO", "Macao", "澳门", "澳門", "CTM"],
|
||||
"🇰🇿": ["哈萨克斯坦", "哈萨克"],
|
||||
"🇭🇺": ["匈牙利", "Hungary"],
|
||||
"🇭🇰": ["HK", "Hongkong", "Hong Kong", "HongKong", "HONG KONG","香港", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"],
|
||||
"🇮🇩": ["Indonesia", "印尼", "印度尼西亚", "雅加达"],
|
||||
"🇮🇪": ["Ireland", "IRELAND", "爱尔兰", "愛爾蘭", "都柏林"],
|
||||
"🇮🇱": ["Israel", "以色列"],
|
||||
"🇮🇳": ["India", "IND", "INDIA","印度", "孟买", "Mumbai"],
|
||||
"🇮🇸":["IS","ISL", "冰岛","冰島"],
|
||||
"🇰🇵": ["KP", "朝鲜"],
|
||||
"🇰🇷": ["KR", "Korea", "KOR", "韩国", "首尔", "韩", "韓","春川"],
|
||||
"🇱🇺": ["卢森堡"],
|
||||
"🇱🇻": ["Latvia", "Latvija", "拉脱维亚"],
|
||||
"🇲🇽️": ["MEX", "MX", "墨西哥"],
|
||||
"🇲🇾": ["MY", "Malaysia","MALAYSIA", "马来西亚", "大馬", "馬來西亞", "吉隆坡"],
|
||||
"🇳🇱": ["NL", "Netherlands", "荷兰", "荷蘭", "尼德蘭", "阿姆斯特丹"],
|
||||
"🇵🇭": ["PH", "Philippines", "菲律宾", "菲律賓"],
|
||||
"🇷🇴": ["RO", "罗马尼亚"],
|
||||
"🇷🇺": ["RU", "Russia", "俄罗斯", "俄国", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄","廣俄","滬俄","广俄","沪俄"],
|
||||
"🇸🇦": ["沙特", "迪拜"],
|
||||
"🇸🇪": ["SE", "Sweden"],
|
||||
"🇸🇬": ["SG", "Singapore","SINGAPORE", "新加坡", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新","廣新","滬新"],
|
||||
"🇹🇭": ["TH", "Thailand", "泰国", "泰國", "曼谷"],
|
||||
"🇹🇷": ["TR", "Turkey", "土耳其", "伊斯坦布尔"],
|
||||
"🇹🇼": ["TW", "Taiwan","TAIWAN", "台湾", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET"],
|
||||
"🇺🇸": ["US", "USA", "America", "United States", "美国", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约"],
|
||||
"🇻🇳": ["VN", "越南", "胡志明市"],
|
||||
"🇮🇹": ["Italy", "IT", "Nachash", "意大利", "米兰", "義大利"],
|
||||
"🇿🇦": ["South Africa", "南非"],
|
||||
"🇦🇪": ["United Arab Emirates", "阿联酋"],
|
||||
"🇧🇷": ["BR", "Brazil", "巴西", "圣保罗"],
|
||||
"🇯🇵": ["JP", "Japan","JAPAN", "日本", "东京", "大阪", "埼玉", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日"],
|
||||
"🇦🇷": ["AR", "阿根廷"],
|
||||
"🇳🇴": ["Norway", "挪威", "NO"],
|
||||
"🇨🇳": ["CN", "China", "回国", "中国","中國", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"],
|
||||
"🇵🇱": ["PL", "POL", "波兰","波蘭"],
|
||||
"🇨🇱": ["智利"],"🇳🇿":["新西蘭","新西兰"],
|
||||
"🇬🇷": ["希腊","希臘"],
|
||||
"🇸🇰": ["斯洛伐克", "SK"],
|
||||
"🇷🇸": ["RS", "塞尔维亚"],
|
||||
"🇲🇩": ["摩爾多瓦", "MD", "摩尔多瓦"],
|
||||
"🇩🇪": ["DE", "German", "GERMAN", "德国", "德國", "法兰克福", "京德", "滬德", "廣德", "沪德", "广德"],
|
||||
"🇩🇰": ["DK", "DNK", "丹麦", "丹麥"],
|
||||
"🇪🇸": ["ES", "西班牙", "Spain"],
|
||||
"🇪🇺": ["EU", "欧盟", "欧罗巴"],
|
||||
"🇫🇮": ["Finland", "芬兰", "芬蘭", "赫尔辛基"],
|
||||
"🇫🇷": ["FR", "France", "法国", "法國", "巴黎"],
|
||||
"🇬🇧": ["UK", "GB", "England", "United Kingdom", "英国", "伦敦", "英"],
|
||||
"🇲🇴": ["MO", "Macao", "澳门", "澳門", "CTM"],
|
||||
"🇰🇿": ["哈萨克斯坦", "哈萨克"],
|
||||
"🇭🇺": ["匈牙利", "Hungary"],
|
||||
"🇭🇰": ["HK", "Hongkong", "Hong Kong", "HongKong", "HONG KONG", "香港", "深港", "沪港", "呼港", "HKT", "HKBN", "HGC", "WTT", "CMI", "穗港", "京港", "港"],
|
||||
"🇮🇩": ["Indonesia", "印尼", "印度尼西亚", "雅加达"],
|
||||
"🇮🇪": ["Ireland", "IRELAND", "爱尔兰", "愛爾蘭", "都柏林"],
|
||||
"🇮🇱": ["Israel", "以色列"],
|
||||
"🇮🇳": ["India", "IND", "INDIA", "印度", "孟买", "Mumbai"],
|
||||
"🇮🇸": ["IS", "ISL", "冰岛", "冰島"],
|
||||
"🇰🇵": ["KP", "朝鲜"],
|
||||
"🇰🇷": ["KR", "Korea", "KOR", "韩国", "首尔", "韩", "韓", "春川"],
|
||||
"🇱🇺": ["卢森堡"],
|
||||
"🇱🇻": ["Latvia", "Latvija", "拉脱维亚"],
|
||||
"🇲🇽️": ["MEX", "MX", "墨西哥"],
|
||||
"🇲🇾": ["MY", "Malaysia", "MALAYSIA", "马来西亚", "大馬", "馬來西亞", "吉隆坡"],
|
||||
"🇳🇱": ["NL", "Netherlands", "荷兰", "荷蘭", "尼德蘭", "阿姆斯特丹"],
|
||||
"🇵🇭": ["PH", "Philippines", "菲律宾", "菲律賓"],
|
||||
"🇷🇴": ["RO", "罗马尼亚"],
|
||||
"🇷🇺": ["RU", "Russia", "俄罗斯", "俄国", "俄羅斯", "伯力", "莫斯科", "圣彼得堡", "西伯利亚", "新西伯利亚", "京俄", "杭俄", "廣俄", "滬俄", "广俄", "沪俄"],
|
||||
"🇸🇦": ["沙特", "迪拜"],
|
||||
"🇸🇪": ["SE", "Sweden"],
|
||||
"🇸🇬": ["SG", "Singapore", "SINGAPORE", "新加坡", "狮城", "沪新", "京新", "泉新", "穗新", "深新", "杭新", "广新", "廣新", "滬新"],
|
||||
"🇹🇭": ["TH", "Thailand", "泰国", "泰國", "曼谷"],
|
||||
"🇹🇷": ["TR", "Turkey", "土耳其", "伊斯坦布尔"],
|
||||
"🇹🇼": ["TW", "Taiwan", "TAIWAN", "台湾", "台北", "台中", "新北", "彰化", "CHT", "台", "HINET"],
|
||||
"🇺🇸": ["US", "USA", "America", "United States", "美国", "美", "京美", "波特兰", "达拉斯", "俄勒冈", "凤凰城", "费利蒙", "硅谷", "矽谷", "拉斯维加斯", "洛杉矶", "圣何塞", "圣克拉拉", "西雅图", "芝加哥", "沪美", "哥伦布", "纽约"],
|
||||
"🇻🇳": ["VN", "越南", "胡志明市"],
|
||||
"🇮🇹": ["Italy", "IT", "Nachash", "意大利", "米兰", "義大利"],
|
||||
"🇿🇦": ["South Africa", "南非"],
|
||||
"🇦🇪": ["United Arab Emirates", "阿联酋"],
|
||||
"🇧🇷": ["BR", "Brazil", "巴西", "圣保罗"],
|
||||
"🇯🇵": ["JP", "Japan", "JAPAN", "日本", "东京", "大阪", "埼玉", "沪日", "穗日", "川日", "中日", "泉日", "杭日", "深日", "辽日", "广日"],
|
||||
"🇦🇷": ["AR", "阿根廷"],
|
||||
"🇳🇴": ["Norway", "挪威", "NO"],
|
||||
"🇨🇳": ["CN", "China", "回国", "中国", "中國", "江苏", "北京", "上海", "广州", "深圳", "杭州", "徐州", "青岛", "宁波", "镇江", "back"],
|
||||
"🇵🇱": ["PL", "POL", "波兰", "波蘭"],
|
||||
"🇨🇱": ["智利"], "🇳🇿": ["新西蘭", "新西兰"],
|
||||
"🇬🇷": ["希腊", "希臘"],
|
||||
"🇪🇬": ["埃及"],
|
||||
"🇨🇾": ["CY", "塞浦路斯"],
|
||||
"🇨🇷": ["CR", "哥斯达黎加"],
|
||||
@ -2362,23 +2362,23 @@ var ProxyUtils = (function () {
|
||||
"🇱🇹": ["LT", "立陶宛"],
|
||||
"🇵🇦": ["PA", "巴拿马"],
|
||||
"🇹🇳": ["TN", "突尼斯"],
|
||||
"🇮🇲": ["马恩岛","馬恩島"],
|
||||
"🇧🇾": ["BY","白俄罗斯"],
|
||||
"🇵🇹": ["葡萄牙"],
|
||||
"🇮🇲": ["马恩岛", "馬恩島"],
|
||||
"🇧🇾": ["BY", "白俄罗斯"],
|
||||
"🇵🇹": ["葡萄牙"],
|
||||
"🇰🇪": ["KE", "肯尼亚"],
|
||||
"🇰🇬": ["KG", "吉尔吉斯坦"],
|
||||
"🇯🇴": ["JO", "约旦"],
|
||||
"🇺🇾": ["UY", "乌拉圭"],
|
||||
"🇲🇳":["蒙古"],
|
||||
"🇲🇳": ["蒙古"],
|
||||
"🇮🇷": ["IR", "伊朗"],
|
||||
"🇵🇪":["秘鲁","祕魯"],
|
||||
"🇨🇴":["哥伦比亚"],
|
||||
"🇪🇪":["爱沙尼亚"],
|
||||
"🇲🇰":["马其顿","馬其頓"],
|
||||
"🇧🇦":["波黑共和国","波黑"],
|
||||
"🇬🇪":["格魯吉亞","格鲁吉亚"],
|
||||
"🇦🇱":["阿爾巴尼亞","阿尔巴尼亚"],
|
||||
"🏳️🌈":["流量","时间","应急","过期","Bandwidth","expire"],
|
||||
"🇵🇪": ["秘鲁", "祕魯"],
|
||||
"🇨🇴": ["哥伦比亚"],
|
||||
"🇪🇪": ["爱沙尼亚"],
|
||||
"🇲🇰": ["马其顿", "馬其頓"],
|
||||
"🇧🇦": ["波黑共和国", "波黑"],
|
||||
"🇬🇪": ["格魯吉亞", "格鲁吉亚"],
|
||||
"🇦🇱": ["阿爾巴尼亞", "阿尔巴尼亚"],
|
||||
"🏳️🌈": ["流量", "时间", "应急", "过期", "Bandwidth", "expire"],
|
||||
};
|
||||
for (let k of Object.keys(flags)) {
|
||||
if (flags[k].some((item) => name.indexOf(item) !== -1)) {
|
||||
@ -2547,7 +2547,6 @@ var ProxyUtils = (function () {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return `${proxy.name}=shadowsocks,${proxy.server},${proxy.port},${proxy.cipher},"${proxy.password}"${obfs_opts}${udp_opts}${tfo_opts}`;
|
||||
case "ssr":
|
||||
return `${proxy.name}=shadowsocksr,${proxy.server},${proxy.port},${proxy.cipher
|
||||
@ -2576,7 +2575,7 @@ var ProxyUtils = (function () {
|
||||
case "trojan":
|
||||
return `${proxy.name}=trojan,${proxy.server},${proxy.port},"${proxy.password
|
||||
}"${proxy.sni ? ",tls-name:" + proxy.sni : ""},skip-cert-verify:${proxy["skip-cert-verify"] || "false"
|
||||
}`;
|
||||
}${udp_opts}`;
|
||||
case "http":
|
||||
tls_opts = "";
|
||||
const base = `${proxy.name}=${proxy.tls ? "http" : "https"},${proxy.server
|
||||
@ -2629,8 +2628,8 @@ var ProxyUtils = (function () {
|
||||
if (proxy.network === "ws") {
|
||||
const path = proxy["ws-path"] || "/";
|
||||
const wsHeaders = Object.entries(proxy["ws-headers"]).map(
|
||||
([key, value]) => (`${key}:"${value}"`))
|
||||
.join('|');
|
||||
([key, value]) => (`${key}:"${value}"`))
|
||||
.join('|');
|
||||
result += `,ws=true${path ? ",ws-path=" + path : ""}${wsHeaders ? ",ws-headers=" + wsHeaders : ""}`;
|
||||
}
|
||||
if (proxy.tls) {
|
||||
@ -2642,7 +2641,7 @@ var ProxyUtils = (function () {
|
||||
}
|
||||
break;
|
||||
case "trojan":
|
||||
result = `${proxy.name}=trojan,${proxy.server},${proxy.port
|
||||
result = `${proxy.name}=trojan,${proxy.server},${proxy.port
|
||||
},password=${proxy.password}${typeof proxy["skip-cert-verify"] !== "undefined"
|
||||
? ",skip-cert-verify=" + proxy["skip-cert-verify"]
|
||||
: ""
|
||||
@ -4110,10 +4109,10 @@ function Base64Code() {
|
||||
switch (cccc.length) {
|
||||
case 4:
|
||||
const cp =
|
||||
((0x07 & cccc.charCodeAt(0)) << 18) |
|
||||
((0x3f & cccc.charCodeAt(1)) << 12) |
|
||||
((0x3f & cccc.charCodeAt(2)) << 6) |
|
||||
(0x3f & cccc.charCodeAt(3)),
|
||||
((0x07 & cccc.charCodeAt(0)) << 18) |
|
||||
((0x3f & cccc.charCodeAt(1)) << 12) |
|
||||
((0x3f & cccc.charCodeAt(2)) << 6) |
|
||||
(0x3f & cccc.charCodeAt(3)),
|
||||
offset = cp - 0x10000;
|
||||
return (
|
||||
fromCharCode((offset >>> 10) + 0xd800) +
|
||||
|
4
backend/sub-store.min.js
vendored
4
backend/sub-store.min.js
vendored
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user