为什么 Analytics Data API V1 Beta 不符合 REST 规范?

dec*_*ity 2 google-analytics google-analytics-api google-analytics-filters

我正在将 GTM 和 GA4 添加到一些网站应用程序,这些应用程序需要生成有关每个广告商的广告点击率的详细统计信息。\n这对于标准 GA 报告来说似乎不可行,因此我使用 Analytics Data API V1 Beta 的 PHP 实现。由于使用 PHP 的 V1 报告的示例很少(例如 Analyticsdata/quickstart.php),因此我正在翻译 REST API\xe2\x80\x99s JSON 中的其他类和操作数。

\n
<?php\nnamespace Google\\Analytics\\Data\\V1beta;\nrequire 'vendor/autoload.php';\n\n$property_id = '<redacted>';\n\nputenv('GOOGLE_APPLICATION_CREDENTIALS=Keyfile.json');\n\n$client = new BetaAnalyticsDataClient();\n\n// Make an API call.\n$response = $client->runReport([\n    'property' => 'properties/' . $property_id,\n    \n    'dateRanges' => [\n        new DateRange([\n            'start_date' => '2021-04-01',\n            'end_date' => 'today',\n        ]\n        ),\n    ],\n    'dimensions' => [new Dimension(\n        [\n           'name' => 'customEvent:link_classes'\n        ]\n    ),\n    ],\n        \n     'dimensionFilter'=>[new FilterExpression(\n           [\n           'filter'=>[new Filter(\n           [\n          'field_name' => 'customEvent:Classes',\n          'string_filter' => [new Filter\\StringFilter(\n          [\n          'match_type'=> '1',\n          'value'=> 'AdvertA',\n          'case_sensitive'=> false \n          ])]])]])],\n    \n    'metrics' => [new Metric(\n        [\n            'name' => 'eventCount',\n        ]\n    )\n    ]\n]);\netc\n
Run Code Online (Sandbox Code Playgroud)\n

快速入门示例可以工作,但在使用DimensionFilter时会遇到无穷无尽的麻烦时会遇到无穷无尽的麻烦。\n例如,match_type 应该是几个字符串(EXACT、CONTAINS 等)之一的枚举。match_type 的 JSON 定义仅显示字符串(枚举“成员”),而不显示任何关联值(通常是整数)。GA4 迁移指南有一个示例

\n
 "matchType": "BEGINS_WITH"  \n
Run Code Online (Sandbox Code Playgroud)\n

PHP 没有 \xe2\x80\x99t 有 \xe2\x80\x98enum\xe2\x80\x99 但等效的方法是选择一个字符串并将其分配给 match_type (见上文)。错误:除非给定一个整数操作数,否则 StringFilter 就会失败,大概是枚举匹配字符串中所需匹配的序号(第一个是 0 还是 1?)。我对 JSON 模式的理解是,“枚举”列表只是将结果限制为唯一的操作数之一,并对操作数类型进行可选检查。(相比之下,Python 枚举函数返回一个对象,其中包含一个对的列表,其中操作数的序号位于该操作数之前)。

\n

自定义维度似乎不符合 API\xe2\x80\x99s JSON。在 Analytics 中,我指定一个自定义维度,其维度名称为类,用户属性/参数为 link_classes**。\n但是...在 API 中,维度名称必须是 customEvent:link_classes 而不是 customEvent:Classes。否则,它会失败 \xe2\x80\x98 Field customEvent:Classes is not a valid dimension \xe2\x80\x99\n当在过滤器表达式中的过滤器中定义 field_name 时,也会发生这种情况。\nAPI 维度名称不是Analytics 维度的名称 名称但实际上是 Analytics 描述性名称的属性/参数?我在一个地方读到了后者:“自定义维度是在 API 报告请求中通过维度的参数名称和范围指定的。” 但在其他地方暗示 Name 是维度名称,例如 /devguides/reporting/data/v1/advanced:\n" dimensions ": [{" name ":"customUser:last_level"}]

\n

最后,即使与开发人员实现的内容一致,dimensionFilter 也会出现 \xe2\x80\x98 Expect Google\\Analytics\\Data\\V1beta\\Filter\\StringFilter \xe2\x80\x99

\n

这是 Beta 代码,但人们不会期望与 REST 规范存在明显偏差,因此也许我错误地阅读了规范。还有其他人有这个问题吗?

\n

** GTM 有一个 \xe2\x80\x98Click - 仅链接\xe2\x80\x99 触发器,其中 \xe2\x80\x98click URL\xe2\x80\x99 \xe2\x80\x98包含\xe2\x80\x99 广告商\xe2\x80\x99s URL。API 维度过滤器中的类自定义维度具有广告点击链接的类值。

\n

小智 5

为了回答你的问题的第一部分,我相信在 PHP 中使用枚举的正确方法是:

'match_type' => 过滤器\StringFilter\MatchType::BEGINS_WITH

至于第二个问题。根据API 架构文档,自定义维度的名称是针对 customEvent:parameter_name事件范围维度和customUser:parameter_name用户范围维度构建的。正如您正确指出的那样parameter_name,其中 不是描述性名称,而是事件参数名称。在您的示例中,您似乎正在使用用户范围的维度,因此 API 中的维度名称应为customUser:link_classes.

这是一个似乎运行良好的完整示例:

require 'vendor/autoload.php';

use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\FilterExpression;
use Google\Analytics\Data\V1beta\Filter;
use Google\Analytics\Data\V1beta\Metric;

/**
 * TODO(developer): Replace this variable with your Google Analytics 4
 *   property ID before running the sample.
 */
$property_id = 'YOUR-GA4-PROPERTY-ID';


$client = new BetaAnalyticsDataClient();

// Make an API call.
$response = $client->runReport([
    'property' => 'properties/' . $property_id,
    'dateRanges' => [
        new DateRange([
            'start_date' => '2020-03-31',
            'end_date' => 'today',
        ]),
    ],
    'dimensions' => [new Dimension(
        [
            'name' => 'customUser:link_classes'
        ]),
    ],

    'dimensionFilter' => new FilterExpression(
        [
            'filter' => new Filter(
                [
                    'field_name' => 'customUser:link_classes',
                    'string_filter' => new Filter\StringFilter(
                        [
                            'match_type' => Filter\StringFilter\MatchType::BEGINS_WITH,
                            'value' => 'AdvertA',
                            'case_sensitive' => false
                        ]
                    )
                ])

        ]),

    'metrics' => [new Metric(
        [
            'name' => 'eventCount',
        ]
    )
    ]
]);
Run Code Online (Sandbox Code Playgroud)