gpt4 book ai didi

python - 如何使用 Python 和 Drive API v3 从 Google Drive 下载文件

转载 作者:行者123 更新时间:2023-12-01 06:26:38 26 4
gpt4 key购买 nike

我尝试使用 python 脚本将文件从 Google Drive 下载到本地系统,但在运行 Python 脚本时遇到“禁止”问题。脚本如下:

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)

在这个脚本中,我遇到了禁止问题。我在脚本中做错了什么吗?

我还尝试了在 Google 开发者页面上找到的另一个脚本,如下所示:

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

此脚本给我一个URL 不匹配错误

那么 Google 控制台凭据中的重定向 URL 应该给出什么?或该问题的任何其他解决方案?我是否必须在这两个脚本中从 Google 授权我的 Google 控制台应用程序?如果是这样,授权应用程序的过程是什么,因为我没有找到任何相关文档。

最佳答案

要向 Google API 发出请求,工作流程本质上如下:

  1. 转到developer console ,如果尚未登录,请登录。
  2. 创建云平台项目。
  3. 为您的项目启用您有兴趣与项目应用一起使用的 API(例如:Google Drive API)。
  4. 创建并下载 OAuth 2.0 客户端 ID 凭据,以便您的应用获得使用已启用 API 的授权。
  5. 前往 OAuth consent screen ,点击enter image description here并使用 enter image description here 添加您的范围按钮。 (范围: https://www.googleapis.com/auth/drive.readonly 适合您)。根据您的需要选择内部/外部,暂时忽略警告(如果有)。
  6. 为了获取发出 API 请求的有效 token ,应用程序将通过 OAuth 流程来接收授权 token 。 (因为需要同意)
  7. 在 OAuth 流程中,用户将被重定向到您的 OAuth 同意屏幕,系统会要求用户批准或拒绝访问您的应用所请求的范围。
  8. 如果获得同意,您的应用将收到授权 token 。
  9. 将请求中的 token 传递给您的授权 API 端点。[ 2 ]
  10. 构建 Drive 服务来发出 API 请求(您将需要有效的 token )[ 1 ]
<小时/>

注意:

Drive API v3 的文件资源的可用方法为 here .

使用 Python Google API 客户端时,您可以使用 export_media()get_media() 作为 per Google APIs Client for Python documentation

<小时/>

重要:

此外,检查您正在使用的范围是否确实允许您执行您想要的操作(从用户的云端硬盘下载文件)并进行相应的设置。 ATM,你的目标范围不正确。请参阅OAuth 2.0 API Scopes

<小时/>

示例代码引用:

  1. 构建云端硬盘服务:
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)

    关于python - 如何使用 Python 和 Drive API v3 从 Google Drive 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60111361/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com