Files

104 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

2026-07-02 03:13:27 +08:00
/**
* 火箭云控 URL 解析(与 PHP HuojianUrlHelper 对齐)
* 长链域名动态识别,禁止写死 v3.url66.me
*/
const BUSINESS_PATH_NEEDLE = '/gds';
const LINK_QUERY_PARAM = 'link';
/**
* @param {string} url
*/
function isHuojianLongLinkUrl(url) {
if (!url || typeof url !== 'string') {
return false;
}
try {
const parsed = new URL(url);
if (!parsed.pathname.includes(BUSINESS_PATH_NEEDLE)) {
return false;
}
const link = (parsed.searchParams.get(LINK_QUERY_PARAM) || '').trim();
return link !== '';
} catch (_) {
return false;
}
}
/**
* @param {string} url
* @returns {string}
*/
function extractHuojianBusinessHost(url) {
if (!isHuojianLongLinkUrl(url)) {
return '';
}
try {
return new URL(url).hostname.toLowerCase();
} catch (_) {
return '';
}
}
/**
* @param {string} url
* @returns {string}
*/
function extractHuojianShareToken(url) {
if (!url || typeof url !== 'string') {
return '';
}
try {
const parsed = new URL(url);
if (isHuojianLongLinkUrl(url)) {
return (parsed.searchParams.get(LINK_QUERY_PARAM) || '').trim();
}
const path = parsed.pathname.replace(/^\/+|\/+$/g, '');
if (path === '' || path.includes('/')) {
return '';
}
if (/^[a-zA-Z0-9]+$/.test(path)) {
return path;
}
} catch (_) {
/* ignore */
}
return '';
}
/**
* @param {string} url
*/
function isHuojianShortEntryUrl(url) {
if (isHuojianLongLinkUrl(url)) {
return false;
}
return extractHuojianShareToken(url) !== '';
}
/**
* 落地后补全 businessHostHint(多长链域名兼容)
* @param {object} antiBot
* @param {string} finalPageUrl
*/
function applyHuojianBusinessHostHint(antiBot, finalPageUrl) {
if (!antiBot) {
return antiBot;
}
const host = extractHuojianBusinessHost(finalPageUrl);
if (host !== '') {
antiBot.businessHostHint = host;
console.log(`[Huojian] 落地业务域=${host} url=${finalPageUrl}`);
}
return antiBot;
}
module.exports = {
isHuojianLongLinkUrl,
extractHuojianBusinessHost,
extractHuojianShareToken,
isHuojianShortEntryUrl,
applyHuojianBusinessHostHint,
BUSINESS_PATH_NEEDLE,
};