Files
FlowPilot/background/ip-proxy-provider-711proxy.js
T

111 lines
3.7 KiB
JavaScript

// background/ip-proxy-provider-711proxy.js — 711Proxy 参数与账号规则
(function register711ProxyProvider(root) {
function normalizeCountryCode(value = '') {
const raw = String(value || '').trim().toUpperCase().replace(/[^A-Z]/g, '');
return /^[A-Z]{2}$/.test(raw) ? raw : '';
}
function normalize711SessionId(value = '') {
return String(value || '').trim().replace(/[^A-Za-z0-9_-]/g, '').slice(0, 64);
}
function normalize711SessionMinutes(value = '') {
const raw = String(value ?? '').trim();
if (!raw) return '';
const numeric = Number.parseInt(raw, 10);
if (!Number.isInteger(numeric)) return '';
return String(Math.max(1, Math.min(180, numeric)));
}
function apply711SessionToUsername(username = '', options = {}) {
const text = String(username || '').trim();
if (!text) {
return text;
}
const sessionId = normalize711SessionId(options?.sessionId || '');
const sessTime = normalize711SessionMinutes(options?.sessTime || '');
let next = text;
if (sessionId) {
if (/(?:^|[-_])session[-_:][A-Za-z0-9_-]+?(?=(?:[-_](?:sessTime|sessAuto|region|life|zone|ptype|country|area)\b)|$)/i.test(next)) {
next = next.replace(
/((?:^|[-_])session[-_:])([A-Za-z0-9_-]+?)(?=(?:[-_](?:sessTime|sessAuto|region|life|zone|ptype|country|area)\b)|$)/i,
`$1${sessionId}`
);
} else {
next = `${next}-session-${sessionId}`;
}
}
if (sessTime) {
if (/(?:^|[-_])sessTime[-_:]?\d+\b/i.test(next)) {
next = next.replace(/((?:^|[-_])sessTime[-_:]?)(\d+)\b/i, `$1${sessTime}`);
} else {
next = `${next}-sessTime-${sessTime}`;
}
}
return next;
}
function apply711RegionToUsername(username = '', regionCode = '') {
const text = String(username || '').trim();
const normalizedRegion = normalizeCountryCode(regionCode);
if (!text || !normalizedRegion) {
return text;
}
if (/(?:^|[-_])region[-_:]?[A-Za-z]{2}\b/i.test(text)) {
return text.replace(/((?:^|[-_])region[-_:]?)([A-Za-z]{2})\b/i, `$1${normalizedRegion}`);
}
return `${text}-region-${normalizedRegion}`;
}
function transform711ProxyAccountEntry(entry = {}, context = {}) {
const state = context?.state || {};
const hasAccountList = Boolean(context?.hasAccountList);
const nextEntry = { ...entry };
const username = String(nextEntry.username || '').trim();
if (!username) {
return nextEntry;
}
const configuredRegion = normalizeCountryCode(state?.ipProxyRegion || '');
if (!hasAccountList && configuredRegion) {
nextEntry.username = apply711RegionToUsername(username, configuredRegion);
if (!String(nextEntry.region || '').trim()) {
nextEntry.region = configuredRegion;
}
}
// 账号列表模式按每行原样生效,不叠加固定账号区的 session/sessTime。
if (hasAccountList) {
return nextEntry;
}
const sessionId = normalize711SessionId(state?.ipProxyAccountSessionPrefix || '');
const sessTime = normalize711SessionMinutes(state?.ipProxyAccountLifeMinutes || '');
if (!sessionId && !sessTime) {
return nextEntry;
}
nextEntry.username = apply711SessionToUsername(nextEntry.username, {
sessionId,
sessTime,
});
return nextEntry;
}
root.transformIpProxyAccountEntryByProvider = function transformIpProxyAccountEntryByProvider(
provider = '',
entry = {},
context = {}
) {
const normalizedProvider = String(provider || '').trim().toLowerCase();
if (normalizedProvider === '711proxy') {
return transform711ProxyAccountEntry(entry, context);
}
return entry;
};
})(typeof self !== 'undefined' ? self : globalThis);