【问题标题】:Google Analytics server-side tracking谷歌分析服务器端跟踪
【发布时间】:2014-06-02 21:33:34
【问题描述】:

Google Analytics(分析)只需将其源代码放在我的网站上,即可自动跟踪我过去需要的所有内容(网页浏览量、唯一身份访问者)。

但是现在,我需要跟踪事件,而唯一的方法就是在服务器端进行。每次任何用户执行我需要跟踪的特定操作时,服务器都会将数据发布到谷歌以跟踪信息,如下所述:

https://developers.google.com/analytics/devguides/collection/protocol/v1/devguide#event

它确实非常完美,但是,自从我意识到,我现在收到了很多来自西班牙的访问,来自美国的访问量增加了一倍。在我实施事件跟踪之前,西班牙甚至都不是前 10 名国家的一部分。

今天我发现我的服务器在西班牙,这可能是导致问题的原因。

如何在不计入综合浏览量的情况下跟踪事件?

$url = 'http://www.google-analytics.com/collect';
$data = array('v' => '1', 'tid' => 'UA-HIDDEN-1', 'cid' => $_SERVER["REMOTE_ADDR"], 'ni' => '1', 't' => 'event', 'ec' => '', 'ea' => 'JUMP', 'el' => '');
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data),
    ),
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

非常感谢!!

【问题讨论】:

标签: php google-analytics


【解决方案1】:

您将 IP 地址作为客户端 ID 发送,这是错误的。一方面,客户端 ID 应该是 to be an UUID。其次,Google Analytics(分析)不会识别这些事件属于现有用户。

您需要获取网页上现有用户的现有客户端 ID:

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

然后将其发送回服务器并在您的请求中使用它 (1)。目前 GA 无法分配正确的地理信息,因为事件不属于发起事件的用户的会话(这很可能也会影响其他一些指标)。

(1) 您不妨阅读 PHP 中的 GA cookie,但 Google 建议不要这样做,因为 cookie 格式可能会更改,恕不另行通知。即使 cookie 格式发生变化,上面的脚本也会始终返回正确的客户端 ID。

更新:我已经阅读了更多文档,虽然我的答案似乎仍然有些相关,但实际用例可能是错误的 - 地理由 IP 确定,服务器端脚本仍将发送服务器 IP。所以很可能(还没有完成科学)这看起来像是一个有两台设备的访问者,而不是一个访问者。

更新 2:显然现在可以将用户 IP 地址作为参数包含在内,因此这个答案可能不再相关。

Here is a techopad presentation about mixing UA client- and serverside,也许有帮助。

【讨论】:

  • 非常感谢您的回答。我会试试看!
  • 好吧,看来我的回答有点不对劲——我包含了我找到的更多信息。很高兴知道您是否在这方面取得了进展。
【解决方案2】:

事件本身并不是综合浏览量。请参阅:Event Tracking

您是否有特定的原因需要从普通 ga.js 客户端代码跟踪事件服务器端和综合浏览量?

如果您没有意识到这一点,您可以轻松地从客户端跟踪事件: <a href="#" onClick="_gaq.push(['_trackEvent', 'Videos', 'Play', 'Baby\'s First Birthday']);">Click Link to Track Event</a>

假设您需要在服务器端保留事件和浏览量:

<?php
  //Put SERVER_ADDR into a var
  $request_ip = $_SERVER['REMOTE_ADDR'];

  // Put any server IPs you need to filter out below in an array
  $localhosts = array('127.0.0.1','192.168.15.1','10.1.10.1');

  // Use this later
  $url = 'http://www.google-analytics.com/collect';

现在,弄清楚如何处理 REMOTE_ADDR 检查它是否在我们上面的列表中。然后构建一个类型数组来发送 GA(事件、浏览量)

  $actions = array();
  // Note that the values are arbitrary and will let you do what you need.

  if(in_array($request_ip)){

      //Only track event, or track pageview differently, or track two events.

      $handle_myServer = true;
      $actions = ('event');

  } else {
      // Track everyone else

      $handle_myServer = false;
      $actions = ('event','pageview','mySpecialPageview','mySpecialEvent');
  }

最后,我们已经建立了一个事件列表,我们可以在流程控制中使用现有代码来处理浏览量、用户计时、事件等。要有创意!

  foreach($actions as $action){
       $data = null; $options=null;

       if($handle_myServer){
         $someFlagForGA = 'RequestFromSpainServer';
       }


       if($action == 'event'){
          $data = array('v' => '1'
                     , 'tid' => 'UA-HIDDEN-1', 
                     ,'cid' => $request_ip
                     ,'ni' => '1'
                     , 't' => 'event'
                     , 'ec' => $someFlagForGA, 
                     ,'ea' => 'JUMP', 'el' => ''
                     );
       } elseif($action == 'pageview'){
            $data = array('v' => '1', 'tid' => 'UA-HIDDEN-1'
                     , 't' => 'pageview'
                     , 'dh'=> 'yourGAenabledDomainHere.com'  
                     , 'dp'=> 'ViewedPage.html'
                     , 'dt'=> 'homepage'.' SERVER VISITED '.$someFlagForGA
                     );
       } else {
         // Do whatever else
       }

     // Would be better to do below with a single function 

       $options = array(
          'http' => array(
          'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
          'method'  => 'POST',
          'content' => http_build_query($data),
        ) ,$data);


        $context  = stream_context_create($options);

        $result = file_get_contents($url, false, $context) or die('Error!!');

   }
?>

【讨论】:

  • 如果我链接到其他网站,并添加该 onclick 方法,它会工作吗?例如:google.comonclick="ga(blah blah">点击我。我认为当我点击链接时,浏览器会将我带到 google.com,因为页面已卸载它不会照顾这个功能。我错了吗?
  • @ice24 - 不,您绝对可以在加载外部页面之前获取该事件(使用 preventDefault)。如果我显示的服务器端代码对您没有用,我将使用 js 代码更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2013-09-18
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多