feat: 处理端口跳跃(感谢亚托莉佬)

This commit is contained in:
xream 2024-07-19 14:56:37 +08:00
parent 317a804b36
commit 05bdf95a29
No known key found for this signature in database
GPG Key ID: 1D2C5225471789F9
4 changed files with 33 additions and 1 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "sub-store", "name": "sub-store",
"version": "2.14.353", "version": "2.14.357",
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.",
"main": "src/main.js", "main": "src/main.js",
"scripts": { "scripts": {

View File

@ -8,6 +8,7 @@ import {
isValidPortNumber, isValidPortNumber,
isNotBlank, isNotBlank,
ipAddress, ipAddress,
getRandomPort,
} from '@/utils'; } from '@/utils';
import PROXY_PROCESSORS, { ApplyProcessor } from './processors'; import PROXY_PROCESSORS, { ApplyProcessor } from './processors';
import PROXY_PREPROCESSORS from './preprocessors'; import PROXY_PREPROCESSORS from './preprocessors';
@ -220,6 +221,17 @@ function produce(proxies, targetPlatform, type, opts = {}) {
delete proxy['tls-fingerprint']; delete proxy['tls-fingerprint'];
} }
} }
// 处理 端口跳跃
if (proxy.ports) {
if (!['ClashMeta'].includes(targetPlatform)) {
proxy.ports = proxy.ports.replace(/\//g, ',');
}
if (!proxy.port) {
proxy.port = getRandomPort(proxy.ports);
}
}
return proxy; return proxy;
}); });
@ -274,6 +286,7 @@ export const ProxyUtils = {
process: processFn, process: processFn,
produce, produce,
ipAddress, ipAddress,
getRandomPort,
isIPv4, isIPv4,
isIPv6, isIPv6,
isIP, isIP,

View File

@ -94,6 +94,23 @@ function getPolicyDescriptor(str) {
// }; // };
// })(); // })();
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function getRandomPort(portString) {
let portParts = portString.split(/,|\//);
let randomPart = portParts[Math.floor(Math.random() * portParts.length)];
if (randomPart.includes('-')) {
let [min, max] = randomPart.split('-').map(Number);
return getRandomInt(min, max);
} else {
return Number(randomPart);
}
}
export { export {
ipAddress, ipAddress,
isIPv4, isIPv4,
@ -105,4 +122,5 @@ export {
getIfPresent, getIfPresent,
// utf8ArrayToStr, // utf8ArrayToStr,
getPolicyDescriptor, getPolicyDescriptor,
getRandomPort,
}; };

View File

@ -42,6 +42,7 @@ function operator(proxies = [], targetPlatform, context) {
// parse, // 订阅解析 // parse, // 订阅解析
// process, // 节点操作/文件操作 // process, // 节点操作/文件操作
// produce, // 输出订阅 // produce, // 输出订阅
// getRandomPort, // 获取随机端口(参考 ports 端口跳跃的格式 443,8443,5000-6000)
// ipAddress, // https://github.com/beaugunderson/ip-address // ipAddress, // https://github.com/beaugunderson/ip-address
// isIPv4, // isIPv4,
// isIPv6, // isIPv6,