如何使用 python 请求通过 Google Drive API 上传和删除文件

Gev*_*ezo 5 python python-requests google-drive-api

我正在尝试使用请求将图像上传到谷歌驱动器,但它不起作用,因为请求不断给我状态 401(凭据错误)。我正在使用给我的访问令牌,所以我不知道发生了什么。

这是我的代码:

tokendrive = TOKEN_DRIVE
url = "site_url"
myid = MY_ID
subid = MY_SUB_ID
r = requests.get(url)
headers = {'Authorization': 'Bearer ' + tokendrive} 
para = {"name": submission.id + ".png",
        "parents": [myid]}
files = {"data": ("metadata", json.dumps(para), "application/json; charset=UTF-8"),
         "file": io.BytesIO(requests.get(url).content)}
response = requests.post("https://www.googleapis.com/upload/drive/v3/files",headers=headers,files=files)
print(response.text)
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 8

我相信您的目标和目前的情况如下。

  • 您想要将文件上传到 Google 云端硬盘。
  • 您想要删除 Google 云端硬盘上的文件。
  • 你想使用requestpython 模块来实现这一点。
  • 您想要从您的端点使用 Drive API v3。
  • 您的访问令牌可用于使用 Drive API 上传和删除文件。

修改要点:

  • 如果您的访问令牌可用于将文件上传到 Google Drive,则需要修改使用访问令牌的脚本。在这种情况下,请修改TokenBearer。我认为您的错误原因可能是由于此原因。
  • 当使用Drive API v3时, 的属性parents"parents": [myid]。并且在现阶段,请在此使用一个文件夹ID。
  • 对于 Drive API v3,文件名可以用name代替title. title用于 Drive API v2。

当以上几点反映到您的脚本中时,它会变成如下所示。

修改后的脚本:

此修改后的脚本将文件上传到 Google Drive。在使用此脚本之前,请再次确认您要使用的变量。

headers = {'Authorization': f'Bearer {tokendrive}'} # or 'Bearer ' + tokendrive
para = {
    "name": "image_url.jpg",
    "parents": [myid]
}
files = {
    "data": ("metadata", json.dumps(para), "application/json; charset=UTF-8"),
    "file": io.BytesIO(requests.get(submission.url).content)
}
response = requests.post(
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",
    headers=headers,
    files=files
)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
  • 在此脚本中,返回以下值。

      {
       "kind": "drive#file",
       "id": "###",
       "name": "image_url.jpg",
       "mimeType": "image/jpeg"
      }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在此修改后的脚本中,上传的最大文件大小为 5 MB。当您要上传超过5MB的文件时,请使用断点续传。在这种情况下,我认为该线程可能有用。参考号

示例脚本:

此示例脚本删除 Google 云端硬盘上的文件。

fileId = '###' # Please set the file ID you want to delete.
headers = {'Authorization': f'Bearer {tokendrive}'} # or 'Bearer ' + tokendrive
response = requests.delete(
    "https://www.googleapis.com/drive/v3/files/" + fileId,
    headers=headers,
)
print(response.text)
Run Code Online (Sandbox Code Playgroud)
  • 在这种情况下,不会返回任何值。这是当前的规范。

  • 重要提示:此脚本会完全删除fileId. 所以请小心这一点。我想建议使用示例文件进行测试。

参考: