如何使用 Python 和 Drive API v3 从 Google Drive 下载文件
问题描述
我尝试使用 python 脚本将文件从 Google Drive 下载到我的本地系统,但在运行 Python 脚本时遇到了禁止"问题.脚本如下:
I have tried downloading file from Google Drive to my local system using python script but facing a "forbidden" issue while running a Python script. The script is as follows:
import requests
url = "https://www.googleapis.com/drive/v3/files/1wPxpQwvEEOu9whmVVJA9PzGPM2XvZvhj?alt=media&export=download"
querystring = {"alt":"media","export":"download"}
headers = {
'Authorization': "Bearer TOKEN",
'Host': "www.googleapis.com",
'Accept-Encoding': "gzip, deflate",
'Connection': "keep-alive",
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.url)
#
import wget
import os
from os.path import expanduser
myhome = expanduser("/home/sunarcgautam/Music")
### set working dir
os.chdir(myhome)
url = "https://www.googleapis.com/drive/v3/files/1wPxpQwvEEOu9whmVVJA9PzGPM2XvZvhj?alt=media&export=download"
print('downloading ...')
wget.download(response.url)
在这个脚本中,我遇到了禁止的问题.我在脚本中做错了吗?
In this script, I have got forbidden issue. Am I doing anything wrong in the script?
我还尝试了另一个在 Google Developer 页面上找到的脚本,如下所示:
I have also tried another script that I found on a Google Developer page, which is as follows:
import auth
import httplib2
SCOPES = "https://www.googleapis.com/auth/drive.scripts"
CLIENT_SECRET_FILE = "client_secret.json"
APPLICATION_NAME = "test_Download"
authInst = auth.auth(SCOPES, CLIENT_SECRET_FILE, APPLICATION_NAME)
credentials = authInst.getCredentials()
http = credentials.authorize(httplib2.Http())
drive_serivce = discovery.build('drive', 'v3', http=http)
file_id = '1Af6vN0uXj8_qgqac6f23QSAiKYCTu9cA'
request = drive_serivce.files().export_media(fileId=file_id,
mimeType='application/pdf')
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))
这个脚本给了我一个网址不匹配错误.
那么在 Google 控制台凭据中应该为重定向 URL 提供什么?或任何其他解决方案?我是否必须在两个脚本中从 Google 授权我的 Google 控制台应用程序?如果是这样,授权该应用程序的过程将是什么,因为我还没有找到任何相关文件.
So what should be given for redirect URL in Google console credentials? or any other solution for the issue? Do I have to authorise my Google console app from Google in both the script? If so, what will the process of authorising the app because I haven't found any document regarding that.
解决方案
要向 Google API 发出请求,工作流程实质上如下:
To make requests to Google APIs the work flow is in essence the following:
- 转到 并使用 按钮.(范围:https://www.googleapis.com/auth/drive.readonly 给你).根据您的需要选择内部/外部,现在忽略警告(如果有).
- 为了获得发出 API 请求的有效令牌,应用程序将通过 OAuth 流程来接收授权令牌.(因为需要同意)
- 在 OAuth 流程期间,用户将被重定向到您的 OAuth 同意屏幕,在该屏幕上将要求用户批准或拒绝对您应用所请求范围的访问.
- 如果获得同意,您的应用将收到一个授权令牌.
- 将您请求中的令牌传递给您的授权 API 端点.[2]
- 构建驱动服务以发出 API 请求(您将需要有效的令牌)[1]
注意:
Drive API v3 文件资源的可用方法是这里.
使用 Python Google API 客户端时,您可以使用 export_media()
或 get_media()
作为 每个 Google APIs Client for Python 文档
When using the Python Google APIs Client, then you can use export_media()
or get_media()
as per Google APIs Client for Python documentation
此外,请检查您使用的范围,实际上是否允许您做您想做的事情(从用户的驱动器下载文件)并进行相应的设置.ATM 你的目标范围不正确.请参阅 OAuth 2.0 API 范围
Also, check that the scope you are using, actually allows you to do what you want (Downloading Files from user's Drive) and set it accordingly. ATM you have an incorrect scope for your goal. See OAuth 2.0 API Scopes
- 构建云端硬盘服务:
import google_auth_oauthlib.flow
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
class Auth:
def __init__(self, client_secret_filename, scopes):
self.client_secret = client_secret_filename
self.scopes = scopes
self.flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(self.client_secret, self.scopes)
self.flow.redirect_uri = 'http://localhost:8080/'
self.creds = None
def get_credentials(self):
flow = InstalledAppFlow.from_client_secrets_file(self.client_secret, self.scopes)
self.creds = flow.run_local_server(port=8080)
return self.creds
# The scope you app will use.
# (NEEDS to be among the enabled in your OAuth consent screen)
SCOPES = "https://www.googleapis.com/auth/drive.readonly"
CLIENT_SECRET_FILE = "credentials.json"
credentials = Auth(client_secret_filename=CLIENT_SECRET_FILE, scopes=SCOPES).get_credentials()
drive_service = build('drive', 'v3', credentials=credentials)
- 请求导出或获取文件
request = drive_service.files().export(fileId=file_id, mimeType='application/pdf')
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))
# The file has been downloaded into RAM, now save it in a file
fh.seek(0)
with open('your_filename.pdf', 'wb') as f:
shutil.copyfileobj(fh, f, length=131072)
相关文章