Files
CLOAK/lib/Cloak/FpUrlHelper.php
2026-06-27 23:58:54 +08:00

121 lines
3.8 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once __DIR__ . '/AttributionUrlMerger.php';
require_once dirname(__DIR__) . '/CloakAdSourceGuard.php';
/**
* 真实页 URL 解析(DB_FP 轮询 + KEEP_PARAMS / Adjust 归因合并)
*/
class FpUrlHelper
{
/**
* 解析本次应跳转的真实页 URL(与 FpPageRenderer / f_check 逻辑一致)
*
* @param string $configName check_config 配置名(如 index
* @param bool $mutateNt 是否更新 nt.txt / nt Cookief_check 通过时为 true
* @return array{url:string,now_url:int}
*/
public static function resolve($configName, $mutateNt = true)
{
$all_fp_url = DB_FP;
$num = is_array($all_fp_url) ? count($all_fp_url) : 1;
$now_url = 0;
if ($num < 1) {
return ['url' => is_string($all_fp_url) ? (string) $all_fp_url : '', 'now_url' => 0];
}
if (isset($_COOKIE['nt']) && is_numeric($_COOKIE['nt'])) {
$ntCookie = (int) $_COOKIE['nt'];
if ($ntCookie >= 1 && $ntCookie <= $num) {
$now_url = $ntCookie;
}
}
if (!$now_url) {
$match = false;
$nt = 2;
$ot = false;
$handle = @fopen('nt.txt', 'r');
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle);
$bb = explode('||||||', $buffer);
if (trim($bb[0] ?? '') !== $configName) {
continue;
}
if (!isset($bb[1]) || trim($bb[1]) === '') {
continue;
}
$match = true;
$ot = trim($bb[1]);
$nt = trim($bb[1]);
break;
}
fclose($handle);
}
if ($match) {
if ((int) $nt <= $num) {
$now_url = max(1, (int) $ot);
$nt = (int) $nt + 1;
} else {
$now_url = 1;
$nt = 2;
}
} else {
$now_url = 1;
$nt = 2;
}
if ($mutateNt) {
write_nt_list($configName, $nt, $ot);
}
}
if (is_array($all_fp_url)) {
$idx = max(0, min(max(1, (int) $now_url) - 1, $num - 1));
$fp_url = $all_fp_url[$idx];
$now_url = $idx + 1;
} else {
$fp_url = (string) $all_fp_url;
}
if ($mutateNt) {
setCrossDomainCookie('nt', $now_url, 3600 * 24 + time());
}
$incomingQuery = CloakAdSourceGuard::buildMergedRequestQuery();
if ($fp_url !== '' && AttributionUrlMerger::needsAttributionMerge($fp_url)) {
$fp_url = AttributionUrlMerger::merge($fp_url, $incomingQuery);
} elseif (defined('KEEP_PARAMS') && KEEP_PARAMS === 'ON' && !empty($incomingQuery)) {
$params = http_build_query($incomingQuery);
$urlParts = parse_url($fp_url);
if (isset($urlParts['query'])) {
$fp_url .= '&' . $params;
} else {
$fp_url .= '?' . $params;
}
}
return ['url' => (string) $fp_url, 'now_url' => (int) $now_url];
}
/**
* 真实页 / 安全页兜底 URLDB_FP 首项,否则 DB_ZP
*/
public static function fallbackUrl()
{
$all = DB_FP;
if (is_array($all)) {
foreach ($all as $u) {
if (trim((string) $u) !== '') {
return (string) $u;
}
}
} elseif (is_string($all) && trim($all) !== '') {
return $all;
}
return defined('DB_ZP') ? (string) DB_ZP : '';
}
}