2017-03-23 11 views
0

私の目標は、すべてのGoogleドライブに&というアイテムのすべてのリストを持たせることです。私はスクリプトが自分自身で動作することを確認しようとしています。私はDrive REST APIのドキュメントをカバーして読んだことがあり、最終的にはhereというこのコードが見つかりました。GoogleDriveのPythonクイックスタートを使用してnextPageTokenをループする方法

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

私の問題はnextPageTokenであり、正しく使用する方法です。最大PageSizeは1000ですので、nextPageTokenをループし、結果のJSONからフェッチし、元のループに戻して(66行目)、別の1000個の結果を取得する必要があります。これはどうすればいいですか?

答えて

0

のは、あなたがnextPageTokenを求めているあなたの要求の分野でFile:list Method

GoogleドライブAPIドキュメントを見てみましょう、結果は(NEXTPAGEが存在する場合)NEXTPAGEのためのトークンが含まれています。

継続するためのトークン:

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

一覧メソッドは文字列パラメータpageTokenをとることができますようにあなたがnextPageToken値を抽出することができ

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

: 結果はこのようなものになります次のページの前のリスト要求。 これは前の レスポンスの 'nextPageToken'の値に設定する必要があります。

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

は今、あなたは簡単にすべての結果を得るためにループを作ることができます。

ただ結果の次のページを取得するために、次のリクエストのパラメータpageTokenのを設定します。

0

私はあなたのコンセプトを実証しようとしますが、あなたはPythonで実装を行います。短い答えはnextPageTokenです。 nextPageTokenを使用すると、次のページから結果を取得できます。あなたがGETリクエストを実行すると、あなたが1000の結果を持っていたが、あなたは1ページあたり20を表示したい場合、あなたはnextPageTokenを使用して、残りの980個のファイルを取り出すことができますので、nextPageTokenは常に応答に含まれます

enter image description here

Run this URL、あなたが何かわかります

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

ここnextPageTokenの値は、次のページに到達するために使用するものです。次のページに移動して結果がさらに増えると、すべての結果(980-1000)を表示/取得するまで、新しいnextPageTokenが生成されます。

+0

はい!それはまさに正しいことです。ありがとう。私が問題を抱えているのは、実際には 'nextPageToken'をスクリプトに実装することです。 – tbw875

0

私はこれにかなり問題がありました。私はnextPageToken & newStartPageTokenが同じものではなかったことに気付くほどの例を読んでいませんでした。

私は少し機能を分割し、ループを追加しました。基本的にstartPageTokenを返し、同じ関数をループします/必要に応じて関数を呼び出します。

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() 
関連する問題