修改Whatshub工单的完成数量总计的计算方法

This commit is contained in:
root
2026-07-05 02:13:06 +08:00
parent 6b72cd7b67
commit f1acab12a7
33 changed files with 338 additions and 96 deletions
@@ -31,6 +31,10 @@ class AntiBotConfigBuilder
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
if ($ticketType === 'whatshub' && $landingUrlHint === '') {
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
$sessionScope = self::resolveSessionScope($ticketType, $pageUrl, $landingUrlHint);
if ($sessionScope === '') {
return null;
@@ -58,7 +62,7 @@ class AntiBotConfigBuilder
}
/**
* 会话 scope:A2C 业务域+分享 id;火箭长链用动态 host、短链用 share.{token}
* 会话 scopeA2C 业务域+分享 idWhatshub host+shareCode/workId火箭长链用动态 host
*/
public static function resolveSessionScope(string $ticketType, string $pageUrl, string $landingUrlHint = ''): string
{
@@ -66,6 +70,10 @@ class AntiBotConfigBuilder
return self::resolveA2cSessionScope($pageUrl, $landingUrlHint);
}
if ($ticketType === 'whatshub') {
return self::resolveWhatshubSessionScope($pageUrl, $landingUrlHint);
}
if ($ticketType === 'huojian') {
return self::resolveHuojianSessionScope($pageUrl, $landingUrlHint);
}
@@ -92,6 +100,10 @@ class AntiBotConfigBuilder
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
if ($ticketType === 'whatshub' && $landingUrlHint === '') {
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
$scope = self::resolveSessionScope($ticketType, $pageUrl, $landingUrlHint);
return $ticketType . ':' . ($scope !== '' ? $scope : 'unknown');
@@ -137,7 +149,8 @@ class AntiBotConfigBuilder
return [
'postCfReadyUrlContains' => 'work-order-sharing',
'postCfReadySelector' => '.el-input__inner',
'postCfReadyTimeoutMs' => 30000,
'postCfReadyApiUrl' => '/api/whatshub-counter/workShare/open/statistics',
'postCfReadyTimeoutMs' => 60000,
'postCfSettleMs' => 500,
'postCfSpaWaitMs' => 4000,
];
@@ -179,7 +192,7 @@ class AntiBotConfigBuilder
private static function defaultCfClearanceRequired(string $ticketType): bool
{
if ($ticketType === 'a2c') {
if ($ticketType === 'a2c' || $ticketType === 'whatshub') {
return false;
}
@@ -187,11 +200,11 @@ class AntiBotConfigBuilder
}
/**
* A2C 等为 CF Managed Challenge5s 盾),非独立 Turnstile 挂件
* A2C / Whatshub 等为 CF Managed Challenge5s 盾),非独立 Turnstile 挂件
*/
private static function defaultCfChallengeMode(string $ticketType): string
{
if ($ticketType === 'a2c') {
if ($ticketType === 'a2c' || $ticketType === 'whatshub') {
return 'managed';
}
@@ -203,7 +216,7 @@ class AntiBotConfigBuilder
*/
private static function defaultCfCloudflareSolver(string $ticketType): bool
{
return $ticketType === 'a2c';
return $ticketType === 'a2c' || $ticketType === 'whatshub';
}
/**
@@ -233,6 +246,69 @@ class AntiBotConfigBuilder
return '';
}
/**
* Whatshub 会话 scopehost + shareCode 或 workId,避免多工单共用温池 Browser
*/
private static function resolveWhatshubSessionScope(string $pageUrl, string $landingUrlHint = ''): string
{
$host = strtolower(trim((string) parse_url($pageUrl, PHP_URL_HOST)));
if ($host === '' && $landingUrlHint !== '') {
$host = strtolower(trim((string) parse_url($landingUrlHint, PHP_URL_HOST)));
}
if ($host === '') {
return '';
}
$shareCode = self::extractWhatshubShareCode($pageUrl);
if ($shareCode === '' && $landingUrlHint !== '') {
$shareCode = self::extractWhatshubShareCode($landingUrlHint);
}
if ($shareCode !== '') {
return $host . ':' . $shareCode;
}
$workId = self::extractWhatshubWorkId($pageUrl);
if ($workId === '' && $landingUrlHint !== '') {
$workId = self::extractWhatshubWorkId($landingUrlHint);
}
if ($workId !== '') {
return $host . ':' . $workId;
}
return $host;
}
/**
* 从 Whatshub 短链 /m/{shareCode}/ 提取 shareCode
*/
private static function extractWhatshubShareCode(string $url): string
{
$path = (string) parse_url($url, PHP_URL_PATH);
if ($path === '') {
return '';
}
if (preg_match('#/m/([^/]+)/#', $path, $matches)) {
return trim($matches[1]);
}
return '';
}
/**
* 从 Whatshub 长链 work-order-sharing?workId= 提取 workId
*/
private static function extractWhatshubWorkId(string $url): string
{
$query = (string) parse_url($url, PHP_URL_QUERY);
if ($query === '') {
return '';
}
parse_str($query, $params);
$workId = isset($params['workId']) ? trim((string) $params['workId']) : '';
return $workId !== '' ? $workId : '';
}
private static function resolveA2cSessionHost(string $pageUrl, string $landingUrlHint = ''): string
{
$candidates = [];