Cómo pasar sobre nextPageToken usando el inicio rápido de Python de GoogleDrive

Mi objective es tener una lista de todos los elementos y carpetas en el Google Drive de todos. Estoy empezando a tratar de asegurarme de que el script funcione por mi cuenta. He leído portada a cubierta la documentación de la API REST de Drive y, finalmente, encontré este código, que también se puede encontrar aquí .

from __future__ import print_function import httplib2 import os import sys from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage reload(sys) sys.setdefaultencoding('utf-8') try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None # If modifying these scopes, delete your previously saved credentials # at ~/.credentials/drive-python-quickstart.json SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Drive API Python Quickstart' def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, 'drive-python-quickstart.json') store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials def main(): """Shows basic usage of the Google Drive API. Creates a Google Drive API service object and outputs the names and IDs for up to 10 files. """ credentials = get_credentials() http = credentials.authorize(httplib2.Http()) service = discovery.build('drive', 'v3', http=http) results = service.files().list( pageSize=1000,fields="nextPageToken, files(mimeType, name)").execute() items = results.get('files', []) if not items: print('No files found.') else: print('Files:') for item in items: print('{0} ({1})'.format(item['name'], item['mimeType'])) if __name__ == '__main__': main() 

Mi problema es con nextPageToken y cómo usarlo correctamente. El PageSize máximo de PageSize es 1000, por lo que debo pasar por el siguiente nextPageToken , recuperarlo del JSON resultante, volver a colocarlo en el bucle original (¿línea 66?), Para obtener otros 1000 resultados. ¿Cómo hago esto?

Related of "Cómo pasar sobre nextPageToken usando el inicio rápido de Python de GoogleDrive"

Veamos la documentación de la API de Google Drive para el método File: list.

En los campos de su solicitud, le está pidiendo a nextPageToken , el resultado contendrá el token para la siguiente página (si existe la siguiente página). El resultado será algo así:

 { ..., "nextPageToken": "V1*3|0|XXXXXX", "files": [ { ... },... ] } 

puede extraer el valor de nextPageToken como:

 token = results.get('nextPageToken', None) 

El método List puede tomar el parámetro de cadena pageToken :

El token para continuar una solicitud de lista anterior en la página siguiente. Esto debe establecerse en el valor de ‘nextPageToken’ de la respuesta anterior.

Simplemente configure el parámetro pageToken en la siguiente solicitud para obtener la siguiente página de resultados:

  results = service.files().list( pageSize=1000, pageToken=token, fields="nextPageToken, files(mimeType, name)").execute() items = results.get('files', []) 

Ahora puedes hacer fácilmente un bucle para obtener todos los resultados.

Intentaré demostrar el concepto por ti, pero harás la implementación en Python. La respuesta corta es, nextPageToken . nextPageToken s le permite recuperar los resultados de la página siguiente.

introduzca la descripción de la imagen aquí

Cuando realiza una solicitud GET, siempre se incluirá nextPageToken en la respuesta, por lo que si obtuvo 1000 resultados pero solo desea mostrar 20 por página, puede obtener los 980 archivos restantes utilizando nextPageToken.

Ejecuta esta URL y verás algo como:

 "kind": "drive#fileList", "nextPageToken": "V1*3|0|CjkxOHY2aDdROE9JYkJGWUJEaU5Ybm1OVURSemJTcWFMa2lRQlVJSnVxYmI2YkYzMmhnVHozeWkwRnASBxCqqcG4kis", "incompleteSearch": false, 

El valor de nextPageToken aquí es lo que usas para ir a la página siguiente. Cuando llegue a la página siguiente y tenga más resultados, se generará una nueva nextPageToken para usted hasta que vea / obtenga todos los resultados (980-1000).

Tuve un poco de problemas con esto. No leí el ejemplo lo suficientemente cerca como para darme cuenta de que nextPageToken & newStartPageToken no eran lo mismo.

Divido un poco las funciones y agregué un bucle. Básicamente, devuelva el startPageToken y repita la misma función / llame a la función según sea necesario.

 from __future__ import print_function import httplib2 import os #julian import time from apiclient import discovery from oauth2client import client from oauth2client import tools from oauth2client.file import Storage try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None # If modifying these scopes, delete your previously saved credentials # at ~/.credentials/drive-python-quickstart.json SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly' CLIENT_SECRET_FILE = 'client_secret.json' APPLICATION_NAME = 'Drive API Python Quickstart' def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ home_dir = os.path.expanduser('~') credential_dir = os.path.join(home_dir, '.credentials') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir,'drive-python-quickstart.json') store = Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print('Storing credentials to ' + credential_path) return credentials def main(): """Shows basic usage of the Google Drive API. Creates a Google Drive API service object and outputs the names and IDs for up to 10 files. """ credentials = get_credentials() http = credentials.authorize(httplib2.Http()) service = discovery.build('drive', 'v3', http=http) saved_start_page_token = StartPage_v3(service) saved_start_page_token = DetectChanges_v3(service, saved_start_page_token) starttime=time.time() while True: saved_start_page_token = DetectChanges_v3(service, saved_start_page_token) time.sleep(10.0 - ((time.time() - starttime) % 10.0)) def StartPage_v3(service): response = service.changes().getStartPageToken().execute() print('Start token: %s' % response.get('startPageToken')) return response.get('startPageToken') def DetectChanges_v3(service, saved_start_page_token): # Begin with our last saved start token for this user or the # current token from getStartPageToken() page_token = saved_start_page_token; while page_token is not None: response = service.changes().list(pageToken=page_token, spaces='drive').execute() for change in response.get('changes'): # Process change mimeType = change.get('file').get('mimeType') print( 'Change found for: %s' % change) 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') return saved_start_page_token if __name__ == '__main__': main()