2017-03-23 1 views
0

Mein Ziel ist es, eine Liste aller Artikel & Ordner in jedem Google Drive zu haben. Ich beginne damit, sicherzustellen, dass das Skript selbstständig funktioniert. Ich habe Cover-to-Cover der Drive REST API Dokumentation gelesen, und fand schließlich diesen Code, der auch here gefunden werden kann.Wie man nextPageToken mit dem Python-Schnellstart von Google Drive umläuft

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() 

Mein Problem ist, mit dem nextPageToken und wie richtig es zu benutzen. Die maximale PageSize ist 1000, also muss ich die nextPageToken Schleife durchlaufen, holen Sie es aus dem resultierenden JSON, setzen Sie es zurück in die ursprüngliche Schleife (Zeile 66?), Um weitere 1000 Ergebnisse zu erhalten. Wie mache ich das?

Antwort

0

Lassen Sie uns das Laufwerk api-Dokumentation für die in den Feldern Ihrer Anfrage File:list Method

google sehen Sie die nextPageToken fragen, ist das Ergebnis das Token für die nextpage enthält (wenn die nextpage vorhanden ist). Das Ergebnis wird so etwas wie dieses:

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

Sie nextpagetoken Wert extrahieren kann wie: für die Fortsetzung

Das Token:

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

Die Liste Methode den String-Parameter pageToken nehmen eine vorherige Liste Anfrage auf der nächsten Seite. Dies sollte auf den Wert von 'nextPageToken' von der vorherigen Antwort gesetzt werden.

Setzen Sie einfach den Parameter token in der nächsten Anforderung die nächste Seite der Ergebnisse zu erhalten:

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

Jetzt können Sie ganz einfach eine Schleife machen alle Ergebnis zu erhalten.

0

Ich werde versuchen, das Konzept für Sie zu demonstrieren, aber Sie werden die Implementierung in Python tun. Die kurze Antwort ist nextPageToken. nextPageToken s können Sie die Ergebnisse von der nächsten Seite abrufen.

enter image description here

Wenn Sie eine GET-Anforderung durchführen, wird ein nextpagetoken immer in der Antwort enthalten sein, so, wenn Sie 1000 Ergebnisse hatte, aber sie wollten nur 20 pro Seite angezeigt werden, können Sie die restlichen 980 Dateien mit nextpagetoken holen .

Run this URL und Sie werden so etwas wie sehen:

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

Der Wert des nextPageToken hier ist das, was Sie auf die nächste Seite zu gelangen verwenden. Wenn Sie auf die nächste Seite kommen und mehr Ergebnisse haben, wird ein neuer nextPageToken für Sie generiert, bis Sie alle Ergebnisse anzeigen/abrufen (980-1000).

+0

Ja! Das ist genau richtig. Vielen Dank. Woran ich Probleme habe, ist die Implementierung dieses 'nextPageToken' in das Skript. – tbw875

0

Ich hatte eine ganze Menge Probleme damit. Ich habe das Beispiel nicht genau genug gelesen, um zu bemerken, dass nextPageToken & newStartPageToken nicht dasselbe war.

Ich habe die Funktionen ein wenig aufgeteilt und eine Schleife hinzugefügt. Im Grunde geben Sie startPageToken zurück und führen Sie die gleiche Funktion durch/rufen Sie die Funktion wie erforderlich auf.

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() 
Verwandte Themen