作为一名学生,我有一个谷歌账户。这个账户由我所在的大学管理,最近大学通知我们,学生的账户现在可以"无限"存储Drive等
为了用它执行备份,我在GoogleAPI控制台中创建了一些服务帐户(XXX@developer.gserviceaccount.com)。但事实证明,这些帐户的存储空间限制在15GB,也就是说,当试图将文件上传到其中一个已经有15GB的服务帐户时,我会收到一个错误"客户端超过了他的存储配额"。
我问过大学管理员,他们不知道如何提供帮助,甚至看不到服务帐户的电子邮件(XXX@developer.gserviceaccount.com)在托管帐户列表中。
因此,问题是(我或大学管理员(应该做些什么来删除(或增加(我的服务帐户的存储配额,而这些帐户是用"无限"学生帐户打开的。
更新:正在尝试@DaImTo建议:
因此,我在Drive web界面中创建了一个文件夹,并与我的服务帐户共享。然后,使用服务帐户,我将一个文件上传到该文件夹(使用PyDrive库(:
file1 = drive.CreateFile({'title': 'test2', 'parents': [{"kind": "drive#fileLink", "id": shared_folder_id}]})
file1.SetContentString('some text')
file1.Upload()
print 'File ID: %s' % file1['id']
permissions = file1.auth.service.permissions().list(fileId=file1['id']).execute()
print "permissions:", permissions
输出:
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'}
因此,上传的文件自动具有两个权限:1.服务帐户为"所有者"2.我的主要账户是"作家">
事实上,我可以在web界面中看到该文件,对其进行编辑、删除等。但是,由于服务帐户是所有者,该文件被计入服务帐户存储配额,因此这并不能解决我的问题,即我的备份应用程序仍不能使用超过15GB的文件。
我试图将所有权转移到我的主帐户:
file1 = drive.CreateFile({'id': file_id})
permissions = file1.auth.service.permissions().list(fileId=file1['id']).execute()
myperm_id = permissions['items'][1]['id'] # this is the second permission, i.e. of my main account
myperm = file1.auth.service.permissions().get(fileId=file1['id'], permissionId=myperm_id).execute()
myperm['role'] = 'owner'
file1.auth.service.permissions().update(fileId=file1['id'], permissionId=myperm['id'], body=myperm).execute()
得到一个错误:
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">
我试图附加transferOwnership="True":
file1.auth.service.permissions().update(fileId=file1['id'], permissionId=myperm['id'], body=myperm, transferOwnership='True').execute()
得到了相同的错误。我被困在这里了。
顺便说一句,在谷歌帮助转移文件所有权他们说:"如果你是谷歌应用程序的用户,你不能将所有权转移给你域外的其他人。">
服务帐户是而不是你。把一个服务帐户想象成一个虚拟的谷歌用户,它有自己的谷歌驱动器帐户,谷歌日历帐户。。。
它可能与在谷歌开发者控制台中可以访问它的开发者松散相关,如果使用服务帐户的应用程序开始向谷歌驱动器发送垃圾邮件,开发者控制台帐户将被关闭。但除此之外,您和您创建的任何服务帐户都是独立的实体。在您允许它访问您的无限驱动器帐户之前,它无法访问您的无限制驱动器帐户。(希望我有一个无限的驱动器帐户(
现在它是一个实体,但我不太确定学校是否能让它进入。真的,我不确定我是否愿意,它会从我身上删除服务帐户的一部分控制权。一些学校管理员可能有一天会删除它,然后破坏一切。。。。。
我建议你这样做,让服务帐户访问你的谷歌帐户。打开谷歌驱动器的网络版本。我建议你创建一个新目录。在共享权限中,获取服务帐户的电子邮件地址,并授予其对该目录的完全访问权限。然后它应该能够上传到你惊人的无限驱动器帐户的目录。
更新只是想了想:一旦你允许它访问你的驱动器目录,你可能必须检查它可以访问哪些目录。你需要确保它上传到你共享的驱动器,而不是它的根目录。
更新权限:
您可能正在使用file.insert上载文件。这只是第一步。
一旦你上传了文件,你就需要对其进行修补,并更改权限,因为你个人而不是服务帐户可以访问该文件。上传文件时,服务帐户仍然OWNED。
您需要使用Files:patch来更新对该文件的权限,并授予您访问该文件的服务帐户权限。
不幸的是,(目前(无法在上传文件时设置文件的权限。我不确定这是一个错误还是不受支持。几天前我创建了一个问题请求。问题3717:谷歌驱动api,上传文件共享权限
似乎不可能将服务帐户上传的文件的所有权转移到主帐户。
最后,我放弃了服务帐户的方法,按照这种方法以普通用户的身份运行我的应用程序。
一旦完成了上面描述的步骤,我就创建了这样的驱动器服务:
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界面中的"我",并且它们被计入我的主帐户的存储配额,所以我的目标达到了。