1
votes

I am trying to get real time users from google analytics API

I am following this : https://developers.google.com/analytics/devguides/reporting/core/v4/basics

I am posting the data like:

$url = 'https://analyticsreporting.googleapis.com/v4/reports:batchGet';

//Initiate cURL.
$ch = curl_init($url);

$jsonDataEncoded = '{
  "reportRequests":
  [
    {
      "viewId": "109200098",
      "dateRanges": [{"startDate": "2014-11-01", "endDate": "2014-11-30"}],
      "metrics": [{"expression": "ga:users"}]
    }
  ]
}'
;

//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);

//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);

//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 

//Execute the request
$result = curl_exec($ch);

print_r($result);

{ "error": { "code": 401, "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.", "status": "UNAUTHENTICATED" } }

I know I should get some OAuth for this but I am not getting how to do this. Can you please help me with this? Thanks!

index.php and oauth2callback.php

same as here : https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/web-php

Working fine getting session count now i want to use https://developers.google.com/analytics/devguides/reporting/realtime/v3/reference/data/realtime/get#auth for getting rt:activeUsers

I am editing index.php like :

    if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
      // Set the access token on the client.
      $client->setAccessToken($_SESSION['access_token']);

      // Create an authorized analytics service object.
      $analytics = new Google_Service_AnalyticsReporting($client);

      // Call the Analytics Reporting API V4.
      $response = getReport($analytics);

      $optParams = array(
    'dimensions' => 'rt:medium');

try {
  $results = $analytics->data_realtime->get(
      'ga:56789',
      'rt:activeUsers',
      $optParams);
  // Success. 
} catch (apiServiceException $e) {
  // Handle API service exceptions.
  $error = $e->getMessage();
}

      // Print the response.
      printResults($response);

    } else {
      $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
      header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    }

getting error: Undefined property: Google_Service_AnalyticsReporting::$data_realtime

2

2 Answers

1
votes

I am able to do this using updated index.php

<?php

// Load the Google API PHP Client Library.
require_once __DIR__ . '/vendor/autoload.php';

session_start();

$client = new Google_Client();
$client->setAuthConfig(__DIR__ . '/client_secret.json');
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
$service = new Google_Service_Analytics($client);

// If the user has already authorized this app then get an access token
// else redirect to ask the user to authorize access to Google Analytics.
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
  // Set the access token on the client.
  $client->setAccessToken($_SESSION['access_token']);

  // Create an authorized analytics service object.
  $analytics = new Google_Service_AnalyticsReporting($client);

  // Call the Analytics Reporting API V4.
  $response = getReport($analytics);

  // Print the response.
  printResults($response);



    $result = $service->data_realtime->get(
        'ga:<VIEWID CHANGE>',
        'rt:activeVisitors'
    );
    echo "<pre>";
    print_r($result->totalsForAllResults['rt:activeVisitors']);
    echo "</pre>";

} else {
  $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
  header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}


/**
 * 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 = "<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 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.
 */
function printResults($reports) {
  for ( $reportIndex = 0; $reportIndex < count( $reports ); $reportIndex++ ) {
    $report = $reports[ $reportIndex ];
    $header = $report->getColumnHeader();
    $dimensionHeaders = $header->getDimensions();
    $metricHeaders = $header->getMetricHeader()->getMetricHeaderEntries();
    $rows = $report->getData()->getRows();

    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++) {
        print($dimensionHeaders[$i] . ": " . $dimensions[$i] . "\n");
      }

      for ($j = 0; $j < count($metrics); $j++) {
        $values = $metrics[$j]->getValues();
        for ($k = 0; $k < count($values); $k++) {
          $entry = $metricHeaders[$k];
          print($entry->getName() . ": " . $values[$k] . "\n");
        }
      }
    }
  }
}
0
votes

First off if you want access to realtime data then you are using the wrong api. You should be using the realtime api

To authenticate using curl is a little complicated. You will need to get a refresh token first. Once you have that you can use the following to get an access token when ever you need.

curl \ –request POST \ –data ‘client_id=[Application Client Id]&client_secret=[Application Client Secret]&refresh_token=[Refresh token granted by second step]&grant_type=refresh_token’ \ https://accounts.google.com/o/oauth2/token

All you need to do is tack &access_token=token to any request you make to the api.

My full tutorial can be found here Google auth curl

Update:

Remember the real time API is not the same as the Reporting API. If you are still referencing the reporting api then its not going to work. You should be sending a HTTP GET now not a HTTP Post and the end point is

https://www.googleapis.com/analytics/v3/data/realtime  

check the documentation realtime.get the format of the call is diffrent as well

It shouldnt be to hard though something along these lines

https://www.googleapis.com/analytics/v3/data/realtime?id=XXX&metrics=XXX&accesstoken=XXX  

As i said its a HTTP GET so you can just dump it in a browser to test it before you add it to your Curl script.