通过测量协议向GA4属性发送页面浏览事件。

11
我该如何使用PHP通过Measurement Protocol向GA4属性发送页面浏览事件?
这是我的方式,但在我的Google Analytics 4属性中看不到任何流量。
$data = array(
    'api_secret' => 'XXXX-YYYYY',
    'measurement_id' => 'G-12345678',
    'client_id' => gen_uuid(), // generates a random id
    'events' => array(
      'name' => 'page_view',
      'params' => array(),
    )
);

$url = 'https://www.google-analytics.com/mp/collect';
$content = http_build_query($data);
$content = utf8_encode($content);

$ch = curl_init();
curl_setopt($ch,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-type: application/x-www-form-urlencoded'));
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_POST, TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS, $content);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);

尝试根据规范将您的内容类型设置为Content-Type: application/json,参见https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#transport - XTOTHEL
1个回答

11

我正在注册页面视图以跟踪API使用情况,以下是我的发现:

XTOTHEL正确指出了在上面设置内容类型为content/json。除了指定内容类型,您还必须将JSON数据作为CURLOPT_POSTFIELDS数据发送。

另外,根据他们的规范,api_secret和measurement_id需要成为URI的一部分:https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=gtag#required_parameters

最后,您可以使用调试模式来验证您的响应并通过简单更改URL到google-analytics.com/debug/mp/collect找出问题所在。

以下是我目前使用的代码:

//retrieve or generate GA tracking id
            if (empty($_COOKIE['_cid'])) {
                setcookie('_cid', vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex(random_bytes(16)), 4)));
            }
            $data = '{"client_id":"'.$_COOKIE['_cid'].'","events":[{"name":"load_endpoint","params":{"page_location":"'.$request->fullUrl().'"}}]}';
            echo '<pre>';
            print_r($data);

            $measurement_id = 'G-xxxxx';
            $api_secret = 'xxxx';
            $url = 'https://www.google-analytics.com/debug/mp/collect?api_secret='.$api_secret.'&measurement_id='.$measurement_id;
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $response = curl_exec($ch);
            curl_close($ch);
            echo $response;

这在一定程度上是有效的。目前它将页面视图注册为自定义事件而不是实际的页面视图。我仍在努力弄清楚如何使它们作为页面视图呈现。

后续操作 经过更多调试,我发现页面视图实际上正在工作,只是没有出现在某些视图中。解决方法是将page_title添加到参数中:

$data = '
{
  "client_id": "'.$_COOKIE['_cid'].'",
  "events": [
    {
      "name": "page_view",
      "params": {
        "page_location": "'.$request->fullUrl().'",
        "page_title": "'.$request->path().'"
      }
    }
  ]
}
';

给下一个遇到问题的人一些额外的注意事项:
  • 调试模式可以返回一些有用的验证错误,例如无效的顶层参数(client_id, events),但是不会返回有关“events”中参数任何内容的错误。例如,我将“page_title”写成“page_asdtitle”,但它仍然能够正常接受。
  • 在调试模式下发送的测试请求没有出现在调试面板中。我怀疑这是由于数据传输延迟导致的,它可能不会实时加载数据。
  • 使用JSON验证器可以帮助你核对代码。请确保在GA指定处使用对象和数组。
  • 如果你对PHP代码出了问题,可以将代码编写成JavaScript浏览器事件并在浏览器中运行。有大量示例介绍如何做到这一点。然后,你可以使用开发工具->网络来检查请求。右键单击Google Analytics请求到“collect”端点,你会看到一个选项将请求复制为CURL。将其放入文本编辑器中并将其与你的PHP代码发送的内容进行比较。
  • 要想真正测试它而不受到巨大的传播延迟的影响,可以登录Google Analytics,进入“报告”->“实时”,如果它正在工作,那么你应该在30-60秒内看到你的数据显示出来。然而,如果你使用了/debug/端点,实时数据将不会显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接