Получите временные ряды / данные по метрике с течением времени в Google Analytics API v3 + PHP - PullRequest
1 голос
/ 15 апреля 2019

Я использую CodeIgniter и PHP-библиотеку Analytics v3 API.

РЕДАКТИРОВАТЬ: Первоначально я использовал jayaneetha / GoogleAnalytics-CodeIgniter ... Это репо отлично подходит для начальной настройки CodeIgniter, но, вероятно, менее благоприятно, чемиспользуя библиотеку v4)

Чего я хочу достичь: Построить график сеансов для определенного диапазона дат;в идеале, как массив, так что я могу JSON кодировать его.Например:

$ga_timeseries_data = (
  '2019-01-01' => 123,
  '2019-01-02' => 456,
  // ...
);

Что у меня есть: API настроен и способен вызывать итоговые метрики для определенных диапазонов дат.В частности, возвращаемая информация является суммой данных для указанного диапазона.

Где я застреваю: Как я могу получить данные временных рядов через API?Я не хочу перебирать даты и делать запрос API для каждой даты, так как считаю, что это будет медленно.

Мой код:

function get_timeseries($type = 'sessions',$start_date, $end_date) {
   if ($this->access_token_ready) {
       $analytics = new Google_AnalyticsService($this->client);
       try {
           $optParams = array();
           $optParams['max-results'] = '5000';
           $results = $analytics->data_ga->get('ga:' . $this->ga_api_profileId, $start_date, $end_date, 'ga:' . $type, $optParams);
           return $results->getRows(); // This only outputs sum data.
       } catch (Exception $ex) {
           $error = $ex->getMessage();
           die($error);
       }
   }
}

1 Ответ

1 голос
/ 16 апреля 2019

После еще большего возни я использовал v4 API , который, как мне показалось, был гораздо более надежным и простым.

По сути, моя ошибка заключалась в том, что мне нужно было использовать date в качестве измерения.

Referencing: API отчетов Hello Analytics v4; Быстрый запуск PHP для учетных записей служб ... Я изменил функцию getReport, включив в нее измерение date, и изменил printResults как get_results

Мой код (обратите внимание, это просто ссылка для возврата массива с датой в качестве измерения ... т.е. каждый элемент массива возвращает: date => sessions):

/**
 * Queries the Analytics Reporting API V4.
 *
 * @param service An authorized Analytics Reporting API V4 service object.
 * @return The Analytics Reporting API V4 response.
 */
function getReport($analytics) {

  // Replace with your view ID, for example XXXX.
  $VIEW_ID = "<REPLACE_WITH_VIEW_ID>";

  // Create the DateRange object.
  $dateRange = new Google_Service_AnalyticsReporting_DateRange();
  $dateRange->setStartDate("7daysAgo");
  $dateRange->setEndDate("today");

  // Create the Metrics object.
  $sessions = new Google_Service_AnalyticsReporting_Metric();
  $sessions->setExpression("ga:sessions");
  $sessions->setAlias("sessions");

  //Create the Dimensions object. ## THIS IS WHAT I WAS MISSING##
  $browser = new Google_Service_AnalyticsReporting_Dimension();
  $browser->setName("ga:date");

  // Create the ReportRequest object.
  $request = new Google_Service_AnalyticsReporting_ReportRequest();
  $request->setViewId($VIEW_ID);
  $request->setDateRanges($dateRange);
  $request->setMetrics(array($sessions));

  $body = new Google_Service_AnalyticsReporting_GetReportsRequest();
  $body->setReportRequests( array( $request) );
  return $analytics->reports->batchGet( $body );
}

/**
 * Parses and prints the Analytics Reporting API V4 response.
 *
 * @param An Analytics Reporting API V4 response.
 * ## I modified this because I didn't want to print results, rather I wanted to return an array ##
 */
 function get_results($reports) {
   $data = array();
   for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) {
     $report = $reports[ $reportIndex ];
     $header = $report->getColumnHeader();
     $dimensionHeaders = $header->getDimensions();
     $metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries();
     $rows = $report->getData()->getRows();
     // ## NOTE: I've only done this with one metric/dimension...I'm not sure how well this holds up for multiple metrics/dimensions.
     for ( $rowIndex = 0; $rowIndex < count($rows); $rowIndex++) {
       $row = $rows[ $rowIndex ];
       $dimensions = $row->getDimensions();
       $metrics = $row->getMetrics();
       for ($i = 0; $i < count($dimensionHeaders) && $i < count($dimensions); $i++) {
         $dimensions_arr[] = $dimensions[$i];
       }
       for ($j = 0; $j < count($metrics); $j++) {
         $values = $metrics[$j]->getValues();
         for ($k = 0; $k < count($values); $k++) {
           $metrics_arr[] = $values[$k];
         }

       }
     }
   }

   $data = array_combine($dimensions_arr,$metrics_arr);

   return $data;
 }
...