Files

104 lines
2.8 KiB
PHP
Raw Permalink Normal View History

2026-07-02 03:13:27 +08:00
<?php
declare(strict_types=1);
namespace app\common\library\scrm;
/**
* 火箭云控 URL 解析:短链(s.url99.me/code)与长链(*.url66.me/gds?link=)动态识别
*
* 长链域名可能为 v3.url66.me、v4.url66.me 等,禁止写死单一 host。
*/
final class HuojianUrlHelper
{
/** 火箭业务页路径特征 */
public const BUSINESS_PATH_NEEDLE = '/gds';
/** 长链 query 中的分享 token 参数名 */
public const LINK_QUERY_PARAM = 'link';
/**
* 是否为火箭长链业务页(含 /gds 且带 link=
*/
public static function isLongLinkUrl(string $pageUrl): bool
{
$path = (string) parse_url($pageUrl, PHP_URL_PATH);
if ($path === '' || strpos($path, self::BUSINESS_PATH_NEEDLE) === false) {
return false;
}
$query = [];
parse_str((string) parse_url($pageUrl, PHP_URL_QUERY), $query);
return trim((string) ($query[self::LINK_QUERY_PARAM] ?? '')) !== '';
}
/**
* 从长链 URL 动态解析业务域(如 v3.url66.me
*/
public static function extractBusinessHost(string $pageUrl): string
{
if (!self::isLongLinkUrl($pageUrl)) {
return '';
}
$host = strtolower(trim((string) parse_url($pageUrl, PHP_URL_HOST)));
return $host !== '' ? $host : '';
}
/**
* 提取分享稳定标识:长链 link= 或短链 path 段(如 50q3622j
*/
public static function extractShareToken(string $pageUrl): string
{
if (self::isLongLinkUrl($pageUrl)) {
$query = [];
parse_str((string) parse_url($pageUrl, PHP_URL_QUERY), $query);
return trim((string) ($query[self::LINK_QUERY_PARAM] ?? ''));
}
$path = trim((string) parse_url($pageUrl, PHP_URL_PATH), '/');
if ($path === '' || strpos($path, '/') !== false) {
return '';
}
if (preg_match('/^[a-zA-Z0-9]+$/', $path) !== 1) {
return '';
}
return $path;
}
/**
* 是否为火箭短链入口(单段 path,非 /gds 长链)
*/
public static function isShortEntryUrl(string $pageUrl): bool
{
if (self::isLongLinkUrl($pageUrl)) {
return false;
}
return self::extractShareToken($pageUrl) !== '';
}
/**
* 会话 scope:长链用动态业务域;短链用 share.{token}(跨长链域名复用 cookie jar
*/
public static function resolveSessionScope(string $pageUrl): string
{
$businessHost = self::extractBusinessHost($pageUrl);
if ($businessHost !== '') {
return $businessHost;
}
$token = self::extractShareToken($pageUrl);
if ($token !== '') {
return 'share.' . $token;
}
return '';
}
}