В этой статье приведены рекомендации по переходу с Core Reporting API версии 3 на Analytics Reporting API версии 4.
Введение
Если вы хотите пользоваться всеми преимуществами Analytics Reporting API версии 4, вам нужно изменить код. Чтобы упростить эту задачу, мы расскажем, как запросы к новому API соотносятся с запросами к Core Reporting API версии 3.
Переход для Python
Если вы применяете Python, воспользуйтесь вспомогательной библиотекой GAV4, которая доступна на GitHub. Она позволяет конвертировать запросы к Google Analytics Core Reporting API версии 3 в формат, приемлемый для Analytics Reporting API версии 4.
Конечные точки
В Core Reporting API версии 3 и Analytics Reporting API версии 4 разные конечные точки и методы HTTP.
Конечная точка версии 3
GET https://www.googleapis.com/analytics/v3/data/ga
Конечная точка версии 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
Ниже приведены примеры запросов в версии 3 и их аналоги в версии 4.
Версия 3
Справочные материалы Analytics Reporting API версии 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
&metrics=ga:users&dimensions=ga:pagePath
Версия 4
Справочные материалы Analytics Reporting API версии 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
"metrics":[
{
"expression":"ga:users"
}],
"dimensions": [
{
"name":"ga:pagePath"
}]
}]
}
Клиентские библиотеки и сервис Google Discovery
Если вы используете Python, JavaScript или любую другую клиентскую библиотеку, которой для работы нужен сервис Google Discovery, вам требуется указать местоположение документа Discovery для Reporting API версии 4.
Python
from apiclient import discovery
...
# Build the Analytics Reporting API v4 authorized service object.
analyticsReporting = discovery.build(
'analyticsreporting',
'v4',
http=http,
discoveryServiceUrl='https://analyticsreporting.googleapis.com/$discovery/rest')
JavaScript
gapi.client.load(
'https://analyticsreporting.googleapis.com/$discovery/rest',
'v4'
).then(...)
Клиентские библиотеки Java и PHP обычно предустановлены, но их можно создать с помощью сервиса Discovery и генератора Google API.
Запросы
Структура запросов, принятая в API версии 4, подробно описана в справочных материалах. Разделы ниже посвящены тому, что нужно изменить в параметрах запросов при переходе на эту версию с Core Reporting API версии 3.
Идентификаторы представления
В версии 3 параметр ids
, который принимает значение table ID, имеет формат ga:XXXX
, где XXXX
– идентификатор представления (профиля). В версии 4 этот идентификатор указывается в поле viewId
в теле запроса.
Ниже приведено сравнение параметра ids
в запросе версии 3 и поля viewId
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
...
}]
}
Диапазоны дат
В запросах Analytics Reporting API версии 4 можно указывать несколько диапазонов дат. Для этого нужно добавить в поле dateRanges
список объектов DateRange.
В версии 3 для указания начала и конца диапазона дат используются параметры start-date
и end-date
соответственно.
Ниже приводится сравнение параметров start-date
и end-date
в запросе версии 3 и поля dateRanges
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
...
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
....
}]
}
Показатели
Параметр metrics
в версии 3 соответствует полю metrics
, в которое в версии 4 добавляется список объектов Metric.
В примере ниже параметры metrics
в запросе версии 3 сравниваются с полем metrics
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
&metrics=ga:users,ga:sessions \
...
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
"metrics":[
{
"expression":"ga:users"
},{
"expression":"ga:sessions"
}],
...
}]
}
Параметры
Параметр dimensions
в версии 3 соответствует полю dimensions
, в которое в версии 4 добавляется список объектов Dimension.
В примере ниже параметры dimensions
в запросе версии 3 сравниваются с полем dimensions
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&dimensions=ga:country,ga:browser&... \
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"dimensions": [
{
"name":"ga:country"
},{
"name":"ga:browser"
}],
...
}]
}
Сортировка
Параметру sort
в версии 3 соответствует поле orderBys
в версии 4, куда добавляется список объектов OrderBy.
В версии 4 результаты можно сортировать по значению параметра или показателя:
- Укажите его имя или псевдоним в поле
fieldName
. - Укажите порядок сортировки (
ASCENDING
илиDESCENDING
) в полеsortOrder
.
В примере ниже сравнивается использование параметра sort
в версии 3 и поля orderBy
в версии 4. Представлена сортировка пользователей по убыванию и источников по алфавиту.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&sort=-ga:users,ga:source
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"orderBys": [
{
"fieldName": "ga:users",
"sortOrder": "DESCENDING"
},{
"fieldName": "ga:source"
}],
}]
}
Уровень выборки
Параметру samplingLevel
в версии 3 соответствует поле samplingLevel
в версии 4. В версии 3 у параметра samplingLevel
три допустимых значения: FASTER
, HIGHER_PRECISION
и DEFAULT
. В версии 4 поле samplingLevel
также может принимать три значения: SMALL
, LARGE
и DEFAULT
. Изменились только наименования этих значений: SMALL
вместо FASTER
и LARGE
вместо HIGHER_PRECISION
.
В примерах ниже сравниваются параметр samplingLevel
в запросе версии 3 и поле samplingLevel
в запросе версии 4.
Версия 3
https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX ...\
samplingLevel=HIGHER_PRECISION
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"samplingLevel": "LARGE"
}]
}
Сегменты
Параметру segment
версии 3 соответствует поле segments
в версии 4, в которое добавляется список объектов Segment.
Идентификаторы сегментов
Если вы пользуетесь версией 4 и вам нужно включить сегмент в запрос по идентификатору, создайте объект Segment и укажите идентификатор в поле segmentId.
В примере ниже приведено сравнение параметра segment
в запросе версии 3 и поля segments
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=gaid::-11
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "gaid::-11"
}]
}]
}
Динамические сегменты
Чтобы выражать сложные параметры сегментов в версии 4, используется поле segments
, в котором указан объект DynamicSegment.
В примерах ниже приведено сравнение параметра segment
в запросе версии 3 и поля segments
, содержащего объект DynamicSegment
, в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"segments": [{
"dynamicSegment": {
"name": "segment_name",
"sessionSegment": {
"segmentFilters": [{
"simpleSegment": {
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:medium",
"operator": "EXACT",
"expressions": [ "referral" ]
}
}]
}]
}
}]
}
}
}]
}]
}
Условия и последовательности можно объединять в сегментах.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=users::condition::ga:revenue>10;sequence::ga:deviceCategory==desktop->>ga:deviceCategory==mobile
Версия 4
"reportRequests": [{
"dateRanges": [
{ "endDate": "2014-11-30", "startDate": "2014-11-01" }
],
"metrics": [
{"expression": "ga:pageviews"},
{"expression": "ga:sessions"}
],
"viewId": "XXXX",
"dimensions":[{"name":"ga:medium"}, {"name":"ga:segment"}],
"segments": [{
"dynamicSegment": {
"name": "segment_name",
"userSegment": {
"segmentFilters": [{
"simpleSegment": {
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"metricFilter": {
"metricName": "ga:sessions",
"operator": "GREATER_THAN",
"comparisonValue": "10"
}
}]
}]
}
},
{
"sequenceSegment": {
"segmentSequenceSteps": [{
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:deviceCategory",
"operator": "EXACT",
"expressions": ["desktop"]
}
}]
}],
"matchType": "PRECEDES"
},{
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:deviceCategory",
"operator": "EXACT",
"expressions": ["mobile"]
}
}]
}]
}]
}
}]
}
}
}]
}]
Синтаксис сегментов в новой версии
Поле segmentId в версии 4 поддерживает синтаксис сегментов, принятый в API версии 3.
Ниже приведены примеры параметра segment
в версии 3 и его передачи с помощью поля segmentId
в версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "sessions::condition::ga:medium==referral"
}]
}]
}
Фильтры
В API версии 4 для фильтрации используются два поля: dimensionFilterClauses
для параметров и metricFilterClauses
для показателей. Поле dimensionFilterClauses
содержит список объектов DimensionFilter, а поле metricFilterClauses
– списки объектов MetricFilter.
В примере ниже приведено сравнение параметра filters
в запросе версии 3 и поля dimensionFilterClauses
в запросе версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-06-01&end-date=2015-07-31&metrics=ga:users& \
dimensions=ga:browser&filters=ga:browser==Firefox
Версия 4
"reportRequests": [{
"dateRanges": [
{ "endDate": "2014-11-30", "startDate": "2014-11-01" }
],
"metrics": [
{"expression": "ga:pageviews"},
{"expression": "ga:sessions"}
],
"viewId": "XXXX",
"dimensions":[{"name":"ga:browser"}, {"name":"ga:country"}],
"dimensionFilterClauses": [{
"filters": [{
"dimension_name": "ga:browser",
"operator": "EXACT",
"expressions": ["Firefox"]
}]
}]
}]
Синтаксис фильтров в новой версии
Несмотря на то что поле filtersExpression в версии 4 поддерживает синтаксис фильтров версии 3, в котором используется параметр filters
, для фильтрации все равно следует использовать поля dimensionFilterClauses
и metricFilterClauses
.
Ниже приведены примеры параметра filters
в версии 3 и его передачи с помощью поля filtersExpression
в версии 4.
Версия 3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga%XXXX \
&filters=ga:browser==Firefox
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"filtersExpression": "ga:browser==Firefox"
}]
}
Пустые строки
Параметр include-empty-rows
в версии 3 соответствует полю includeEmptyRows
в версии 4. Значение параметра по умолчанию в версии 3 – true, а значение поля по умолчанию в версии 4 – false. Если вы не установили значение параметра в версии 3, после перехода на версию 4 значения поля нужно изменить на true.
В примерах ниже можно сравнить параметр include-empty-rows
в запросе 3 и поле includeEmptyRows
в запросе версии 4.
Версия 3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&include-empty-rows=true
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"includeEmptyRows": "true",
}]
}
Разбивка на страницы
В версии 4 большие объемы результатов разбиваются на страницы с помощью полей pageToken
и pageSize
. Значение поля pageToken
берется из свойства nextPageToken
объекта в ответе.
В примерах ниже параметры start-index
и max-results
в запросе версии 3 сравниваются с полями pageToken
и pageSize
в запросе версии 4.
Версия 3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&start-index=10001&max-results=10000
Версия 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
# Taken from `nextPageToken` of a previous response.
"pageToken": "10000",
"pageSize": "10000",
}]
}
Стандартные параметры
Analytics Reporting API версии 4 поддерживает большинство стандартных параметров запросов, представленных в версии 3. Исключение составляют параметры userIp
и callback
.
В примере ниже приводится сравнение параметра quotaUser
в версии 3 и версии 4.
Конечная точка версии 3
GET https://www.googleapis.com/analytics/v3/data/ga?quotaUser=1X3F2F2
Конечная точка версии 4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet?quotaUser=1X3F2F2
Ответы
Поскольку в версии 4 в одном HTTP-запросе можно отправить сразу несколько объектов ReportRequest, в ответе часто возвращается целый массив отчетов. Каждому отправленному объекту ReportRequest соответствует ответный объект Report.
Отчеты
В объекте Report версии 4 есть три поля верхнего уровня: columnHeader
, data
и nextPageToken
.
Поскольку в тексте ответа версии 4 не возвращаются ответы на все параметры запроса (в отличие от ответа версии 3), интересующие вас параметры нужно указывать в объекте ReportRequest.
Использование поля nextPageToken
было описано в разделе Разбивка на страницы, поэтому теперь рассмотрим объект columnHeader.
Заголовок столбца
Заголовок столбца содержит список названий параметров и объект MetricHeader, который включает список объектов MetricHeaderEntry. Каждый объект MetricHeaderEntry задает название (name
) показателя и его тип (type
): валюта, проценты и т. п.
Это позволяет точнее определить вывод.
В примере ниже сравнивается поле columnHeaders
в ответе версии 3 и поле columnHeader
в версии 4.
Версия 3
"columnHeaders": [
{
"name":"ga:source",
"columnType":"DIMENSION",
"dataType":"STRING"
},{
"name":"ga:city",
"columnType":"DIMENSION",
"dataType":"STRING"
},{
"name":"ga:sessions",
"columnType":"METRIC",
"dataType":"INTEGER"
},{
"name":"ga:pageviews",
"columnType":
"METRIC",
"dataType":"INTEGER"
}
]
Версия 4
"columnHeader": {
"dimensions": [
"ga:source",
"ga:city"
],
"metricHeader": {
"metricHeaderEntries": [
{
"name": "ga:pageviews",
"type": "INTEGER"
},
{
"name": "ga:sessions",
"type": "INTEGER"
}
]
}
},
Строки в отчете
Core Reporting API версии 3 возвращает данные отчета в массиве строк, который включает запрошенные параметры и показатели.
Analytics Reporting API версии 4 возвращает данные в объекте ReportRow, который содержит массив параметров и объектов DateRangeValues, каждый из которых включает один или два диапазона дат, как показано на схеме ниже.
Строки
Версия 3
"rows": [
[
"google",
"Philadelphia",
"60",
"5"
],
[
"google",
"Johnstown",
"21",
"1"
],
[
"google",
"Progress",
"7",
"1"
]
],
Версия 4
"rows": [
{
"dimensions": [
"google",
"Philadelphia"
],
"metrics": [
{
"values": [
"60",
"5"
]
}
]
},
{
"dimensions": [
"google",
"Johnstown"
],
"metrics": [
{
"values": [
"21",
"1"
]
}
]
},
{
"dimensions": [
"google",
"Progress"
],
"metrics": [
{
"values": [
"7",
"1"
]
}
]
}
],
Выборка данных
Когда результаты запрашиваются в виде выборки, Core Reporting API версии 3 возвращает поле containsSampledData
с логическим значением true
.
В Analytics Reporting API версии 4 в этом случае вместо поля с логическим значением возвращаются поля samplesReadCounts
и samplingSpaceSizes
.
Если выборки нет, они не определяются.
В примере с Python ниже указано, как выполняется расчет отчета с выборочными данными.
def ContainsSampledData(report):
"""Determines if the report contains sampled data.
Args:
report (Report): An Analytics Reporting API v4 response report.
Returns:
bool: True if the report contains sampled data.
"""
report_data = report.get('data', {})
sample_sizes = report_data.get('samplesReadCounts', [])
sample_spaces = report_data.get('samplingSpaceSizes', [])
if sample_sizes and sample_spaces:
return True
else:
return False
Ниже приведен пример ответа с выборкой, запрошенной по двум диапазонам дат. Для расчета результатов было проанализировано почти 500 тысяч примеров, а размер выборки составил около 15 млн сеансов.
{
"reports":
[
{
"columnHeader": {
...
},
"data": {
...
"samplesReadCounts": [ "499630","499630"],
"samplingSpaceSizes": ["15328013","15328013"],
}
}
]
}
Синтаксический анализ ответа в версии 4
Код в примере ниже запускает синтаксический анализ и печать ответа Analytics Reporting API версии 4.
Python
def printResponse(self, response):
"""Parses and prints the Analytics Reporting API v4 response"""
for report in response.get('reports', []):
columnHeader = report.get('columnHeader', {})
dimensionHeaders = columnHeader.get('dimensions', [])
metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
rows = report.get('data', {}).get('rows', [])
for row in rows:
dimensions = row.get('dimensions', [])
dateRangeValues = row.get('metrics', [])
for header, dimension in zip(dimensionHeaders, dimensions):
print header + ': ' + dimension
for i, values in enumerate(dateRangeValues):
print 'Date range (' + str(i) + ')'
for metricHeader, value in zip(metricHeaders, values.get('values')):
print metricHeader.get('name') + ': ' + value
Java
public static void printResponse(GetReportsResponse response) {
for (Report report: response.getReports()) {
ColumnHeader header = report.getColumnHeader();
List<String> dimensionHeaders = header.getDimensions();
List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
List<ReportRow> rows = report.getData().getRows();
for (ReportRow row: rows) {
List<String> dimensions = row.getDimensions();
List<DateRangeValues> metrics = row.getMetrics();
for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
System.out.println(dimensionHeaders.get(i) + ": " + dimensions.get(i));
}
for (int j = 0; j < metrics.size(); j++) {
System.out.print("Date Range (" + j + "): ");
DateRangeValues values = metrics.get(j);
for (int k = 0; k < values.size() && k < metricHeaders.size(); k++) {
System.out.println(metricHeaders.get(k).getName() + ": " + values.get(k));
}
}
}
}
}
Обработка ошибок
Формат ответов при ошибках в версии 4 отличается от формата в предыдущей версии, поэтому для его обработки вам потребуется обновить код.
Ниже приведены примеры аналогичных ответов при ошибках из версии 3 и версии 4.
Версия 3
{
"error": {
"errors": [
{
"domain": "global",
"reason": "insufficientPermissions",
"message": "User does not have sufficient permissions for this profile.",
}
],
"code": 403,
"message": "User does not have sufficient permissions for this profile."
}
}
Версия 4
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"detail": "[ORIGINAL ERROR] generic::permission_denied: User does not have sufficient permissions for this profile. [google.rpc.error_details_ext] { message: \"User does not have sufficient permissions for this profile.\" }"
}
]
}
}