use*_*952 15 python google-drive-api oauth2
我尝试了多种方法从谷歌驱动器通过oauth和API下载文件,但是我无法下载文件.我相信我已经正确认证了.运行我的代码后,看起来下载文件成功(没有错误),但没有下载文件.
这是我到目前为止尝试的代码:
def download_file(file_id, mimeType):
if "google-apps" in mimeType:
return
request = drive_service.files().get(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print "Download %d%%." % int(status.progress() * 100)
Run Code Online (Sandbox Code Playgroud)
但是,这会导致"下载100%".被打印到控制台,但没有下载文件.
我也尝试过:
def download2(download_url):
resp, content = drive_service._http.request(download_url)
if resp.status == 200:
print 'Status: %s' % resp
return content
else:
print 'An error occurred: %s' % resp
return None
Run Code Online (Sandbox Code Playgroud)
这也不会产生下载的文件,但它确实给了我200条消息.
这两个似乎都正确地与API联系.我需要做一些额外的步骤来实际获取计算机上的文件吗?
编辑:
这是我的代码的其余部分:
import json
import webbrowser
import httplib2
import io
from apiclient.http import MediaIoBaseDownload
from apiclient import discovery
from oauth2client import client
if __name__ == '__main__':
flow = client.flow_from_clientsecrets(
'client_secrets.json',
scope='https://www.googleapis.com/auth/drive.readonly',
redirect_uri='urn:ietf:wg:oauth:2.0:oob')
auth_uri = flow.step1_get_authorize_url()
webbrowser.open(auth_uri)
auth_code = raw_input('Enter the auth code: ')
credentials = flow.step2_exchange(auth_code)
http_auth = credentials.authorize(httplib2.Http())
drive_service = discovery.build('drive', 'v3', http_auth) #also tried v2
files = drive_service.files().list().execute()
for f in files['files']:
#call one of the two download methods with the proper arguments
Run Code Online (Sandbox Code Playgroud)
use*_*952 23
从BytesIO更改为FileIO允许实际下载文件.这是我修改代码的行:
fh = io.FileIO(filename, 'wb')
Run Code Online (Sandbox Code Playgroud)
这是允许我下载文件的完整代码:
def download_file(file_id, mimeType, filename):
if "google-apps" in mimeType:
# skip google files
return
request = drive_service.files().get_media(fileId=file_id)
fh = io.FileIO(filename, 'wb')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print "Download %d%%." % int(status.progress() * 100)
if __name__ == '__main__':
flow = client.flow_from_clientsecrets(
'client_secrets.json',
scope='https://www.googleapis.com/auth/drive.readonly',
redirect_uri='urn:ietf:wg:oauth:2.0:oob')
auth_uri = flow.step1_get_authorize_url()
webbrowser.open(auth_uri)
print auth_uri
auth_code = raw_input('Enter the auth code: ')
credentials = flow.step2_exchange(auth_code)
http_auth = credentials.authorize(httplib2.Http())
drive_service = discovery.build('drive', 'v3', http_auth)
files = drive_service.files().list().execute()
for f in files['files']:
print f['name']
download_file(f['id'], f['mimeType'], f['name'])
Run Code Online (Sandbox Code Playgroud)
该文件正在下载,但谷歌给出的示例对该文件没有任何作用.
您只需要像这样返回BytesIO缓冲区的内容(只需在末尾添加一个返回)...
def download_file(service, file_id):
request = service.files().get_media(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download %d%%." % int(status.progress() * 100))
return fh.getvalue()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10436 次 |
| 最近记录: |