変更を取得する

ファイルの変更を追跡する必要がある Google ドライブ アプリの場合、changes コレクションを使用すると、ユーザーと共有されている変更を含め、すべてのファイルの変更を効率的に検出できます。ファイルが変更された場合、コレクションは各ファイルの現在の状態を提供します。

スタートページトークンを取得する

アカウントの現在の状態のページトークンをリクエストするには、changes.getStartPageToken を使用します。このトークンを保存して、changes.list の最初の呼び出しで使用します。

現在のページトークンを取得するには:

Java

drive/snippets/drive_v3/src/main/java/FetchStartPageToken.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.StartPageToken;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use-case of Drive's fetch start page token */
public class FetchStartPageToken {

  /**
   * Retrieve the start page token for the first time.
   *
   * @return Start page token as String.
   * @throws IOException if file is not found
   */
  public static String fetchStartPageToken() throws IOException {
        /*Load pre-authorized user credentials from the environment.
        TODO(developer) - See https://developers.google.com/identity for
        guides on implementing OAuth2 for your application. */

    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();
    try {
      StartPageToken response = service.changes()
          .getStartPageToken().execute();
      System.out.println("Start token: " + response.getStartPageToken());

      return response.getStartPageToken();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to fetch start page token: " + e.getDetails());
      throw e;
    }
  }

}

Python

drive/snippets/drive-v3/change_snippet/fetch_start_page_token.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def fetch_start_page_token():
  """Retrieve page token for the current state of the account.
  Returns & prints : start page token

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    # pylint: disable=maybe-no-member
    response = service.changes().getStartPageToken().execute()
    print(f'Start token: {response.get("startPageToken")}')

  except HttpError as error:
    print(f"An error occurred: {error}")
    response = None

  return response.get("startPageToken")


if __name__ == "__main__":
  fetch_start_page_token()

PHP

drive/snippets/drive_v3/src/DriveFetchStartPageToken.php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function fetchStartPageToken()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $response = $driveService->changes->getStartPageToken();
        printf("Start token: %s\n", $response->startPageToken);
        return $response->startPageToken;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/FetchStartPageToken.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive's fetch start page token
    public class FetchStartPageToken
    {
        /// <summary>
        /// Retrieve the starting page token.
        /// </summary>
        /// <returns>start page token as String, null otherwise.</returns>
        public static string DriveFetchStartPageToken()
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var response = service.Changes.GetStartPageToken().Execute();
                // Prints the token value.
                Console.WriteLine("Start token: " + response.StartPageTokenValue);
                return response.StartPageTokenValue;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Node.js

drive/snippets/drive_v3/change_snippets/fetch_start_page_token.js
/**
 * Retrieve page token for the current state of the account.
 **/
async function fetchStartPageToken() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive.appdata',
  });
  const service = google.drive({version: 'v3', auth});
  try {
    const res = await service.changes.getStartPageToken({});
    const token = res.data.startPageToken;
    console.log('start token: ', token);
    return token;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

変更を取得

現在ログインしているユーザーの変更リストを取得するには、changes コレクションに GET リクエストを送信します(changes.list で詳しく説明しています)。

changes コレクション内のエントリは時系列順に表示されます(最も古い変更が最初に表示されます)。includeRemoved および restrictToMyDrive クエリ パラメータは、レスポンスに削除済みアイテムまたは共有アイテムを含めるかどうかを決定します。

Java

drive/snippets/drive_v3/src/main/java/FetchChanges.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.ChangeList;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use-case of Drive's fetch changes in file. */
public class FetchChanges {
  /**
   * Retrieve the list of changes for the currently authenticated user.
   *
   * @param savedStartPageToken Last saved start token for this user.
   * @return Saved token after last page.
   * @throws IOException if file is not found
   */
  public static String fetchChanges(String savedStartPageToken) throws IOException {

        /*Load pre-authorized user credentials from the environment.
        TODO(developer) - See https://developers.google.com/identity for
        guides on implementing OAuth2 for your application.*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();
    try {
      // Begin with our last saved start token for this user or the
      // current token from getStartPageToken()
      String pageToken = savedStartPageToken;
      while (pageToken != null) {
        ChangeList changes = service.changes().list(pageToken)
            .execute();
        for (com.google.api.services.drive.model.Change change : changes.getChanges()) {
          // Process change
          System.out.println("Change found for file: " + change.getFileId());
        }
        if (changes.getNewStartPageToken() != null) {
          // Last page, save this token for the next polling interval
          savedStartPageToken = changes.getNewStartPageToken();
        }
        pageToken = changes.getNextPageToken();
      }

      return savedStartPageToken;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to fetch changes: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/change_snippet/fetch_changes.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def fetch_changes(saved_start_page_token):
  """Retrieve the list of changes for the currently authenticated user.
      prints changed file's ID
  Args:
      saved_start_page_token : StartPageToken for the current state of the
      account.
  Returns: saved start page token.

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()
  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    # Begin with our last saved start token for this user or the
    # current token from getStartPageToken()
    page_token = saved_start_page_token
    # pylint: disable=maybe-no-member

    while page_token is not None:
      response = (
          service.changes().list(pageToken=page_token, spaces="drive").execute()
      )
      for change in response.get("changes"):
        # Process change
        print(f'Change found for file: {change.get("fileId")}')
      if "newStartPageToken" in response:
        # Last page, save this token for the next polling interval
        saved_start_page_token = response.get("newStartPageToken")
      page_token = response.get("nextPageToken")

  except HttpError as error:
    print(f"An error occurred: {error}")
    saved_start_page_token = None

  return saved_start_page_token


if __name__ == "__main__":
  # saved_start_page_token is the token number
  fetch_changes(saved_start_page_token=209)

PHP

drive/snippets/drive_v3/src/DriveFetchChanges.php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function fetchChanges()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        # Begin with our last saved start token for this user or the
        # current token from getStartPageToken()
        $savedStartPageToken = readLine("Enter Start Page Token: ");
        $pageToken = $savedStartPageToken;
        while ($pageToken != null) {
            $response = $driveService->changes->listChanges($pageToken, array(
                'spaces' => 'drive'
            ));
            foreach ($response->changes as $change) {
                // Process change
                printf("Change found for file: %s", $change->fileId);
            }
            if ($response->newStartPageToken != null) {
                // Last page, save this token for the next polling interval
                $savedStartPageToken = $response->newStartPageToken;
            }
            $pageToken = $response->nextPageToken;
        }
        echo $savedStartPageToken;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}
require_once 'vendor/autoload.php';

.NET

drive/snippets/drive_v3/DriveV3Snippets/FetchChanges.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive's fetch changes in file.
    public class FetchChanges
    {
        /// <summary>
        /// Retrieve the list of changes for the currently authenticated user.
        /// prints changed file's ID
        /// </summary>
        /// <param name="savedStartPageToken">last saved start token for this user.</param>
        /// <returns>saved token for the current state of the account, null otherwise.</returns>
        public static string DriveFetchChanges(string savedStartPageToken)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                // Begin with our last saved start token for this user or the
                // current token from GetStartPageToken()
                string pageToken = savedStartPageToken;
                while (pageToken != null)
                {
                    var request = service.Changes.List(pageToken);
                    request.Spaces = "drive";
                    var changes = request.Execute();
                    foreach (var change in changes.Changes)
                    {
                        // Process change
                        Console.WriteLine("Change found for file: " + change.FileId);
                    }

                    if (changes.NewStartPageToken != null)
                    {
                        // Last page, save this token for the next polling interval
                        savedStartPageToken = changes.NewStartPageToken;
                    }
                    pageToken = changes.NextPageToken;
                }
                return savedStartPageToken;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Node.js

drive/snippets/drive_v3/change_snippets/fetch_changes.js
/**
 * Retrieve the list of changes for the currently authenticated user.
 * @param {string} savedStartPageToken page token got after executing fetch_start_page_token.js file
 **/
async function fetchChanges(savedStartPageToken) {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive.readonly',
  });
  const service = google.drive({version: 'v3', auth});
  try {
    let pageToken = savedStartPageToken;
    do {
      const res = await service.changes.list({
        pageToken: savedStartPageToken,
        fields: '*',
      });
      res.data.changes.forEach((change) => {
        console.log('change found for file: ', change.fileId);
      });
      pageToken = res.data.newStartPageToken;
      return pageToken;
    } while (pageToken);
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

レスポンスchanges コレクションに nextPageToken が含まれている場合があります。nextPageToken が表示されている場合は、それを使用して変更の次のページを収集できます。リストにない場合は、クライアント アプリケーションで今後使用できるように newStartPageToken をレスポンスに保存する必要があります。ページトークンが保存されると、クライアント アプリケーションは今後の変更を再度クエリできるようになります。

お知らせを受け取る

changes.watch メソッドを使用して、変更ログの更新にサブスクライブします。通知には変更に関する詳細情報は含まれません。代わりに、新しい変更があることを示します。実際の変更を取得するには、変更を取得するの説明に沿って変更フィードをポーリングします。

詳細については、リソースの変更に関する通知をご覧ください。