파일의 변경사항을 추적해야 하는 Google Drive 앱의 경우 changes
컬렉션은 사용자와 공유된 파일 변경사항을 비롯한 모든 파일 변경사항을 감지하는 효율적인 방법을 제공합니다. 파일이 변경되었다면 컬렉션은 각 파일의 현재 상태를 제공합니다.
시작 페이지 토큰 가져오기
계정의 현재 상태에 대한 페이지 토큰을 요청하려면 changes.getStartPageToken
를 사용하세요.
changes.list
를 처음 호출할 때 이 토큰을 저장하고 사용합니다.
현재 페이지 토큰을 가져오려면 다음 단계를 따르세요.
자바
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
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
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
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
/** * 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.list
에 설명된 대로 changes
컬렉션에 GET
요청을 보냅니다.
changes
컬렉션의 항목은 시간순으로 정렬됩니다 (가장 오래된 변경사항이 먼저 나타남). includeRemoved
및 restrictToMyDrive
쿼리 매개변수는 응답에 삭제된 항목 또는 공유된 항목을 포함해야 하는지 여부를 결정합니다.
자바
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
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
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
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
/** * 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
메서드를 사용하여 변경 로그의 업데이트를 구독합니다. 알림에는 변경사항에 관한 세부정보가 포함되지 않습니다. 대신 새 변경사항을 사용할 수 있음을 나타냅니다. 실제 변경사항을 검색하려면 변경사항 가져오기에 설명된 대로 변경사항 피드를 폴링합니다.
자세한 내용은 리소스 변경 알림을 참고하세요.