如何使用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)