使用 Google 服务帐号恢复上传视频



我正在使用 Google 服务帐号使用断点续传方法将视频上传到 Google 云端硬盘。python代码运行良好,但我遇到了Google服务帐户存储问题。

似乎Google服务帐户只能有15 GB的存储空间。即使我将视频上传到常规的 Google 云端硬盘文件夹,该视频仍归服务帐号所有。因此,我尝试将视频的所有者转移到其他帐户,但没有奏效,错误bad request. User message: "You can't yet change the owner of this item. (We're working on it.)

下面是我的python代码,它从服务帐户生成访问令牌并执行可恢复上传

credentials = ServiceAccountCredentials.from_json_keyfile_name(
'creds.json',
scopes='https://www.googleapis.com/auth/drive'
)
delegated_credentials = credentials.create_delegated('service_account_email')
access_token = delegated_credentials.get_access_token().access_token

filesize = os.path.getsize(file_location)
# Retrieve session for resumable upload.
headers1 = {"Authorization": "Bearer " + access_token, "Content-Type": "application/json"}
params = {
"name": file_name,
"mimeType": "video/mp4",
"parents": [folder_id]
}
r = requests.post(
"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",
headers=headers1,
data=json.dumps(params)
)
location = r.headers['Location']
# Upload the file.
headers2 = {"Content-Range": "bytes 0-" + str(filesize - 1) + "/" + str(filesize)}
r = requests.put(
location,
headers=headers2,
data=open(file_location, 'rb')
)

是否有解决方法或提高Google服务帐户的存储限制?

任何建议将不胜感激。谢谢!

  • 您希望使用服务帐号将可恢复式上传内容上传到云端硬盘。
  • 您希望视频的所有者不是服务帐号,而是具有足够云端硬盘存储空间的常规帐号。

如果正确,您只需将全网域权限委派给服务帐号,以便它可以代表网域中的任何用户执行操作,并在上传文件时冒充您希望成为文件所有者的帐号。

委派全域权限:

授予域范围权限的过程说明如下:

  • 在服务帐号页面上,选择您的服务帐号,然后在编辑 SA 时点击SHOW DOMAIN-WIDE DELEGATION,然后在刚刚显示的内容上选中启用 G Suite 全网域委派选项。
  • 完成此操作后,请转到管理控制台,然后转到主菜单>"安全> API 控件"。
  • 在"域
  • 范围委派"窗格中选择"管理域范围委派",然后单击">新增"。
  • 填写相应的字段:(1( 在">客户端 ID"中,输入 SA 的客户端 ID,您可以在凭据 JSON 文件和服务帐户页面上找到该 ID,以及 (2( 在OAuth作用域中,添加与你希望 SA 代表域中的用户访问的资源对应的作用域。在这种情况下,我想这只是https://www.googleapis.com/auth/drive.
  • 单击"授权"后,您已授予服务帐户代表域中的任何用户访问资源的能力。

模拟其他用户:

现在,服务帐户模拟域中的任何用户,但您必须指定希望它模拟的用户。为此,您只需对代码进行少量更改即可。现在,您正在通过create_delegated委派凭据时设置service_account_email

delegated_credentials = credentials.create_delegated('service_account_email')

也就是说,服务帐户代表服务帐户执行操作。如果您不想模拟另一个帐户,则实际上不需要此行代码(它没有任何效果,因为credentialsdelegated_credentials都引用同一帐户(服务帐户(。

但是,由于您希望使用服务帐户代表另一个帐户执行操作,因此必须在此行中指定此其他帐户的电子邮件地址:

delegated_credentials = credentials.create_delegated('user_account_email')

这是您需要在代码中执行的唯一更改。如果您已授予全网域授权,则服务帐号的行为将如同其他用户一样。就像上传文件的其他用户一样,因此该用户将是文件的所有者。

注意:

  • 您正在使用已弃用的库 (oauth2client(。由于这仍然有效,现在没有真正需要这样做,但请考虑将您的代码更改为 google-auth。

参考:

  • 将网域范围的权限委派给服务帐号

最新更新