Files
CLOAK/tools/verify_attribution_merge.php
T
2026-06-27 23:58:54 +08:00

101 lines
4.7 KiB
PHP

#!/usr/bin/env php
<?php
/**
* Adjust 归因 URL 合并单元验证
*
* 用法:php tools/verify_attribution_merge.php
*/
if (PHP_SAPI !== 'cli') {
fwrite(STDERR, "请在 CLI 下运行\n");
exit(1);
}
require_once dirname(__DIR__) . '/lib/Cloak/AttributionUrlMerger.php';
$passed = 0;
$failed = 0;
function vassert($name, $cond, $detail = '')
{
global $passed, $failed;
if ($cond) {
$passed++;
return;
}
$failed++;
echo "FAIL: {$name}\n";
if ($detail !== '') {
echo " {$detail}\n";
}
}
$adjustTarget = 'https://aindl.com/v305-8/?p0=1ynqxx65&p1=%7B%7Bcampaign.name%7D%7D&p2=%7B%7Bcampaign.id%7D%7D&p3=%7B%7Badset.name%7D%7D&p4=%7B%7Badset.id%7D%7D&p5=%7B%7Bad.name%7D%7D&p6=%7B%7Bad.id%7D%7D';
vassert('needsAttributionMerge: 编码宏', AttributionUrlMerger::needsAttributionMerge($adjustTarget));
vassert('needsAttributionMerge: 明文宏', AttributionUrlMerger::needsAttributionMerge('https://example.com/?x={{campaign.name}}'));
vassert('needsAttributionMerge: Adjust host', AttributionUrlMerger::needsAttributionMerge('https://aindl.com/v305-8/?p0=abc'));
vassert('needsAttributionMerge: 普通 URL', !AttributionUrlMerger::needsAttributionMerge('https://www.google.com/'));
vassert('isMacroPlaceholder: 编码', AttributionUrlMerger::isMacroPlaceholder('%7B%7Bcampaign.name%7D%7D'));
vassert('isMacroPlaceholder: 明文', AttributionUrlMerger::isMacroPlaceholder('{{campaign.name}}'));
vassert('isMacroPlaceholder: 静态值', !AttributionUrlMerger::isMacroPlaceholder('1ynqxx65'));
$keys = AttributionUrlMerger::parseAdjustMacroKeys($adjustTarget);
vassert('parseAdjustMacroKeys: p1', isset($keys['p1']) && $keys['p1'] === '{{campaign.name}}');
vassert('parseAdjustMacroKeys: p6', isset($keys['p6']) && $keys['p6'] === '{{ad.id}}');
$incoming = [
'p1' => 'Summer Sale',
'p2' => '120345678',
'p3' => 'US Adset',
'p4' => '987654',
'p5' => 'Creative A',
'p6' => '111222',
'ad_spm_id' => '6a0HTjW6bd',
'time' => '1719491234567',
'utm_source'=> 'facebook',
'site_source' => 'fb',
'placement' => 'feed',
'fbclid' => 'IwAR1234567890123456789012',
];
$merged = AttributionUrlMerger::merge($adjustTarget, $incoming);
vassert('merge: p0 保留', strpos($merged, 'p0=1ynqxx65') !== false, $merged);
vassert('merge: p1 展开', strpos($merged, 'p1=Summer%20Sale') !== false, $merged);
vassert('merge: p2 展开', strpos($merged, 'p2=120345678') !== false, $merged);
vassert('merge: 无 ad_spm_id', strpos($merged, 'ad_spm_id') === false, $merged);
vassert('merge: 无 time', strpos($merged, 'time=') === false, $merged);
vassert('merge: 无 utm_source', strpos($merged, 'utm_source') === false, $merged);
vassert('merge: 透传 fbclid', strpos($merged, 'fbclid=IwAR1234567890123456789012') !== false, $merged);
vassert('merge: 无双重编码', strpos($merged, '%257B') === false, $merged);
$masterummyTarget = 'https://www.masterummy.online/623-2/?p0=20fm2y6y&p1=%7B%7Bcampaign.name%7D%7D&p2=%7B%7Bcampaign.id%7D%7D&p3=%7B%7Badset.name%7D%7D&p4=%7B%7Badset.id%7D%7D&p5=%7B%7Bad.name%7D%7D&p6=%7B%7Bad.id%7D%7D';
$incoming623 = [
'p1' => 'IN-master-623-2',
'p2' => '120247249921340752',
'p3' => '新销量广告组',
'p4' => '120247249921360752',
'p5' => '2',
'p6' => '120247249998390752',
'fbclid' => 'IwAR0abcdefghijklmnopqrst',
'ad_spm_id' => '6WLT21GWrVKx',
];
$merged623 = AttributionUrlMerger::merge($masterummyTarget, $incoming623);
vassert('623: p1 展开', strpos($merged623, 'p1=IN-master-623-2') !== false, $merged623);
vassert('623: p3 中文', strpos($merged623, 'p3=%E6%96%B0%E9%94%80%E9%87%8F%E5%B9%BF%E5%91%8A%E7%BB%84') !== false, $merged623);
vassert('623: fbclid 透传', strpos($merged623, 'fbclid=IwAR0abcdefghijklmnopqrst') !== false, $merged623);
vassert('623: 无 ad_spm_id', strpos($merged623, 'ad_spm_id') === false, $merged623);
$plainTarget = 'https://example.com/landing?p1={{campaign.name}}&token=static';
$mergedPlain = AttributionUrlMerger::merge($plainTarget, ['p1' => 'My Campaign', 'token' => 'ignored']);
vassert('merge: 明文宏替换', strpos($mergedPlain, 'p1=My%20Campaign') !== false, $mergedPlain);
vassert('merge: 静态 token 保留', strpos($mergedPlain, 'token=static') !== false, $mergedPlain);
$clidTarget = 'https://aindl.com/x?p0=abc&fbclid=%7B%7Bfbclid%7D%7D';
$mergedClid = AttributionUrlMerger::merge($clidTarget, ['fbclid' => 'realclid123']);
vassert('merge: 目标含 fbclid 宏时替换', strpos($mergedClid, 'fbclid=realclid123') !== false, $mergedClid);
$result = ['ok' => $failed === 0, 'passed' => $passed, 'failed' => $failed];
echo json_encode($result, JSON_UNESCAPED_UNICODE) . "\n";
exit($failed > 0 ? 1 : 0);