From c3c58198abeaa6fe61d5e9c845d330a534f77c69 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 27 Jun 2026 23:58:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dadjust=E5=BD=92=E5=9B=A0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard.php | 8 +- jump.txt | 135 +------------- lib/Cloak/AttributionUrlMerger.php | 266 +++++++++++++++++++++++++++ lib/Cloak/FpUrlHelper.php | 12 +- lib/Cloak/Page/FpPageRenderer.php | 6 +- lib/Cloak/Pipeline/RouteResolver.php | 3 +- lib/CloakAdSourceGuard.php | 46 ++++- tools/verify_ad_source_guard.php | 8 +- tools/verify_attribution_merge.php | 100 ++++++++++ 9 files changed, 439 insertions(+), 145 deletions(-) create mode 100644 lib/Cloak/AttributionUrlMerger.php create mode 100644 tools/verify_attribution_merge.php diff --git a/dashboard.php b/dashboard.php index b011596..caea975 100755 --- a/dashboard.php +++ b/dashboard.php @@ -524,8 +524,12 @@ function dash_build_ad_links($pf, $protocol, $host) return [['label' => '落地链接', 'url' => $base]]; } - $spmId = dash_cfg_get($raw, 'CLOAK_AD_SPM_ID'); - $query = CloakAdSourceGuard::buildAdLinkQuery($enabled, $spmId); + $spmId = dash_cfg_get($raw, 'CLOAK_AD_SPM_ID'); + $fpUrls = []; + if (preg_match("/define\('DB_FP',\s*(array\s*\(.*?\))\s*\)/s", $raw, $fpMatch)) { + @eval('$fpUrls = ' . $fpMatch[1] . ';'); + } + $query = CloakAdSourceGuard::buildAdLinkQuery($enabled, $spmId, $fpUrls); $url = $base . ($query !== '' ? '?' . $query : ''); return [['label' => '落地链接', 'url' => $url]]; diff --git a/jump.txt b/jump.txt index ad0f91f..3607462 100755 --- a/jump.txt +++ b/jump.txt @@ -1,133 +1,2 @@ -2026-05-24 20:19:53 | 来源判断 | |false | index | 127.0.0.1 | -2026-05-24 20:19:53 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('','1031c4dd4b0c','cloaka.test','2026-05-24 20:19:53','127.0.0.1','', 'false','','off','PC','chrome','https://cloaka.test:443/index.php?clk_ts=1779624149&clk_nonce=fe833f043be432f1&clk_sig=f5f6690067758f79c085c18aab3a36cd781224e1abb3e9ee5436f9132538d373','English','https://worldhomenest.store','PC') -2026-05-24 20:19:59 | 来源判断 | 缓存|false | index | 127.0.0.1 | https://cloaka.test/dashboard -2026-05-24 20:19:59 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('','','cloaka.test','2026-05-24 20:19:59','127.0.0.1','US', 'false','缓存','https://cloaka.test/dashboard','PC','chrome','https://cloaka.test:443/index.php?','English','https://worldhomenest.store','PC') -2026-05-24 20:25:12 | 来源判断 | |false | index | 127.0.0.1 | -2026-05-24 20:25:12 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('','a2ea7ffe92a8','cloaka.test','2026-05-24 20:25:12','127.0.0.1','', 'false','','off','PC','chrome','https://cloaka.test:443/index.php?clk_ts=1779625346&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=e02ebad7ce4fa0a4aeda23cb0cae63dbb70479d352b72fc677293f51c9ae66af','English','https://worldhomenest.store','PC') -2026-05-24 21:07:53 | 来源判断 | |false | index | 127.0.0.1 | -2026-05-24 21:38:24 | 来源判断 | |false | index | 127.0.0.1 | -2026-05-24 21:51:28 | 来源判断 | API响应非JSON|false | index | 127.0.0.1 | -2026-05-24 21:56:56 | 来源判断 | API请求失败:|false | index | 127.0.0.1 | -2026-05-24 21:59:15 | 来源判断 | API请求失败:|false | index | 127.0.0.1 | -2026-05-24 22:02:15 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-24 22:04:28 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-24 22:04:28 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','4ab064600a83','cloaka.test','2026-05-24 22:04:28','127.0.0.1','-', 'false','黑名单','off','PC','chrome','https://cloaka.test:443/index.php?clk_ts=1779631009&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=3698790e84c74380c19b29b0d9bfd0240a933ba54dc0d16625405b37f096b8a1','English','https://worldhomenest.store','PC') -2026-05-24 22:16:41 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-24 22:31:42 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-24 22:35:41 | 来源判断 | 来源限制:未命中已开启广告来源(Facebook)|false | index | 127.0.0.1 | -2026-05-25 02:48:05 | 来源判断 | 来源限制:未命中已开启广告来源(Facebook)|false | index | 127.0.0.1 | -2026-05-25 02:57:31 | 来源判断 | 来源限制:未命中已开启广告来源(Facebook)|false | index | 127.0.0.1 | -2026-05-25 02:57:31 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-05-25 02:57:31','127.0.0.1','US', 'false','来源限制:未命中已开启广告来源(Facebook)','','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','English','https://worldhomenest.store','PC') -2026-05-25 03:01:56 | 来源判断 | 来源限制:未命中已开启广告来源(Facebook)|false | index | 127.0.0.1 | -2026-05-25 03:01:56 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-05-25 03:01:56','127.0.0.1','US','false','来源限制:未命中已开启广告来源(Facebook)','','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','English','https://worldhomenest.store','PC') -2026-05-25 03:05:20 | 来源判断 | 来源限制:未命中已开启广告来源(Facebook)|false | index | 127.0.0.1 | -2026-05-25 03:05:20 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-05-25 03:05:20','127.0.0.1','US','false','来源限制:未命中已开启广告来源(Facebook)','','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','English','https://worldhomenest.store','PC') -2026-05-25 03:33:18 | 来源判断 | 指纹Cookie未写入(已完成前端检测)|false | index | 127.0.0.1 | https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187 -2026-05-25 03:33:18 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','84f1efe602e2','cloaka.test','2026-05-25 03:33:18','127.0.0.1','US','false','指纹Cookie未写入(已完成前端检测)','https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187&time=1779651198719','English','https://worldhomenest.store','PC') -2026-05-25 03:45:30 | 来源判断 | 指纹Cookie未写入(已完成前端检测)|false | index | 127.0.0.1 | https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187 -2026-05-25 03:45:30 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','e2f5fc622c3e','cloaka.test','2026-05-25 03:45:30','127.0.0.1','US','false','指纹Cookie未写入(已完成前端检测)','https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187&time=1779651930890','English','https://worldhomenest.store','PC') -2026-05-25 03:57:21 | 来源判断 | 可疑访客:操作系统非IOS或者安卓|false | index | 127.0.0.1 | https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187 -2026-05-25 03:57:21 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','df32c6c95fb6','cloaka.test','2026-05-25 03:57:21','127.0.0.1','US','false','可疑访客:操作系统非IOS或者安卓','https://cloaka.test/index?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187&time=1779652640867','English','https://worldhomenest.store','PC') -2026-05-25 04:05:52 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-25 04:05:52 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','08c02abd8025','cloaka.test','2026-05-25 04:05:52','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?clk_ts=0&clk_nonce=3cfa5dc8e5cf98a7&clk_sig=954780561396c8b7df3623a21fe1c7a1f362c92e10a540cca4809c2413b9f187','Chinese','https://worldhomenest.store','PC') -2026-05-26 02:02:56 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 02:02:56','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 02:17:38 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:17:38 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','025bc6046566','cloaka.test','2026-05-26 02:17:38','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:18:16 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:18:16 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','945dddb376ef','cloaka.test','2026-05-26 02:18:16','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:18:35 | 来源判断 | 缓存|false | index | 127.0.0.1 | -2026-05-26 02:18:35 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-05-26 02:18:35','127.0.0.1','-','false','缓存','','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:18:54 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:18:54 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','adc58b3764e8','cloaka.test','2026-05-26 02:18:54','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:34:28 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 02:34:28','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 02:36:56 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 02:36:56','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 02:39:07 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:39:07 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','fb5ef3770269','cloaka.test','2026-05-26 02:39:07','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:39:27 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:39:28 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','3adc7b9b2b81','cloaka.test','2026-05-26 02:39:28','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:43:17 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-05-26 02:43:17 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','6d593c89acf1','cloaka.test','2026-05-26 02:43:17','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/index.php?','English','https://worldhomenest.store','PC') -2026-05-26 02:44:28 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 02:44:28 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','98af2b462187','cloaka.test','2026-05-26 02:44:28','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 02:51:29 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 02:51:29','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 02:52:41 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 02:52:41 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','07cdbefc93dd','cloaka.test','2026-05-26 02:52:41','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 02:55:19 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 02:55:19','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 02:56:48 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 02:56:48 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','d9ee1f0cff7e','cloaka.test','2026-05-26 02:56:48','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 02:57:49 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 02:57:49 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','a332d9695ae9','cloaka.test','2026-05-26 02:57:49','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 02:58:05 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 02:58:05 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','9451a6af27f1','cloaka.test','2026-05-26 02:58:05','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 12:09:55 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 12:09:55','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 12:51:31 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 12:51:31','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 12:58:27 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 12:58:27 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','f0f613c783b5','cloaka.test','2026-05-26 12:58:27','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-05-26 13:01:16 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-05-26 13:01:16','127.0.0.1','','false','','','PC','','/','','','') -2026-05-26 13:12:07 | 来源判断 | API判定通过|true | index | 127.0.0.1 | -2026-05-26 13:12:07 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','0c6370dab8fd','cloaka.test','2026-05-26 13:12:07','127.0.0.1','-','true','','off','PC','chrome','https://cloaka.test/index.php?','English','','PC') -2026-06-10 23:05:11 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-10 23:05:11','127.0.0.1','','false','','','PC','','/','','','') -2026-06-10 23:05:59 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-10 23:05:59','127.0.0.1','','false','','','PC','','/','','','') -2026-06-11 00:25:15 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-11 00:25:15','127.0.0.1','','false','','','PC','','/','','','') -2026-06-11 19:28:27 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-11 19:28:27','127.0.0.1','','false','','','PC','','/','','','') -2026-06-11 19:31:05 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-11 19:31:05','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 00:27:19 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 00:27:19','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 01:29:59 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 01:29:59','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 02:05:06 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 02:05:06','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 02:06:00 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 02:06:00','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 02:28:34 | 来源判断 | 缓存|false | index | 127.0.0.1 | -2026-06-14 02:28:34 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-06-14 02:28:34','127.0.0.1','-','false','缓存','','PC','chrome','https://cloaka.test/','English','https://worldhomenest.store','PC') -2026-06-14 02:30:57 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-06-14 02:30:57 | 写入数据库 | false | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','fa0c6342a353','cloaka.test','2026-06-14 02:30:57','127.0.0.1','-','false','黑名单','off','PC','chrome','https://cloaka.test/','English','https://worldhomenest.store','PC') -2026-06-14 03:03:47 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 03:03:47','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 03:04:01 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 03:04:01','127.0.0.1','','false','','','PC','','/','','','') -2026-06-14 03:07:20 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `user_agent`, `http_referer`, `accept_language_raw`, `judge_timing`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 03:07:20','127.0.0.1','','false','','','PC','','/','','','','','','','') -2026-06-14 03:23:32 | 来源判断 | 缓存|true | index | 127.0.0.1 | -2026-06-14 03:23:32 | 写入数据库 | true | index | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `user_agent`, `http_referer`, `accept_language_raw`, `judge_timing`, `fp_url`, `device`) VALUES ('20251108_emoUAVF6S','','cloaka.test','2026-06-14 03:23:32','127.0.0.1','-','true','','','PC','chrome','https://cloaka.test/?utm_campaign={campaignid}&adgroup_id=__CID__&ad_spm_id=t0tTw4MJ6r','English','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36','','en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7','{\"total_ms\":0.12,\"stages\":[{\"name\":\"Session快速路径\",\"ms\":0.04}]}','https://www.google.com/','PC') -2026-06-14 11:51:53 | 写入数据库 | | regression_test | INSERT INTO `visitor_logs`(`campagin_id`, `visit_md5_code`, `domain`, `visit_date`, `IP`, `country`, `result`, `reason`, `referer`, `client`, `browser`, `page`, `language`, `user_agent`, `http_referer`, `accept_language_raw`, `judge_timing`, `fp_url`, `device`) VALUES ('reg_test','','reg.test','2026-06-14 11:51:53','127.0.0.1','','false','','','PC','','/','','','','','','','') -2026-06-14 12:27:29 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:27:29 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:30:13 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:30:13 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:30:50 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:30:50 | 写入数据库 | | regression_test | async=1 -2026-06-14 12:33:28 | 来源判断 | 黑名单|false | index | 127.0.0.1 | -2026-06-14 12:33:28 | 写入数据库 | false | index | async=1 -2026-06-14 15:22:55 | 写入数据库 | | regression_test | async=1 -2026-06-14 15:22:55 | 写入数据库 | | regression_test | async=1 -2026-06-14 15:23:23 | 写入数据库 | | regression_test | async=1 -2026-06-14 15:23:23 | 写入数据库 | | regression_test | async=1 -2026-06-14 15:47:16 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | https://www.baidu.com/ -2026-06-14 15:47:16 | 写入数据库 | false | index | async=1 -2026-06-15 16:45:08 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | https://www.baidu.com/ -2026-06-15 16:45:08 | 写入数据库 | false | index | async=1 -2026-06-15 19:13:24 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | -2026-06-15 19:13:24 | 写入数据库 | false | index | async=1 -2026-06-15 20:30:01 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | -2026-06-15 20:30:01 | 写入数据库 | false | indBXSXX | async=1 -2026-06-15 20:30:45 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | -2026-06-15 20:30:45 | 写入数据库 | false | indBXSXX | async=1 -2026-06-15 20:31:04 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | -2026-06-15 20:31:04 | 写入数据库 | false | indBXSXX | async=1 -2026-06-15 20:31:20 | 来源判断 | 无法识别访客国家|false | index | 127.0.0.1 | -2026-06-15 20:31:20 | 写入数据库 | false | indBXSXX | async=1 -2026-06-15 20:31:51 | 来源判断 | 无法识别访客国家|false | indBXSXX | 127.0.0.1 | -2026-06-15 20:31:51 | 写入数据库 | false | indBXSXX | async=1 -2026-06-15 23:59:33 | 写入数据库 | | regression_test | async=1 -2026-06-15 23:59:33 | 写入数据库 | | regression_test | async=1 -2026-06-16 03:17:21 | 来源判断 | 无法识别访客国家|false | index | 0.0.0.0 | -2026-06-16 03:17:21 | 写入数据库 | false | test | async=1 -2026-06-16 03:17:42 | 来源判断 | 无法识别访客国家|false | index | 0.0.0.0 | -2026-06-16 03:17:42 | 写入数据库 | false | indBXSXX_test | async=1 -2026-06-16 03:21:38 | 来源判断 | 无法识别访客国家|false | index | 0.0.0.0 | -2026-06-16 03:21:38 | 写入数据库 | false | indBXSXX_test | async=1 -2026-06-20 10:10:20 | 来源判断 | 判定拒绝(安全页)|false | indBXSXX | 127.0.0.1 | -2026-06-20 10:10:20 | 写入数据库 | false | indBXSXX | async=1 -2026-06-20 10:33:43 | 来源判断 | 判定拒绝(安全页)|false | indBXSXX | 127.0.0.1 | -2026-06-20 10:33:43 | 写入数据库 | false | indBXSXX | async=1 -2026-06-20 10:34:34 | 来源判断 | 无法识别访客国家|false | indBXSXX | 127.0.0.1 | -2026-06-20 10:34:34 | 写入数据库 | false | indBXSXX | async=1 -2026-06-20 10:45:40 | 写入数据库 | false | indBXSXX | async=1 -2026-06-20 10:46:58 | 写入数据库 | false | indBXSXX | async=1 -2026-06-20 10:47:37 | 写入数据库 | false | indBXSXX | async=1 -2026-06-22 19:15:55 | 写入数据库 | false | index | async=1 +2026-06-26 15:13:02 | 写入数据库 | false | index | async=1 +2026-06-27 15:43:53 | 写入数据库 | false | index | async=1 diff --git a/lib/Cloak/AttributionUrlMerger.php b/lib/Cloak/AttributionUrlMerger.php new file mode 100644 index 0000000..c7fa41a --- /dev/null +++ b/lib/Cloak/AttributionUrlMerger.php @@ -0,0 +1,266 @@ + Adjust 默认 p1–p6 → Facebook 宏 */ + private static $defaultMacroParams = [ + 'p1' => '{{campaign.name}}', + 'p2' => '{{campaign.id}}', + 'p3' => '{{adset.name}}', + 'p4' => '{{adset.id}}', + 'p5' => '{{ad.name}}', + 'p6' => '{{ad.id}}', + ]; + + /** + * 目标 URL 是否需要归因宏合并 + */ + public static function needsAttributionMerge($targetUrl) + { + $targetUrl = trim((string) $targetUrl); + if ($targetUrl === '') { + return false; + } + + if (stripos($targetUrl, '%7B%7B') !== false || stripos($targetUrl, '%7D%7D') !== false) { + return true; + } + if (preg_match('/\{\{[a-zA-Z0-9_.]+\}\}/', $targetUrl)) { + return true; + } + + $parts = parse_url($targetUrl); + $host = strtolower((string) ($parts['host'] ?? '')); + + return self::isAdjustHost($host); + } + + /** + * 从 DB_FP URL 解析需追加到广告链接的宏参数(键名 => Facebook 宏模板) + * + * @return array + */ + public static function parseAdjustMacroKeys($targetUrl) + { + $targetUrl = trim((string) $targetUrl); + if ($targetUrl === '') { + return []; + } + + $parts = parse_url($targetUrl); + $query = []; + if (!empty($parts['query'])) { + parse_str($parts['query'], $query); + } + + $keys = []; + foreach ($query as $key => $value) { + if (!self::isMacroPlaceholder($value)) { + continue; + } + $macro = self::extractMacroTemplate($value); + if ($macro !== '') { + $keys[(string) $key] = $macro; + } + } + + if (empty($keys) && self::isAdjustHost(strtolower((string) ($parts['host'] ?? '')))) { + return self::$defaultMacroParams; + } + + return $keys; + } + + /** + * 将落地页 query 合并进目标 URL,替换宏占位符 + * + * @param array $incomingQuery + */ + public static function merge($targetUrl, array $incomingQuery) + { + $targetUrl = trim((string) $targetUrl); + if ($targetUrl === '') { + return ''; + } + + $parts = parse_url($targetUrl); + if ($parts === false) { + return $targetUrl; + } + + $targetQuery = []; + if (!empty($parts['query'])) { + parse_str($parts['query'], $targetQuery); + } + + $merged = []; + foreach ($targetQuery as $key => $value) { + $key = (string) $key; + $value = (string) $value; + + if (self::isMacroPlaceholder($value) && self::hasIncomingValue($incomingQuery, $key)) { + $merged[$key] = (string) $incomingQuery[$key]; + continue; + } + + if (!self::isMacroPlaceholder($value)) { + $merged[$key] = $value; + } + } + + foreach (self::$passthroughKeys as $ptKey) { + if (!self::hasIncomingValue($incomingQuery, $ptKey)) { + continue; + } + $merged[$ptKey] = (string) $incomingQuery[$ptKey]; + } + + return self::buildUrl($parts, $merged); + } + + /** + * @param array $query + */ + private static function buildUrl(array $parts, array $query) + { + $scheme = $parts['scheme'] ?? 'https'; + $host = $parts['host'] ?? ''; + $port = isset($parts['port']) ? ':' . $parts['port'] : ''; + $path = $parts['path'] ?? ''; + $frag = isset($parts['fragment']) ? '#' . $parts['fragment'] : ''; + + $pairs = []; + foreach ($query as $key => $value) { + if (in_array((string) $key, self::$stripKeys, true)) { + continue; + } + $pairs[] = rawurlencode((string) $key) . '=' . rawurlencode((string) $value); + } + + $queryStr = implode('&', $pairs); + $url = $scheme . '://' . $host . $port . $path; + if ($queryStr !== '') { + $url .= '?' . $queryStr; + } + + return $url . $frag; + } + + /** + * @param mixed $value + */ + public static function isMacroPlaceholder($value) + { + $value = trim((string) $value); + if ($value === '') { + return false; + } + + if (preg_match('/^\{\{[a-zA-Z0-9_.]+\}\}$/', $value)) { + return true; + } + + $decoded = rawurldecode($value); + if ($decoded !== $value && preg_match('/^\{\{[a-zA-Z0-9_.]+\}\}$/', $decoded)) { + return true; + } + + return (bool) preg_match('/^%7B%7B[a-zA-Z0-9_.]+%7D%7D$/i', $value); + } + + /** + * @param mixed $value + */ + public static function extractMacroTemplate($value) + { + $value = trim((string) $value); + if ($value === '') { + return ''; + } + + if (preg_match('/^\{\{([a-zA-Z0-9_.]+)\}\}$/', $value, $m)) { + return '{{' . $m[1] . '}}'; + } + + $decoded = rawurldecode($value); + if (preg_match('/^\{\{([a-zA-Z0-9_.]+)\}\}$/', $decoded, $m)) { + return '{{' . $m[1] . '}}'; + } + + if (preg_match('/^%7B%7B([a-zA-Z0-9_.]+)%7D%7D$/i', $value, $m)) { + return '{{' . $m[1] . '}}'; + } + + return ''; + } + + /** + * @param array $incomingQuery + */ + private static function hasIncomingValue(array $incomingQuery, $key) + { + if (!array_key_exists($key, $incomingQuery)) { + return false; + } + $value = $incomingQuery[$key]; + if ($value === null || $value === '') { + return false; + } + if (is_array($value)) { + return false; + } + if (self::isMacroPlaceholder($value)) { + return false; + } + + return true; + } + + private static function isAdjustHost($host) + { + if ($host === '') { + return false; + } + foreach (self::$adjustHostSuffixes as $suffix) { + if ($host === $suffix || substr($host, -strlen('.' . $suffix)) === '.' . $suffix) { + return true; + } + } + + return false; + } +} diff --git a/lib/Cloak/FpUrlHelper.php b/lib/Cloak/FpUrlHelper.php index fcce0aa..8fb76a2 100755 --- a/lib/Cloak/FpUrlHelper.php +++ b/lib/Cloak/FpUrlHelper.php @@ -1,6 +1,9 @@