В первой части нашей серии мы представили API Google Analytics, в том числе базовое использование. В этой части мы продолжим создание нашей демонстрации и посмотрим, как мы можем расширить ее с помощью большего количества функций.
API Google Analytics
API управления
Как мы уже говорили в первой части, API-интерфейс управления отвечает за получение учетных записей пользователей, свойств, представлений … для нашего первого примера мы получим список учетных записей, доступных для нашего аутентифицированного пользователя.
// app/src/GA_Service.php public function accounts(){ if( !$this->isLoggedIn() ){ //login } $service = new Google_AnalyticsService($this->client); $man_accounts = $service->management_accounts->listManagementAccounts(); $accounts = []; foreach ($man_accounts['items'] as $account) { $accounts[] = [ 'id' => $account['id'], 'name' => $account['name'] ]; } return $accounts; }//accounts // app/controllers/HomeController.php public function accounts(){ $accounts = $this->ga->accounts(); return $accounts; }//accounts // app/routes.php Route::get('/accounts', 'HomeController@accounts');
Внутри GA_Service::accounts
мы создаем новый Google_AnalyticsService
с нашим авторизованным клиентом, а затем запрашиваем у API список учетных записей.
В этом случае результатом является массив, но API также использует объекты, нам просто нужно указать это внутри нашей функции GA_Service::init
. В следующих примерах я собираюсь использовать результаты массива.
$this->client->setUseObjects(true);
Функция listManagementAccounts
возвращает массив, содержащий:
{ kind: "analytics#accounts", username: "[email protected]", totalResults: 3, startIndex: 1, itemsPerPage: 1000, items: [ { id: "4449308", kind: "analytics#account", selfLink: "https://www.googleapis.com/analytics/v3/management/accounts/4449308", name: "[email protected]", permissions: { effective: [ "COLLABORATE", "EDIT", "MANAGE_USERS", "READ_AND_ANALYZE" ] }, created: "2013-10-01T11:04:28.478Z", updated: "2013-10-01T11:04:28.478Z", childLink: { type: "analytics#webproperties", href: "https://www.googleapis.com/analytics/v3/management/accounts/4449308/webproperties" } } ] }
Обратите внимание, что когда вы возвращаете массив в качестве ответа, Laravel автоматически кодирует результат как ответ JSON и отправляет его в браузер.
Результат содержит информацию об общих результатах и некоторую информацию о нумерации страниц. Столбец items
содержит список учетных записей с их идентификаторами, разрешениями и т. Д., Но мы перебрали items
чтобы извлечь только id
и name
из учетных записей.
Если вы хотите, чтобы результат был listManagementAccount
страницы, вы всегда можете передать дополнительные параметры для listManagementAccount
:
$service->management_accounts->listManagementAccounts( [ 'max-results' => $max_results, 'start-index' => $start_index ] );
Давайте предположим, что мы собираемся показать нашим пользователям их список учетных записей, и когда они выбирают один, мы загружаем список свойств, связанных с ним.
// app/src/GA_Service.php public function properties( $account_id ){ if( !$this->isLoggedIn() ){ //login } try { $service = new Google_AnalyticsService($this->client); $man_properties = $service->management_webproperties->listManagementWebproperties($account_id); $properties = []; foreach ($man_properties['items'] as $property) { $properties[] = [ 'id' => $property['id'], 'name' => $property['name'] ]; }//foreach return json_encode($properties); } catch (Google_ServiceException $e) { return Response::json([ 'status' => 0, 'code' => 3, 'message' => $e->getMessage() ]); }//catch }//properties // app/controllers/HomeController.php public function properties( $account_id ){ $properties = $this->ga->properties( $account_id ); return $properties; }//properties // app/routes.php Route::get( '/properties/{account_id}', [ 'uses' => 'HomeController@properties' ] )->where('account_id', '\d+');
GA_Service::properties
принимает идентификатор учетной записи и возвращает список свойств для этой учетной записи. У нас в основном тот же процесс, например, получение учетных записей.
[ { id: "UA-52317977-1", name: "Prop1" }, { id: "UA-52317977-2", name: "Prop1" } ]
Каждое свойство имеет подмножество просмотров. По умолчанию Google добавляет представление « All Web Site Data
для каждого нового свойства.
Используя идентификатор из списка свойств и идентификатор аккаунта, извлеченный из первой части, мы запросим API Google Analytics для получения списка доступных представлений для данного свойства аккаунта.
// app/src/GA_Service.php public function views( $account_id, $property_id ){ if( !$this->isLoggedIn() ){ //login } try { $service = new Google_AnalyticsService($this->client); $man_views = $service->management_profiles->listManagementProfiles( $account_id, $property_id ); $views = []; foreach ($man_views['items'] as $view) { $views[] = [ 'id' => $view['id'], 'name' => $view['name'] ]; }//foreach return json_encode($views); } catch (Google_ServiceException $e) { return Response::json([ 'status' => 0, 'code' => 3, 'message' => $e->getMessage() ]); }//catch }//views // app/controllers/HomeController.php public function views( $account_id, $property_id ){ $views = $this->ga->views( $account_id ,$property_id ); return $views; }//properties // app/routes.php Route::get( '/views/{account_id}/{property_id}', [ 'uses' => 'HomeController@views' ] )->where([ 'account_id', '\d+', 'property_id', '\d+' ]);
В браузере при /views/{account_id}/{property_id}
маршруту /views/{account_id}/{property_id}
мы должны получить что-то похожее на:
// http://localhost:8000/views/44493065/UA-44493083 [ { id: "77278619", name: "All Web Site Data" } ]
API метаданных
Чтобы запросить некоторую статистику из Google Analytics, нам нужно предоставить набор измерений и метрик.
- Метрики: метрики — это индивидуальные измерения активности пользователя в вашей собственности, такие как сеансы и просмотры страниц.
- Измерения: измерения разбивают метрики по некоторым общим критериям, таким как страна или браузер.
Чтобы получить список доступных метаданных, вы можете просто использовать curl
для запроса данных по следующему адресу https://www.googleapis.com/analytics/v3/metadata/ga/columns
.
Google Analytics предоставляет нам атрибут etag
который можно использовать для кэширования ответа, чтобы нам не приходилось запрашивать API по каждому запросу.
$gcurl = new Google_CurlIO; $response = $gcurl->makeRequest( new Google_HttpRequest( "https://www.googleapis.com/analytics/v3/metadata/ga/columns" ));
-
Google_CurlIO
: класс, обернутый некоторыми утилитамиcurl
для работы с кэшированием, аутентификацией и т. Д. — используя этот класс, мы гарантируем, что ответ кэшируется с использованием атрибутаetag
. -
Google_HttpRequest
: класс, представляющий один HTTP-запрос.
Метод makeRequest
возвращает экземпляр Google_HttpRequest
, и мы можем использовать getResponseBody
для получения нашего ответа метаданных.
// app/src/GA_Service.php public function metadata(){ $gcurl = new Google_CurlIO; $response = $gcurl->makeRequest( new Google_HttpRequest( "https://www.googleapis.com/analytics/v3/metadata/ga/columns" ) ); //verify returned data $data = json_decode($response->getResponseBody()); $items = $data->items; $data_items = []; $dimensions_data = []; $metrics_data = []; foreach( $items as $item ){ if( $item->attributes->status == 'DEPRECATED' ) continue; if( $item->attributes->type == 'DIMENSION' ) $dimensions_data[ $item->attributes->group ][] = $item; if( $item->attributes->type == 'METRIC' ) $metrics_data[ $item->attributes->group ][] = $item; }//foreach $data_items['dimensions'] = $dimensions_data; $data_items['metrics'] = $metrics_data; return $data_items; }//metadata // app/controllers/HomeController.php public function metadata(){ $metadata = $this->ga->metadata(); return $metadata; }//metadata // app/routes.php Route::get('/metadata', 'HomeController@metadata');
Теперь при доступе к маршруту /metadata
в вашем браузере вы должны получить массив измерений и еще один для метрик, и каждый из них содержит список сгруппированных элементов.
{ dimensions: { User: [ { id: "ga:userType", kind: "analytics#column", attributes: { type: "DIMENSION", dataType: "STRING", group: "User", status: "PUBLIC", uiName: "User Type", description: "A boolean indicating if a user is new or returning. Possible values: New Visitor, Returning Visitor.", allowedInSegments: "true" } }, ... ] }, metrics: { ... } }
Для ускорения процесса мы будем использовать bootsnipp . Если пользователь вошел в систему, мы покажем домашнюю страницу.
Нам нужно обновить наш HomeController@index
чтобы показать вид домашней страницы.
// app/controllers/HomeController.php public function index(){ if( $this->ga->isLoggedIn() ){ $metadata = $this->metadata(); $dimensions = $metadata['dimensions']; $metrics = $metadata['metrics']; return View::make('home', [ 'dimensions' => $dimensions, 'metrics' => $metrics ]); }//if else{ $url = $this->ga->getLoginUrl(); return View::make('login', [ 'url' => $url ]); } }//index
Как видно из скриншота, когда пользователь выбирает учетную запись, мы асинхронно меняем свойство и вид соответственно. Чтобы добиться этого, я написал несколько простых JS, которые вы можете проверить в финальном репо .
API отчетности
Предоставляя выбранный вид, метрики и измерения, мы можем получить подробную статистику о пользователях и взаимодействиях. Результат после отправки пользователя будет примерно таким:
array(3) { ["items"]=> array(10) { [0]=> array(2) { [0]=> string(9) "Argentina" [1]=> string(1) "2" } [1]=> array(2) { [0]=> string(6) "Brazil" [1]=> string(2) "31" } [2]=> array(2) { [0]=> string(6) "France" [1]=> string(1) "1" } [3]=> array(2) { [0]=> string(7) "Germany" [1]=> string(1) "1" } [4]=> array(2) { [0]=> string(6) "Greece" [1]=> string(1) "1" } //... } ["columnHeaders"]=> array(2) { [0]=> array(3) { ["name"]=> string(10) "ga:country" ["columnType"]=> string(9) "DIMENSION" ["dataType"]=> string(6) "STRING" } [1]=> array(3) { ["name"]=> string(12) "ga:pageviews" ["columnType"]=> string(6) "METRIC" ["dataType"]=> string(7) "INTEGER" } } ["totalResults"]=> int(15) }
Наш GA_Service::report
принимает четыре аргумента: идентификатор представления, дату начала и окончания и массив метрик.
Google не может вернуть все ваши устаревшие данные — вместо этого мы предоставляем дату начала и окончания. В моем примере я запросил результаты прошлого месяца.
Третий параметр — это список метрик, которые мы уже имеем из выбора пользователя.
Четвертый необязательный параметр — это массив опций.
— max-results
: максимальное количество результатов. (мы использовали 10, чтобы ускорить ответ).
— dimensions
: список значений через запятую. ( ga:country,ga:city
)
— filters
: список правил, разделенных запятыми, которые будут применены к результату ( ga:country!=usa,ga:pageviews>100
)
В этом примере мы исключили США из списка измерений и показывали только просмотры страниц, которые больше 100.
— segment
: расширенный идентификатор сегмента, который будет применен к данным.
— sort
: упорядочить результаты по измерениям или метрикам. Можно объединить несколько измерений и метрик. ( ga:country,-ga:pageviews
= порядок по возрастанию ga:country
и по убыванию ga:pageviews
.
— start-index
: может использоваться для нумерации страниц.
// app/src/GA_Service.php public function report( $view, $dimensions, $metrics ){ // to make the request quicker $max_results = 10; // query the last month analytics $now = new DateTime(); $end_date = $now->format('Ym-d'); $start_date = $now->modify('-1 month')->format('Ym-d'); // if( !is_array( $dimensions ) ) // $dimensions = array( $dimensions ); $dimensions = implode( ",", $dimensions ); $metrics = implode( ",", $metrics ); try{ $analytics = new Google_AnalyticsService($this->client); $options = []; $options['dimensions'] = $dimensions; $options['max-results'] = $max_results; $data = $analytics->data_ga->get( $view, $start_date, $end_date, $metrics, $options ); $res = [ 'items' => isset($data['rows']) ? $data['rows'] : [], 'columnHeaders' => $data['columnHeaders'], 'totalResults' => $data['totalResults'] ]; }catch( Google_ServiceException $ex ){ return Response::json([ 'status' => 0, 'code' => 2, 'message' => 'Google analytics internal server error: (Technical details) ' . $ex->getErrors()[0]['message'] ]); }//catch return $res; }//report // app/controller/HomeController.php public function report(){ if( !$this->ga->isLoggedIn() ) return Response::json([ 'status' => 0, 'code' => 1, 'message' => 'Login required' ]); if( !Input::has('dimensions') || !Input::has('metrics') || !Input::has('view') ) return Response::json([ 'status' => 0, 'code' => 1, 'message' => 'Invalid request parametter' ]); $view = 'ga:' . Input::get('view'); $dimensions = Input::get('dimensions'); $metrics = Input::get('metrics'); $report = $this->ga->report( $view, $dimensions, $metrics ); return View::make('report', [ 'columns' => $report['columnHeaders'], 'items' => $report['items'], 'totalResults' => $report['totalResults' ] ]); }//metadata // app/routes.php Route::post('/report', 'HomeController@report');
После вызова Google_AnalyticsService::get
get Google_AnalyticsService::get
мы используем список элементов результатов, заголовки столбцов и итоговые результаты для вывода результата в виде таблицы.
Расширение демо
Теперь давайте посмотрим, как мы можем расширить нашу демонстрацию с помощью фильтров, сортировки и сегментов.
фильтры
Фильтры — это способ исключить некоторые данные из возвращаемого результата. Они принимают следующую форму:
ga:column operator value
-
ga:column
: измерение или идентификатор метрики (например,ga:country
) -
operator
: оператор зависит от выбора метрики или идентификатора столбца измерения, проверьте документы на список операторов. -
value
: значение может быть числом, строкой или регулярным выражением.
Вы можете комбинировать несколько фильтров: вы можете использовать запятую (,) как оператор ИЛИ и точку с запятой (;) как оператор И.
Сегменты
По умолчанию Google Analytics группирует все ваши данные в одну группу под названием All Sessions
. Тем не менее, вы всегда можете выбрать из встроенных сегментов или создать новый в зависимости от ваших потребностей. Вы можете группировать данные по направлениям, типу устройства, возрасту, полу и т. Д.
Вы можете расширить демонстрационную версию, добавив новый элемент select со списком доступных сегментов и передав идентификатор в метод get
как обсуждалось ранее.
// app/src/GA_Service.php public function segments(){ if( !$this->isLoggedIn() ){ //login } $service = new Google_AnalyticsService($this->client); $segments = $service->management_segments->listManagementSegments(); return $segments; }//segments // app/controllers/HomeController.php public function segments(){ $segments = $this->ga->segments(); return $segments; }//segments // app/routes.php Route::get('/segments', 'HomeController@segments');
Вы можете посетить страницу /segments
чтобы увидеть список доступных сегментов с их идентификаторами, и, конечно, вы можете использовать это как вариант, как мы видели ранее.
Завершение
API Google Analytics очень гибок и предоставляет множество функций, но документация еще не завершена и не дает хороших примеров использования. Вы получаете гораздо больше, копаясь в исходном коде и тестируя возможности и ограничения.
В этой серии мы сосредоточились на базовом использовании Google Analytics, но вы можете расширить демонстрационную версию с помощью параметров панели мониторинга Google Analytics.
Вы можете проверить окончательный репо на исходный код этого урока.
Вопросов? Комментарии? Дай мне знать!