Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用GoogleDrive';s Python快速入门_Python_Loops_Google Drive Api - Fatal编程技术网

如何使用GoogleDrive';s Python快速入门

如何使用GoogleDrive';s Python快速入门,python,loops,google-drive-api,Python,Loops,Google Drive Api,我的目标是在每个人的谷歌硬盘上都有一个所有项目和文件夹的列表。我开始尝试确保脚本在我自己的情况下工作。我阅读了一本又一本的文档,最终找到了这段代码,也可以找到 我的问题是关于下一个GetOken的,以及如何正确使用它。最大PageSize是1000,因此我必须循环nextPageToken,从生成的JSON中获取它,将它放回原始循环(第66行?),以获得另外1000个结果。如何做到这一点?我将尝试为您演示这个概念,但您将使用Python实现。简单的回答是nextPageTokens允许您从下一页

我的目标是在每个人的谷歌硬盘上都有一个所有项目和文件夹的列表。我开始尝试确保脚本在我自己的情况下工作。我阅读了一本又一本的文档,最终找到了这段代码,也可以找到


我的问题是关于下一个GetOken的
,以及如何正确使用它。最大
PageSize
是1000,因此我必须循环
nextPageToken
,从生成的JSON中获取它,将它放回原始循环(第66行?),以获得另外1000个结果。如何做到这一点?

我将尝试为您演示这个概念,但您将使用Python实现。简单的回答是
nextPageToken
s允许您从下一页检索结果

执行GET请求时,响应中将始终包含nextPageToken,因此如果您有1000个结果,但只希望每页显示20个,则可以使用nextPageToken获取其余980个文件

你会看到这样的情况:

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

这里的
nextPageToken
值是您用来进入下一页的值。当您进入下一页并获得更多结果时,将为您生成一个新的
nextPageToken
,直到您查看/获得所有结果(980-1000)。

让我们查看google drive api文档以了解

在您请求的字段中,您正在询问
nextPageToken
,结果将包含下一页的令牌(如果下一页存在)。 结果会是这样的:

{
 ...,
 "nextPageToken": "V1*3|0|XXXXXX",
 "files": [
  {
   ...
  },...
  ]
}
您可以提取nextPageToken值,如下所示:

token = results.get('nextPageToken', None)
List方法可以采用字符串参数
pageToken

用于在下一页上继续上一个列表请求的令牌。 该值应设置为上一个列表中的“nextPageToken”值 答复

只需在下一个请求中设置参数pageToken即可获得下一页的结果:

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

现在,您可以轻松地进行循环以获得所有结果。

我在这方面遇到了不少麻烦。我没有仔细阅读这个示例,没有注意到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()

当令牌(用于下一页)不为空时,必须循环,如末尾的代码:

(不要忘记安装-->

pip安装--升级google api python客户端google-auth-httplib2 google-auth oauthlib

复制并粘贴此代码(不要忘记在最后更改路径和googleDrive文件夹ID)


是的!完全正确。谢谢。我遇到的问题是在脚本中实现
nextpGetOken
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()
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload
            
# If modifying these scopes, delete the file token.pickle.
SCOPES = [
'https://www.googleapis.com/auth/spreadsheets', 
"https://www.googleapis.com/auth/drive.file", 
"https://www.googleapis.com/auth/drive"
]
             

# FOR AUTHENTICATION
def authenticate():
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)

    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'YOUR PATH FOR THE CREDENTIALS JSON/credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        
        with open('YOUR PATH /token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    
    service = build('drive', 'v3', credentials=creds)
    return service

    
# LISTS TO TAKE ALL FILES AND IDs FROM SPECIFIC FOLDER
listFilesDrive=[]
line = []
        
# TO TAKE ALL FILES FROM SPECIFIC FOLDER
def listFilesFromGoogleFolder(IDFolder):
    service = authenticate()
    # Call the Drive v3 API
    results = service.files().list( q="'{}' in parents".format(FolderIDFromGDrive),
        fields="nextPageToken, files(id, name)").execute()
    items = results.get('files', [])
    # TAKE TOKEN FROM THE NEXT PAGE (IF THERE IS NO ONE, THIS VALUE WILL BE NULL)
    token = results.get('nextPageToken', None)
    #print('token->>',nextPageToken)

    if not items:
        print('No files found.')
    else:
        print('Files:')
        line = []
        for item in items:
            # TAKE FIRST PAGE IN A LIST ->> "listFilesDrive"
            arquivo = item['name']
            IDarquivo = item['id']
            line.append(arquivo)
            line.append(IDarquivo)
            listFilesDrive.append(line)
            line=[]
            print(u'{0} ({1})'.format(item['name'], item['id']))

    # LOOPING WHILE TOKEN FOR OTHER PAGES IS NOT NULL TOKEN 
    while token!=None:
        service = authenticate()
        results = service.files().list( q="'{}' in parents".format(IDFolder),
            pageToken=token,
            fields="nextPageToken, files(id, name)").execute()
        items = results.get('files', [])
        # TAKE A NEW TOKEN FOR THE NEXT PAGE, IF THERE IS NO, THIS TOKEN WILL BE NULL ("None")
        token = results.get('nextPageToken', None)

        if not items:
            print('No files found.')
        else:
            print('Files:')
            linha = []
            for item in items:
                arquivo = item['name']
                IDarquivo = item['id']
                line.append(arquivo)
                line.append(IDarquivo)
                listFilesDrive.append(line)
                line=[]
                print(u'{0} ({1})'.format(item['name'], item['id']))

    print(len(listFilesDrive))
    print(listFilesDrive)
        
        
        
# put your specific information
if __name__ == '__main__':
    FolderIDFromGDrive='YOUR FOLDER ID'
    listFilesFromGoogleFolder(FolderIDFromGDrive)