В этом руководстве представлены рекомендации по переходу с Core Reporting API v3 на Analytics Reporting API v4.
Введение
Чтобы воспользоваться преимуществами новых функций , представленных в Analytics Reporting API v4, перенесите свой код на использование API. В этом руководстве показаны запросы в Core Reporting API v3 и эквивалентные запросы в Analytics Reporting API v4, чтобы упростить миграцию.
Миграция Python
Если вы разработчик Python, используйте вспомогательную библиотеку GAV4 на GitHub, чтобы преобразовать запросы Google Analytics Core Reporting API v3 в запросы Analytics Reporting API v4.
Конечные точки
Core Reporting API v3 и Analytics Reporting API v4 имеют разные конечные точки и методы HTTP:
v3 Конечная точка
GET https://www.googleapis.com/analytics/v3/data/ga
v4 Конечная точка
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
В следующих примерах сравнивается запрос в версии 3 и эквивалентный запрос в версии 4:
v3
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
v4
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"
}]
}]
}
Клиентские библиотеки и служба обнаружения
Если вы используете Python, JavaScript или другую клиентскую библиотеку, основанную на Google Discovery Service , вам необходимо указать расположение документа обнаружения для Reporting API v4.
Питон
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 уже созданы, но для их создания можно использовать службу обнаружения и генератор API Google .
Запросы
В справочнике API v4 подробно описана структура тела запроса. В следующих разделах описывается миграция параметров запроса версии 3 в параметры запроса версии 4.
Посмотреть идентификаторы
В версии 3 параметр ids
, который принимает «идентификатор таблицы», имеет формат ga:XXXX
, где XXXX
— идентификатор представления (профиля). В версии 4 идентификатор представления (профиля) указывается в поле viewId
тела запроса.
В следующих примерах сравниваются параметр ids
в запросе версии 3 и поле viewId
в запросе версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
...
}]
}
Диапазоны дат
API отчетов Analytics версии 4 позволяет указывать несколько диапазонов дат в одном запросе. Поле dateRanges
принимает список объектов DateRange . В версии 3 вы используете параметры start-date
и end-date
чтобы указать диапазон дат в запросе.
В следующих примерах сравниваются параметры start-date
и end-date
в запросе версии 3 и поле dateRanges
в запросе версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
...
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
....
}]
}
Метрики
Параметр metrics
v3 соответствует полю metrics
v4, которое принимает список объектов Metric .
В следующих примерах сравниваются параметры metrics
в запросе версии 3 и поле metrics
в запросе версии 4:
v3
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 \
...
v4
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
v3 соответствует полю dimensions
v4, которое принимает список объектов измерения .
В следующих примерах сравниваются параметры dimensions
в запросе версии 3 и поле dimensions
в запросе версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&dimensions=ga:country,ga:browser&... \
v4
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; они оба сортируют пользователей в порядке убывания и источники в алфавитном порядке:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&sort=-ga:users,ga:source
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"orderBys": [
{
"fieldName": "ga:users",
"sortOrder": "DESCENDING"
},{
"fieldName": "ga:source"
}],
}]
}
Уровень выборки
Параметр samplingLevel
v3 соответствует полю samplingLevel
v4. В версии 3 принятые значения samplingLevel
— FASTER
, HIGHER_PRECISION
и DEFAULT
; а в версии 4 принятые значения samplingLevel
— SMALL
, LARGE
и DEFAULT
. Обратите внимание, что FASTER
в v3 изменено на SMALL
в v4, HIGHER_PRECISION
на LARGE
.
В следующих примерах сравнивается параметр samplingLevel
в запросе версии 3 и поле samplingLevel
в запросе версии 4:
v3
https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX ...\
samplingLevel=HIGHER_PRECISION
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"samplingLevel": "LARGE"
}]
}
Сегменты
Параметр segment
v3 соответствует полю segments
версии 4, которое принимает список объектов сегмента .
Идентификаторы сегментов
В версии 4, чтобы запросить сегмент по идентификатору сегмента, создайте объект Segment и укажите его идентификатор через поле сегмента .
В следующих примерах сравниваются параметр segment
в запросе версии 3 и поле segments
в запросе версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=gaid::-11
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "gaid::-11"
}]
}]
}
Динамические сегменты
В версии 4 для выражения более сложных определений сегментов используйте поле segments
, включающее объект DynamicSegment .
В следующих примерах сравнивается параметр segment
в запросе версии 3 и поле segments
, содержащее объект DynamicSegment
, в запросе версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
v4
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" ]
}
}]
}]
}
}]
}
}
}]
}]
}
Вы можете объединять условия и последовательности в сегменте:
v3
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
v4
"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"]
}
}]
}]
}]
}
}]
}
}
}]
}]
Синтаксис сегментов v3 в v4
Поле сегмента в API версии 4 поддерживает синтаксис сегмента в API версии 3.
В следующих примерах показано, как параметр segment
в запросе версии 3 поддерживается полем segmentId
в эквивалентном запросе в версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "sessions::condition::ga:medium==referral"
}]
}]
}
Фильтры
Версия 4 использует dimensionFilterClauses
для фильтрации измерений и metricFilterClauses
для фильтрации показателей. dimensionFilterClauses
содержит список объектов DimensionFilter ; а metricFilterClauses
содержит список объектов MetricFilter .
В следующих примерах сравниваются параметр filters
в запросе версии 3 и поле dimensionFilterClauses
в запросе версии 4:
v3
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
v4
"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"]
}]
}]
}]
Синтаксис фильтров v3 в v4
Хотя поле filterExpression в версии 4 поддерживает синтаксис filters
в версии 3, используйте dimensionFilterClauses
и metricFilterClauses
для фильтрации измерений и показателей.
В следующих примерах показано, как параметр filters
в запросе версии 3 поддерживается полем filtersExpression
в эквивалентном запросе в версии 4:
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga%XXXX \
&filters=ga:browser==Firefox
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"filtersExpression": "ga:browser==Firefox"
}]
}
Пустые строки
Параметр include-empty-rows
версии 3 соответствует полю includeEmptyRows
в версии 4. Параметр v3 по умолчанию имеет значение true , тогда как в v4 поле по умолчанию имеет значение false . Если у вас нет значения, установленного в версии 3, вам необходимо установить значение true в версии 4.
В следующих примерах параметр include-empty-rows
в запросе версии 3 сравнивается с полем includeEmptyRows
в запросе версии 4:
v3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&include-empty-rows=true
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"includeEmptyRows": "true",
}]
}
Пагинация
v4 использует поля pageToken
и pageSize
для разбиения на страницы большого количества результатов. pageToken
получается из свойства nextPageToken
объекта ответа.
В следующих примерах параметры start-index
и max-results
в запросе версии 3 сравниваются с полями pageToken
и pageSize
в запросе версии 4:
v3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&start-index=10001&max-results=10000
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
# Taken from `nextPageToken` of a previous response.
"pageToken": "10000",
"pageSize": "10000",
}]
}
Стандартные параметры
Analytics Reporting API версии 4 поддерживает большинство стандартных параметров запроса в API версии 3, за исключением userIp
и параметров callback
.
В следующих примерах сравнивается параметр quotaUser
в запросе версии 3 с параметром в запросе версии 4:
v3 Конечная точка
GET https://www.googleapis.com/analytics/v3/data/ga?quotaUser=1X3F2F2
v4 Конечная точка
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet?quotaUser=1X3F2F2
Ответы
Поскольку версия 4 позволяет отправлять несколько объектов ReportRequest в одном HTTP-запросе, в ответе вы получаете массив объектов отчета. Для каждого отправленного ReportRequest вы получаете в ответ соответствующий отчет .
Отчеты
Отчет версии 4 имеет три поля верхнего уровня: columnHeader
, data
и nextPageToken
.
Поскольку тело ответа версии 4 не включает ответы на все параметры запроса, как это делает ответ версии 3, чтобы получить ответ на определенный параметр запроса, клиентское приложение должно добавить этот параметр в ReportRequest .
Мы уже рассматривали nextPageToken
в разделе «Разбиение на страницы» , поэтому давайте сначала посмотрим на объект columnsHeader .
Заголовок столбца
Заголовок столбца содержит список именованных измерений и объект MetricHeader , который содержит список объектов MetricHeaderEntry . Каждый объект MetricHeaderEntry указывает name
метрики и ее type
(валюта, процент и т. д.), что помогает форматировать выходные данные.
В следующих примерах поле columnHeaders
в ответе версии 3 сравнивается с полем columnHeader
в ответе версии 4:
v3
"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"
}
]
v4
"columnHeader": {
"dimensions": [
"ga:source",
"ga:city"
],
"metricHeader": {
"metricHeaderEntries": [
{
"name": "ga:pageviews",
"type": "INTEGER"
},
{
"name": "ga:sessions",
"type": "INTEGER"
}
]
}
},
Строки отчета
Core Reporting API v3 возвращает данные отчета в массиве строк , который содержит запрошенные параметры и показатели.
API отчетов Analytics версии 4 возвращает данные отчета в объекте ReportRow , который содержит массив измерений и массив объектов DateRangeValues , каждый из которых содержит один или два диапазона дат, как показано на следующей схеме:
Строки
v3
"rows": [
[
"google",
"Philadelphia",
"60",
"5"
],
[
"google",
"Johnstown",
"21",
"1"
],
[
"google",
"Progress",
"7",
"1"
]
],
v4
"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 v3 возвращает логическое поле containsSampledData
, которому присвоено значение true
.
API отчетов аналитики версии 4 не возвращает логическое значение, если данные выбираются; скорее API возвращает поля 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"],
}
}
]
}
Анализ ответа v4
Следующий пример кода анализирует и печатает ответ Analytics Reporting API v4:
Питон
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
Джава
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 и эквивалентный ответ об ошибке в версии 4:
v3
{
"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."
}
}
v4
{
"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.\" }"
}
]
}
}