Google analytics 为什么分析数据API V1 Beta版不符合REST规范?

Google analytics 为什么分析数据API V1 Beta版不符合REST规范?,google-analytics,google-analytics-api,google-analytics-filters,Google Analytics,Google Analytics Api,Google Analytics Filters,我正在将GTM和GA4添加到一些网站应用程序中,这些应用程序需要生成每个广告客户点击率的详细统计数据。 这在标准GA报告中看起来不可行,所以我使用PHP实现的Analytics Data API V1 Beta版。由于使用php进行V1报告的示例很少(例如analyticsdata/quickstart.php),因此我正在从RESTAPI的JSON转换其他类和操作数 <?php namespace Google\Analytics\Data\V1beta; require 'vendor

我正在将GTM和GA4添加到一些网站应用程序中,这些应用程序需要生成每个广告客户点击率的详细统计数据。 这在标准GA报告中看起来不可行,所以我使用PHP实现的Analytics Data API V1 Beta版。由于使用php进行V1报告的示例很少(例如analyticsdata/quickstart.php),因此我正在从RESTAPI的JSON转换其他类和操作数

<?php
namespace Google\Analytics\Data\V1beta;
require 'vendor/autoload.php';

$property_id = '<redacted>';

putenv('GOOGLE_APPLICATION_CREDENTIALS=Keyfile.json');

$client = new BetaAnalyticsDataClient();

// Make an API call.
$response = $client->runReport([
    'property' => 'properties/' . $property_id,
    
    'dateRanges' => [
        new DateRange([
            'start_date' => '2021-04-01',
            'end_date' => 'today',
        ]
        ),
    ],
    'dimensions' => [new Dimension(
        [
           'name' => 'customEvent:link_classes'
        ]
    ),
    ],
        
     'dimensionFilter'=>[new FilterExpression(
           [
           'filter'=>[new Filter(
           [
          'field_name' => 'customEvent:Classes',
          'string_filter' => [new Filter\StringFilter(
          [
          'match_type'=> '1',
          'value'=> 'AdvertA',
          'case_sensitive'=> false 
          ])]])]])],
    
    'metrics' => [new Metric(
        [
            'name' => 'eventCount',
        ]
    )
    ]
]);
etc
PHP没有“enum”,但等效的方法是选择一个字符串并将其分配给匹配的类型(见上文)。错误:除非为StringFilter指定整数操作数,否则它将失效,可能是枚举匹配字符串中所需匹配的序号(第一个是0还是1?)。我对JSON模式的理解是,“enum”列表只是将结果限制为一个唯一的操作数,并对操作数类型进行可选检查。(通过比较,Python enumerate函数返回一个对象,该对象包含一组对,且操作数的序号在操作数之前)

自定义维度似乎不符合API的JSON。在Analytics中,我指定了一个自定义维度,维度名称为class,用户属性/参数为link_Classes**。 然而。。。在API中,维度名称必须是customEvent:link_类,而不是customEvent:Class。否则会导致“字段customEvent:类不是有效维度” 在筛选器表达式中的筛选器中定义字段_name时也会发生这种情况。 那么,API维度名称是否不是分析维度名称的名称,而是分析描述性名称的属性/参数?在一个地方,我读到了后者:“自定义维度在API报告请求中由维度的参数名和范围指定。”但在其他地方,它暗示名称就是维度名称,例如/devguides/reporting/data/v1/advanced: “维度”:[{“名称”:“客户用户:最后一级”}]

最后,即使dimensionFilter与开发人员实现的内容一致,它也会与“Expect Google\Analytics\Data\V1beta\Filter\StringFilter”一致

这是测试版代码,但人们不会期望与REST规范有明显的偏差,所以我可能看错了规范。还有其他人有这个问题吗


**GTM有一个“点击链接”触发器,其中“点击URL”包含“广告商的URL”。API维度过滤器中的Classes custom维度具有广告点击链接的类值。

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

'match_type'=>Filter\StringFilter\MatchType::以\u开头

至于第二个问题。对于事件范围的维度,自定义维度的名称被构造为
customEvent:parameter_name
;对于用户范围的维度,自定义维度的名称被构造为
customUser:parameter_name
。 其中,
parameter\u name
,正如您正确指出的,不是描述性名称,而是事件参数名称。在您的示例中,您似乎正在使用一个用户范围的维度,因此API中的维度名称应该是
customUser:link\u 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',
        ]
    )
    ]
]);

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

'match_type'=>Filter\StringFilter\MatchType::以\u开头

至于第二个问题。对于事件范围的维度,自定义维度的名称被构造为
customEvent:parameter_name
;对于用户范围的维度,自定义维度的名称被构造为
customUser:parameter_name
。 其中,
parameter\u name
,正如您正确指出的,不是描述性名称,而是事件参数名称。在您的示例中,您似乎正在使用一个用户范围的维度,因此API中的维度名称应该是
customUser:link\u 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',
        ]
    )
    ]
]);

非常感谢伊利亚给了我一个非常有用、及时和正确的答复。 三点:

1. 使用

而不是:

'match_type' => ‘BEGINS_WITH’
修复了“未捕获异常:Expect integer.in/vendor/google/protobuf/src/google/protobuf/Internal/GPBUtil.php”作为 MatchType::以(etc)常量开头,从类MatchType返回一个整数(在本例中为2)

2. 如果在自定义维度文档中使用维度名称的位置添加了提醒,则可以防止出现错误,例如 /devguides/reporting/data/v1/advanced:“维度”:[{“名称”:“customUser:last_level”}] 强调该名称不是Analytics定义的维度名称,而是关联的用户属性/参数名称。或者GA自定义维度“form”中的名称标题应该修改

3. 最后,这个过滤器将与

 ‘Expect Google\Analytics\Data\V1beta\Filter\StringFilter’
错误消息是由于我愚蠢地将FilterExpression、Filter和StringFilter当作数组元素实例化而导致的, e、 g

而不是

'string_filter' => new Filter\StringFilter(
不幸的是,当不小心遵循示例报告代码时,很容易犯错误,其中日期范围、维度等正确定义了数组(因为它们可以采用多个日期范围和维度),例如


非常感谢伊利亚给了我一个非常有用、及时和正确的答复。 三点:

1. 使用

而不是:

'match_type' => ‘BEGINS_WITH’
修复了“未捕获异常:Expect integer.in/vendor/google/protobuf/src/google/protobuf/Internal/GPBUtil.php”作为 MatchType::以(etc)常量开头,从类MatchType返回一个整数(在本例中为2)

2. 如果在自定义维度文档中使用维度名称的位置添加了提醒,则可以防止出现错误,例如 /devguides/reporting/data/v1/advanced:“维度”:[{“名称”:“c
'string_filter' => new Filter\StringFilter(
   'dimensions' => [new Dimension (