Статьи

Использование Google Analytics API v3 с PHP: выборка данных

В первой части нашей серии мы представили 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 . Если пользователь вошел в систему, мы покажем домашнюю страницу.

Home Page

Нам нужно обновить наш 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 мы используем список элементов результатов, заголовки столбцов и итоговые результаты для вывода результата в виде таблицы.

Result Table

Расширение демо

Теперь давайте посмотрим, как мы можем расширить нашу демонстрацию с помощью фильтров, сортировки и сегментов.

фильтры

Фильтры — это способ исключить некоторые данные из возвращаемого результата. Они принимают следующую форму:

 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.

Вы можете проверить окончательный репо на исходный код этого урока.

Вопросов? Комментарии? Дай мне знать!