【问题标题】:service.files().update() returns http 500 error every time in python Google drive APIservice.files().update() 每次在 python Google drive API 中返回 http 500 错误
【发布时间】:2021-12-11 20:05:05
【问题描述】:

我正在使用 google drive python API 来编写获取文件,在 python 中从文件中创建一个 excel,然后将生成的 excel 文件写回 google drive。需要注意的重要一点是,我是从运行在 AWS EC2 实例上的 jupyter notebook 执行的。这通过使用:

file = service.files().create(body=file_metadata,
                              media_body=media,
                              fields='id').execute()

但是,当输入更改时,我需要用新的 excel 覆盖文件。我试图通过两种方式做到这一点。首先是删除文件使用:

service.files().delete(fileId=file_id).execute()

然后创建新文件。通过下面这个方法返回如下错误:

HttpError: https://www.googleapis.com/drive/v3/files/1hLSsfGDMpnvpYTgFpuVS7Suyctc4CQJQwGgcnFuoAnU?返回“用户对此文件没有足够的权限。”。详细信息:"[{'domain': 'global', 'reason': 'insufficientFilePermissions', 'message': '用户没有足够的权限访问此文件。'}]">

当我尝试使用以下方法更改权限时:

def set_permission(service, file_id):
    print(file_id)
    print(service.permissions().list(fileId=file_id).execute())
    try:
        permission = {'type': 'anyone',
                      'value': 'anyone',
                      'role': 'owner'}
        return service.permissions().update(fileId=file_id,body=permission, permissionId="0618xxx9047xxx522413", transferOwnership=True).execute()
    except errors.HttpError as error:
        return print('Error while setting permission:', error)

我明白了:

HttpError: https://www.googleapis.com/drive/v3/files/1hLSsfGDMpnvpYTgFpuVS7Suyctc4CQJQwGgcnFuoAnU?返回“用户对此文件没有足够的权限。”。详细信息:"[{'domain': 'global', 'reason': 'insufficientFilePermissions', 'message': '用户没有足够的权限访问此文件。'}]">

当我尝试使用以下方式更新文件时:

file = service.files().update(fileId=file_id, media_body=media).execute()

我明白了:

HttpError:https://www.googleapis.com/upload/drive/v3/files/1hLSsfGDMpvpYTgFpuVS7Suyctc4CQJQwGgcnFuoAnU?alt=json&uploadType=media 时返回“内部错误”。详细信息:“[{'domain': 'global', 'reason': 'internalError', 'message': 'Internal Error'}]">

我尝试了这里提到的解决方案:Frequent HTTP 500 Internal Errors with Google Drive drive.files.get API,但也无济于事

对于我仍然可以尝试做的事情,我真的很茫然。最好我希望 .update() 方法能够工作,但是忽略 http 500 错误似乎不是一个选项。任何人都知道如何修复 http 500 错误(或者让 delete->create 选项起作用)?

诚挚的问候, 乔纳斯

附:我试图在谷歌开发者控制台中将服务 url 设置为所有者,但这也没有帮助。

【问题讨论】:

  • 您首先拥有此文件的必要权限吗?您的请求使用什么范围?
  • 嗨 ale13,我使用的范围是:scope = ['googleapis.com/auth/drive'].我通过permissionID检查了权限: {'kind': 'drive#permissionList', 'permissions': [{'kind': 'drive#permission', 'id': '061834079xxx4xxx13', 'type': 'user' ,'角色':'作家'},{'种类':'drive#permission','id':'010577xxxx5xxx0821','类型':'用户','角色':'所有者'}]}。我也是谷歌开发控制台中服务帐户的创建者。该驱动器与服务帐户共享。
  • 那么您正在使用服务帐户的凭据来执行此请求吗?您是否使用服务帐户冒充任何人?此外,仅共享驱动器还不够 - 您还需要更改访问级别。
  • 这个特定文件的服务帐户的权限是什么?如果我理解正确,服务帐户对此文件只有“作者”权限,因此您正在观察的行为。您可能会受益于查看本指南here
  • 好的,感谢您的更新;我想我现在明白了,很抱歉造成混乱!但是您提出的请求 - 是代表您还是代表服务帐户?对我来说,似乎 you 正在执行请求,并且由于您只有“writer”权限,因此您不能更改权限(因为服务帐户是所有者)也不能删除文件 -所以出现403错误。

标签: python-3.x permissions google-drive-api http-status-code-500


【解决方案1】:

您在这里遇到的问题似乎源于您试图访问属于服务帐户的文件。

由于您只有writer 权限,因此您不允许更改此文件的权限,也不允许删除它,因此您遇到了403 The user does not have sufficient permissions for this file. 错误。

解决此问题的一种可能方法是执行代表服务帐户更改权限/删除文件的请求。

怎么做?

首先,您应该从帐户所属的 GCP 项目中检索服务帐户的凭据。

然后,为此帐户生成JSON 格式的密钥并下载。

之后,一旦您检索到 JSON 文件,请使用它(而不是您在代表您发出请求时使用的文件)来检索请求的凭据。

服务帐户只是应用程序使用的特殊帐户,而不是个人帐户,它们不属于您的 Google Workspace 域,这与用户帐户不同。您也不能使用它们登录。然而,他们与其他人的不同之处在于,他们可以被用来模仿域中的另一个人,从而获得授权。

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多