PHP Quickstart

Complete the steps described in the rest of this page to create a simple PHP command-line application that makes requests to the Google Drive Activity API.

Prerequisites

To run this quickstart, you need the following prerequisites:

  • PHP 5.4 or greater with the command-line interface (CLI) and JSON extension installed
  • The Composer dependency management tool
  • A Google account

Step 1: Turn on the Google Drive Activity API

Click this button to create a new Cloud Platform project and automatically enable the Google Drive Activity API:

Enable the Google Drive Activity API

In resulting dialog click DOWNLOAD CLIENT CONFIGURATION and save the file credentials.json to your working directory.

Step 2: Install the Google Client Library

composer require google/apiclient:^2.0

See the library's installation page for the alternative installation options.

Step 3: Set up the sample

Create a file named quickstart.php in your working directory and copy in the following code:

drive/activity-v2/quickstart.php
<?php
require __DIR__ . '/vendor/autoload.php';

if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Drive Activity API Quickstart');
    $client->setScopes(Google_Service_DriveActivity::DRIVE_ACTIVITY_READONLY);
    $client->setAuthConfig('credentials.json');
    $client->setAccessType('offline');
    $client->setPrompt('select_account consent');

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            // Request authorization from the user.
            $authUrl = $client->createAuthUrl();
            printf("Open the following link in your browser:\n%s\n", $authUrl);
            print 'Enter verification code: ';
            $authCode = trim(fgets(STDIN));

            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            // Check to see if there was an error.
            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;
}

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_DriveActivity($client);

// Print the recent activity in your Google Drive.
$request = new Google_Service_DriveActivity_QueryDriveActivityRequest();
$request->setPageSize(10);
$results = $service->activity->query($request);

if (count($results->getActivities()) == 0) {
    print "No activity.\n";
} else {
    print "Recent activity:\n";
    foreach ($results->getActivities() as $activity) {
        $time = getTimeInfo($activity);
        $action = getActionInfo($activity->getPrimaryActionDetail());
        $actors = array_map("getActorInfo", $activity->getActors());
        $targets = array_map("getTargetInfo", $activity->getTargets());
        printf("%s: %s, %s, %s\n", $time, truncated($actors), $action, truncated($targets));
    }
}

// Returns a string representation of the first elements in a list.
function truncated($array, $limit = 2)
{
    $contents = implode(', ', array_slice($array, 0, $limit));
    $more = count($array) > $limit ? ', ...' : '';
    return sprintf('[%s%s]', $contents, $more);
}

// Returns the name of a set property in an object, or else "unknown".
function getOneOf($obj)
{
    foreach ($obj as $key => $val) {
        return $key;
    }
    return 'unknown';
}

// Returns a time associated with an activity.
function getTimeInfo($activity)
{
    if ($activity->getTimestamp() != null) {
        return $activity->getTimestamp();
    }
    if ($activity->getTimeRange() != null) {
        return $activity->getTimeRange()->getEndTime();
    }
    return 'unknown';
}

// Returns the type of action.
function getActionInfo($actionDetail)
{
    return getOneOf($actionDetail);
}

// Returns user information, or the type of user if not a known user.
function getUserInfo($user)
{
    if ($user->getKnownUser() != null) {
        $knownUser = $user->getKnownUser();
        $isMe = $knownUser->getIsCurrentUser();
        return $isMe ? "people/me" : $knownUser->getPersonName();
    }
    return getOneOf($user);
}

// Returns actor information, or the type of actor if not a user.
function getActorInfo($actor)
{
    if ($actor->getUser() != null) {
        return getUserInfo($actor->getUser());
    }
    return getOneOf($actor);
}

// Returns the type of a target and an associated title.
function getTargetInfo($target)
{
    if ($target->getDriveItem() != null) {
        return sprintf('driveItem:"%s"', $target->getDriveItem()->getTitle());
    }
    if ($target->getDrive() != null) {
        return sprintf('drive:"%s"', $target->getDrive()->getTitle());
    }
    if ($target->getFileComment() != null) {
        $parent = $target->getFileComment()->getParent();
        if ($parent != null) {
            return sprintf('fileComment:"%s"', $parent->getTitle());
        }
        return 'fileComment:unknown';
    }
    return getOneOf($target);
}

Step 4: Run the sample

Run the sample using the following command:

php quickstart.php

The first time you run the sample, it will prompt you to authorize access:

  1. Browse to the provided URL in your web browser.

    If you are not already logged into your Google account, you will be prompted to log in. If you are logged into multiple Google accounts, you will be asked to select one account to use for the authorization.

  2. Click the Accept button.
  3. Copy the code you're given, paste it into the command-line prompt, and press Enter.

Notes

  • Authorization information is stored on the file system, so subsequent executions will not prompt for authorization.
  • The authorization flow in this example is designed for a command-line application. For information on how to perform authorization in a web application, see Using OAuth 2.0 for Web Server Applications.

Further reading

Troubleshooting

This section describes some common issues that you may encounter while attempting to run this quickstart and suggests possible solutions.

SSL certificate problem: unable to get local issuer certificate

This error indicates that the underlying HTTP libraries can't find a certificate store, and are therefore unable to setup the SSL connection to Google's servers. See the Guzzle library's documentation for information on how to setup a certificate store on your machine.

Uncaught InvalidArgumentException: missing the required redirect URI

This error occurs when the credentials.json file used contains a client ID of the wrong type. This code requires an OAuth client ID of type Other, which will be created for you when using the button in Step 1. If creating your own client ID please ensure you select the correct type.

This app isn't verified.

The OAuth consent screen that is presented to the user may show the warning "This app isn't verified" if it is requesting scopes that provide access to sensitive user data. These applications must eventually go through the verification process to remove that warning and other limitations. During the development phase you can continue past this warning by clicking Advanced > Go to {Project Name} (unsafe).

Send feedback about...

Google Drive Activity API
Need help? Visit our support page.