Google api Google APPs为服务帐户管理“无限”帐户存储配额

Google api Google APPs为服务帐户管理“无限”帐户存储配额,google-api,google-drive-api,google-apps,google-apps-for-education,Google Api,Google Drive Api,Google Apps,Google Apps For Education,作为一名学生,我有一个谷歌账户。该帐户由我所在的大学管理,最近该大学通知我们,学生帐户现在有无限存储空间,可用于驱动器等 为了用它执行备份,我在GoogleAPI控制台中创建了几个服务帐户XXX@developer.gserviceaccount.com. 但事实证明,这些帐户的存储空间限制为15GB,也就是说,当尝试将文件上载到其中一个已经有15GB存储空间的服务帐户时,我遇到一个错误,即客户端的存储空间超出了配额 我问大学管理员,他们不知道如何帮助,甚至看不到服务帐户的电子邮件XXX@dev

作为一名学生,我有一个谷歌账户。该帐户由我所在的大学管理,最近该大学通知我们,学生帐户现在有无限存储空间,可用于驱动器等

为了用它执行备份,我在GoogleAPI控制台中创建了几个服务帐户XXX@developer.gserviceaccount.com. 但事实证明,这些帐户的存储空间限制为15GB,也就是说,当尝试将文件上载到其中一个已经有15GB存储空间的服务帐户时,我遇到一个错误,即客户端的存储空间超出了配额

我问大学管理员,他们不知道如何帮助,甚至看不到服务帐户的电子邮件XXX@developer.gserviceaccount.com在托管帐户列表中

因此,问题是,当我的服务帐户是无限学生帐户时,我或大学管理员应该做些什么来删除或增加这些帐户的存储配额

更新:尝试@DaImTo建议:

因此,我在驱动器web界面中创建了一个文件夹,并将其与我的服务帐户共享。然后,使用服务帐户,我使用library将一个文件上载到该文件夹:

输出:

File ID: XXX
permissions: {u'items': [{u'kind': u'drive#permission', u'name': u'XXX@developer.gserviceaccount.com', u'domain': u'developer.gserviceaccount.com', u'etag': u'"XXX"', u'emailAddress': u'XXX@developer.gserviceaccount.com', u'role': u'owner', u'type': u'user', u'id': u'XXX', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX'},
{u'kind': u'drive#permission', u'name': u'<my name>', u'domain': u'<my school domain>', u'etag': u'"XXX"', u'emailAddress': u'<my name>@<my school domain>', u'role': u'writer', u'type': u'user', u'id': u'XXX', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX'}], u'kind': u'drive#permissionList', u'etag': u'"XXX"', u'selfLink': u'https://www.googleapis.com/drive/v2/files/XXX/permissions?alt=json'}
…并得到一个错误:

googleapiclient.errors.HttpError: <HttpError 403 when requesting https://www.googleapis.com/drive/v2/files/XXX/permissions/XXX?alt=json returned "Insufficient permissions for this file">
我也犯了同样的错误。我被困在这里了

顺便说一句,在谷歌帮助 他们说,如果你是谷歌应用程序用户,你不能将所有权转让给你域外的其他人。

服务帐户不是你的。把一个服务帐户想象成一个虚拟的谷歌用户,它有自己的谷歌驱动器帐户,谷歌日历帐户

它可能与在Google开发者控制台中访问它的开发者有着松散的联系,如果使用服务帐户的应用程序开始向Google drive发送垃圾邮件,开发者控制台帐户将被关闭。但除此之外,您和您创建的任何服务帐户都是独立实体的。在您授予它访问无限驱动器帐户的权限之前,它无法访问您的无限驱动器帐户。希望我有一个无限制的驱动器帐户

现在它是一个实体,但我不确定学校是否能让它进入。真的,我不确定我是否希望它会从我的服务帐户中删除一部分控制权。有一天,一些学校的管理员可能会把它拿走,然后破坏一切

我建议您这样做,让服务帐户访问您的Google帐户。打开Google drive的web版本。我建议您创建一个新目录。在共享权限中,获取服务帐户的电子邮件地址,并授予其对该目录的完全访问权限。然后,它应该能够上传到您惊人的无限驱动器帐户目录

更新只是想了一件事:一旦您授予它访问驱动器目录的权限,您可能必须检查它访问了哪些目录。您需要确保它上载到您共享的驱动器,而不是其根目录

更新权限:

您可能正在使用上载文件。这只是第一步

上传文件后,您需要对其进行修补,并更改权限,因为您个人无法使用服务帐户访问该文件。上载文件时,其所有权仍归服务帐户所有

您将需要使用来更新文件的权限,并授予您作为非服务帐户对文件的访问权限


不幸的是,在上传文件时,此时无法设置文件的权限。我不确定这是一个bug还是它不受支持,我几天前创建了一个问题请求

似乎无法将服务帐户上载的文件的所有权转移到主帐户

最后,我放弃了使用服务帐户的方式,并以普通用户的身份运行我的应用程序

完成此处描述的步骤后,我将创建如下驱动器服务:

import httplib2
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LoadCredentialsFile("GoogleDriveCredentials.txt")
if gauth.credentials is None:
    gauth.LocalWebserverAuth()
elif gauth.access_token_expired:
    print "Google Drive Token Expired, Refreshing"
    gauth.Refresh()
else:
    gauth.Authorize()
gauth.SaveCredentialsFile("GoogleDriveCredentials.txt")
drive = GoogleDrive(gauth) 
其中GoogleDriveCredentials.txt的格式为:

{"_module": "oauth2client.client", "token_expiry": "XXX", "access_token": "XXX", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "XXX", "token_type": "Bearer", "expires_in": 3600}, "client_id": "XXX.apps.googleusercontent.com", "id_token": null, "client_secret": "XXX", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "XXX", "user_agent": null}

现在上传的文件在web界面中的所有者是我,它们被计入我的主帐户的存储配额,所以我的目标实现了。

完美,它可以工作。我可以用Pydrive上传到共享文件夹,只需要提到父母id,这将是共享文件夹的id。我之前的评论为时过早。我仍然被卡住了,这就是为什么:虽然我可以使用服务帐户将文件上载到主无限帐户上的共享文件夹中,但这些文件归服务帐户所有,主帐户具有编写者角色。因此,它们被计入服务帐户存储配额中,因此这并不能解决我的问题。我试图将所有权转移到主帐户,但没有成功,因为出现了权限不足错误。谷歌帮助表示,所有权只能转让给同一域名中的用户。还有其他方法吗?在API中检查服务帐户授予您访问权限所需的权限。谷歌it I
当我靠近pcI时,我会给你发一个链接,恐怕我不理解你的评论。谁需要将访问权限授予谁?哪里我在谷歌上搜索了三天这个问题。我会等待你的链接。谢谢你的帮助。请检查我的更新,你只需要使用files.patch命令更新文件权限。很好,你让它工作了。让我头疼的是你是如何获得服务帐户凭据的?也许您没有填写子字段。如果您填写它,sercice帐户将模拟给定的用户。对我来说,文件的所有者就是被模拟的帐户。@okipol你能再解释一下吗?我知道你找到了通过服务帐户使用原始Gmail帐户空间的方法,或者你可以授予原始Gmail帐户权限?
file1.auth.service.permissions().update(fileId=file1['id'], permissionId=myperm['id'], body=myperm, transferOwnership='True').execute()
import httplib2
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LoadCredentialsFile("GoogleDriveCredentials.txt")
if gauth.credentials is None:
    gauth.LocalWebserverAuth()
elif gauth.access_token_expired:
    print "Google Drive Token Expired, Refreshing"
    gauth.Refresh()
else:
    gauth.Authorize()
gauth.SaveCredentialsFile("GoogleDriveCredentials.txt")
drive = GoogleDrive(gauth) 
{"_module": "oauth2client.client", "token_expiry": "XXX", "access_token": "XXX", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "XXX", "token_type": "Bearer", "expires_in": 3600}, "client_id": "XXX.apps.googleusercontent.com", "id_token": null, "client_secret": "XXX", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "XXX", "user_agent": null}