对于必须跟踪文件更改的 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
方法订阅更新日志中的更新。通知不包含更改的详细信息。而是表示有新更改可用。如需检索实际更改,请按照获取更改中所述的方式轮询更改 Feed。
如需了解详情,请参阅资源更改通知。