php - 如何在没有浏览器生成的用户代理的情况下通过 cURL 将事件数据发送到 Google Measurement Protocol?
问题描述
我正在通过 Facebook Lead Ads 产生潜在客户。我的服务器接受来自 Facebook 的 RTU,我可以根据需要将数据推送到我的 CRM。
我想在 Facebook 上填写表格时向 GA 发送一个事件。
阅读谷歌测量协议参考它指出:
user_agent_string – 是一个格式化的用户代理字符串,用于计算以下维度:浏览器、平台和移动功能。
如果未设置此值,则不会计算上述数据。
我相信因为我试图通过不涉及浏览器的 PHP webhook 脚本发送事件,所以请求失败。
这是我正在运行的代码的相关部分(我从 POST 更改为 GET 认为这可能是问题所在,一旦它工作,将其更改回 POST):
$eventData = [
'v' => '1',
't' => 'event',
'tid' => 'UA-XXXXXXX-1',
'cid' => '98a6a970-141c-4a26-b6j2-d42a253de37e',
'ec' => 'my-category-here',
'ea' => 'my-action-here',
'ev' => 'my-value-here
];
//Base URL for API submission
$googleAnalyticsApiUrl = 'https://www.google-analytics.com/collect?';
//Add vars from $eventData object
foreach ($eventData as $key => $value) {
$googleAnalyticsApiUrl .= "$key=$value&";
}
//Remove last comma for clean URL
$googleAnalyticsApiUrl = substr($googleAnalyticsApiUrl, 0, -1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $googleAnalyticsApiUrl);
curl_setopt($ch,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
我相信这是导致问题的用户代理,就好像我手动将相同的 URL 放入浏览器而不是我试图点击的一样,事件立即出现在 GA 的实时跟踪中。
所述 URL 的一个示例是:
我同时使用了 live 端点和 /debug/ 端点。我的代码不会毫无错误地提交给任何一个,但是如果我通过浏览器访问相关的 URL,调试端点会说一切正常,然后在实时端点上,事件按预期到达 GA。
我知道curl_setopt($ch,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
正在尝试发送浏览器的用户代理,我尝试用诸如
“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36”
但它永远不会被测量协议接受。
我的问题
我是否可以在不使用网络浏览器的情况下将这些事件发送给 GA?我曾经让 Zapier 为我推送这些事件,所以我认为这是可能的。
如何通过 PHP 发送有效的 user_agent_string?我试过用'CURLOPT_USERAGENT'来欺骗它,但从来没有设法让它们工作。
解决方案
根据我的经验,谷歌分析只是避免跟踪来自 cURL 或 wget(可能是其他人)的请求......也许是为了过滤掉不需要的噪音......?♂️</p>
任何带有用户代理(包括字符串)的请求"curl"
都不会被跟踪。将 User-Agent 标头覆盖到几乎所有其他内容,GA 将对其进行跟踪。
如果您在使用 cURL 时忽略了覆盖 User-Agent 标头,它将包含一个标识自身的默认标头......并且 GA 将忽略该请求。
当使用像Guzzle这样的包时也是如此,它还包括它自己的默认 User-Agent 字符串(例如"GuzzleHttp/6.5.5 curl/7.65.1 PHP/7.3.9"
)。
只要您提供自己的自定义 User-Agent 标头,GA 就应该选择它。
推荐阅读
- javascript - 在异步中使用while(true)?
- swift - NavigationLink 页面在父视图更新时自动关闭
- google-maps - 谷歌地图 WebGL 支持
- sql - prisma 可以实现与 graphql 相同的功能吗?
- angular9 - 如何用某个数字(而不是零)填充输入?
- laravel - 如何从 nuxt 前端的 laravel api 获取 csrf 令牌
- python - 如何使用 API 的 Flask-Sessions 管理 spotipy 会话?
- google-bigquery - 数据流#bigquery 的最佳实践
- python - 如何解决“django.db.utils.OperationalError:fe_sendauth:没有提供密码”?
- postgresql - 为什么我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?