【问题标题】:How to upload and delete files with google drive API using python requests如何使用 python 请求通过 google drive API 上传和删除文件
【发布时间】:2021-05-19 08:03:18
【问题描述】:

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

这是我的代码:

tokendrive = "ya29.A0AfH6SMDn1ti-5u8gjLQhHf3ffILkR2_8mSRBoap7hY8ZuIGoFomPhZJAi_hVgORZkBJtBeTDhlPnOeksNZvwrUPgBcuHle5BMqULMBY7Y97fIaMGuOqSAQIrSyXnqLbtDLEwrnCAXfHHSVxtWAbX80pHkarG"
url = "https://www.reddit.com/r/LiminalSpace/comments/lwoipa/i_guess_nobody_woke_me_up/"
myid = "1QoepljKHkjSarx0kCcwEnHjRA5fBP4sU"
subid = lwoipa
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)

【问题讨论】:

标签: python python-requests google-drive-api


【解决方案1】:

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

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

修改点:

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

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

修改脚本:

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

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)
  • 在此脚本中,返回以下值。

      {
       "kind": "drive#file",
       "id": "###",
       "name": "image_url.jpg",
       "mimeType": "image/jpeg"
      }
    
  • 在此修改后的脚本中,上传的最大文件大小为 5 MB。当您要上传超过 5 MB 的文件时,请使用可恢复上传。在那种情况下,我认为这个线程可能有用。 Ref

示例脚本:

此示例脚本会删除 Google Drive 上的一个文件。

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)
  • 在这种情况下,不返回任何值。这是当前的规范。

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

参考资料:

【讨论】:

  • 成功了!但是就是说元数据部分太大了,就是说文件太大了?这是一张小于 2mb 的图片。
  • 除此之外,我有一个关于令牌的问题,因为它在 oauth 页面上说它将每 3600 刷新一次,这意味着它们必须每 3600 秒更改一次?如果是这样,我是否必须通过我的代码访问才能自动更新它?
  • 没关系!我想我明白了!非常感谢你帮助我这么多!现在发生的唯一问题是该文件确实进入了谷歌驱动器上的文件夹,但它不是可打开的图像。它说它是一个图像,它是一个.png,但即使下载它也无法打开。那是唯一剩下的东西。但我不得不说,到目前为止,您对我的帮助很大,非常感谢! (如果需要,我也可以添加文件在帖子中的屏幕截图)
  • 我进行了编辑,现在真正的代码应该发布几张图片,但我发布的版本只发布来自这个特定网址的特定图片。
  • 还有,这个token明显一个小时后就没用了,如果不能使用请给我留言,我会尽快尝试发送一个刷新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
相关资源
最近更新 更多