如何使用Python和Drive API v3下载Google云端硬盘文件

问题描述 投票:0回答:1

我曾尝试使用python脚本从Google驱动器将文件下载到本地系统,但在运行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))

此脚本给我一个uri不匹配错误。所以我想问一下在Google控制台凭据中应该为重定向URL提供什么?或任何其他解决方案?我还想问我是否必须在两个脚本中都从Google 授权我的Google控制台应用程序。如果是这样,由于我还没有找到任何文档来对授权应用进行降级,因此授权应用的过程将如何?任何小的帮助将不胜感激。

python google-drive-api postman
1个回答
0
投票

Google API的工作方式实质上是以下方式:

  1. 转到developer console,如果尚未登录,请登录。
  2. 创建一个云平台项目。
  3. 为您的项目启用您感兴趣的与项目的应用程序一起使用的API(例如:Google Drive API)。>>
  4. 创建并下载OAuth 2.0客户端ID
  5. 凭据,这些凭据将允许您的应用获得使用启用的API的授权。
  6. 转到OAuth consent screen,单击enter image description here,然后使用enter image description here按钮添加示波器。 (范围:您的https://www.googleapis.com/auth/drive.readonly
  7. )。根据您的需要选择“内部/外部”,现在忽略警告(如果有)。
  8. 构建驱动器服务以发出API请求(您将需要有效的令牌)[[1]
  9. ] >>
  10. 要获取用于发出API请求的有效令牌,应用将通过OAuth流程接收授权令牌。 (因为需要征得同意)
  11. 在OAuth流程中,用户将被重定向到您的OAuth同意屏幕,在该屏幕上,系统会要求用户批准或拒绝访问您应用所请求的范围。
  12. 如果获得同意,您的应用将获得授权令牌。
  13. 将请求中的令牌传递到授权的API端点。[[2]

  14. 注意:

    用于Drive API v3的文件资源的可用方法是here。请注意,export_media()get_media()不是可用的方法!


重要:

此外,请检查您正在使用的范围,实际上允许您执行所需的操作(从用户的驱动器下载文件)并进行相应的设置。自动柜员机的目标范围不正确。参见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)
    
    1. 提出导出或获取文件的请求
    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)
    
© www.soinside.com 2019 - 2024. All rights reserved.