diff --git a/conf/app.php b/conf/app.php index 5a2e0d3..53b8986 100644 --- a/conf/app.php +++ b/conf/app.php @@ -204,6 +204,22 @@ $configs = array( "password_auth" => array( "enable" => false, ), + + + //广告跟踪参数配置 + "ad_tracker" => array( + "enable" => false, + "parameters" => array( + "gclid", + "gadid", + ), + + //广告跟踪回调接口 + "postbackApi" => "", + "postbackParaMap" => array( + "clickid" => 'gclid', + ), + ), ); //自定义配置支持 @@ -257,4 +273,14 @@ if (file_exists($customConfigFile)) { }catch(Exception $e) {} } +//广告跟踪自定义配置 +$customConfigFile = __DIR__ . "/../runtime/custom_config_adtracker.json"; +if (file_exists($customConfigFile)) { + try { + $json = file_get_contents($customConfigFile); + $customConfigs = json_decode($json, true); + $configs = array_merge($configs, $customConfigs); + }catch(Exception $e) {} +} + return $configs; \ No newline at end of file diff --git a/conf/custom_config_adtracker.json b/conf/custom_config_adtracker.json new file mode 100644 index 0000000..9621916 --- /dev/null +++ b/conf/custom_config_adtracker.json @@ -0,0 +1,10 @@ +{ + "ad_tracker": { + "enable": false, + "parameters": ["gclid", "gadid"], + "postbackApi": "", + "postbackParaMap": { + "clickid": "gclid" + } + } +} \ No newline at end of file diff --git a/themes/tajian/controller/FrontapiController.php b/themes/tajian/controller/FrontapiController.php index 6697319..299b7f6 100644 --- a/themes/tajian/controller/FrontapiController.php +++ b/themes/tajian/controller/FrontapiController.php @@ -790,6 +790,16 @@ eof; $shareUrl = "/{$newUser['username']}/"; $msg = "注册完成,开始收藏你喜欢的视频吧,正在为你跳转到专属网址..."; $code = 1; + + //广告跟踪回调 + try { + $adTrackPostbackRes = $this->adTrackPostBack(); + if (!empty($adTrackPostbackRes) && !empty($adTrackPostbackRes['status']) && $adTrackPostbackRes['status'] != 200) { + $this->logError( "Ad tracker postback result status {$adTrackPostbackRes['status']}, response: " . json_encode($adTrackPostbackRes['result']) ); + } + }catch(Exception $e) { + $this->logError("Ad tracker postback failed: " . $e->getMessage()); + } }else { $err = '注册失败,请稍后再试'; } diff --git a/themes/tajian/controller/SiteController.php b/themes/tajian/controller/SiteController.php index 2841968..e79b45d 100644 --- a/themes/tajian/controller/SiteController.php +++ b/themes/tajian/controller/SiteController.php @@ -9,9 +9,71 @@ require_once __DIR__ . '/../../../plugins/TajianStats.php'; Class SiteController extends Controller { - //TODO: 广告跟踪,通过cookie保存广告参数 + //广告跟踪,通过cookie保存广告参数 protected function trackAdParameters() { + if (empty(FSC::$app['config']['ad_tracker']) || empty(FSC::$app['config']['ad_tracker']['enable'])) { + return false; + } + + $params = FSC::$app['config']['ad_tracker']['parameters']; + if (empty($params)) { + return false; + } + + $adParaData = array(); + foreach ($params as $key) { + $val = $this->get($key); + if (!empty($val)) { + $adParaData[$key] = $val; + } + } + + if (!empty($adParaData)) { + //30天内有效 + setcookie('ad_tracker', json_encode($adParaData), time() + 86400*30, '/'); + } + } + + //广告跟踪回调 + protected function adTrackPostBack() { + if (empty(FSC::$app['config']['ad_tracker']) || empty(FSC::$app['config']['ad_tracker']['enable'])) { + return false; + } + + $params = FSC::$app['config']['ad_tracker']['parameters']; + if (empty($params)) { + return false; + } + + $postbackApi = FSC::$app['config']['ad_tracker']['postbackApi']; + if (empty($postbackApi)) { + return false; + } + + //为追加get参数做准备 + if (strpos($postbackApi, "?") === false) { + $postbackApi .= "?timestamp=" . time(); + } + + //从cookie中获取跟踪到的广告参数 + $adParaDataFromCookie = !empty($_COOKIE['ad_tracker']) ? json_decode( urldecode($_COOKIE['ad_tracker']), true ) : array(); + + //用记录下来的广告参数值替换回调API中的变量 + $postbackParaMap = FSC::$app['config']['ad_tracker']['postbackParaMap']; + if (!empty($postbackParaMap)) { + foreach ($postbackParaMap as $find => $replace) { + $postbackApi = str_replace("\{{$find}\}", @adParaDataFromCookie[$replace], $postbackApi); + } + } + + //把广告参数追加到回调API网址中 + foreach($adParaDataFromCookie as $key => $val) { + $postbackApi .= "&{$key}=" . urlencode($val); + } + //请求回调API,所有广告参数同时GET和POST传参数以支持不同传参模式 + $timeout = 10; + return $this->request($postbackApi, $adParaDataFromCookie, $timeout); } //TODO: 增加cookie跟踪同意/不同意选择,确保用户知道cookie跟踪了哪些数据