google api - mis - Las aplicaciones de Google administraron una cuota de almacenamiento de cuenta "ilimitada" para la cuenta de servicio
mis proyectos google (2)
Parece que es imposible transferir la propiedad de los archivos cargados por la cuenta de servicio a la cuenta principal.
Finalmente abandoné el enfoque de la cuenta de servicio y seguí este enfoque para ejecutar mi aplicación como mi usuario habitual.
Una vez que se realizaron los pasos descritos, creo el servicio de unidad de esa manera:
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)
Donde GoogleDriveCredentials.txt tiene la forma:
{"_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}
Ahora el propietario de los archivos cargados es "yo" en la interfaz web y se contabilizan en la cuota de almacenamiento de mi cuenta principal, por lo que se alcanza mi objetivo.
Tengo una cuenta de Google como estudiante. Esta cuenta está administrada por mi universidad y recientemente la universidad nos informó que las cuentas de los estudiantes ahora tienen almacenamiento "ilimitado" para Drive, etc.
Para realizar copias de seguridad con esto, creé algunas cuentas de servicio en la consola de API de Google ([email protected]). Pero resulta que el almacenamiento de esas cuentas está limitado a 15 GB, es decir, cuando intento subir archivos a una cuenta de servicio que ya tiene ~ 15GB, me sale un error "el cliente ha superado su cuota de almacenamiento".
Le pregunté a los administradores de la universidad, ellos no saben cómo ayudar e incluso no ven el correo electrónico de la cuenta de servicio ([email protected]) en la lista de cuentas administradas.
Entonces, la pregunta es qué debería hacerse (por mí o por los administradores de la universidad) para eliminar (o aumentar) la cuota de almacenamiento de mis cuentas de servicio cuando estaban abiertas con la cuenta de estudiante "ilimitada".
Actualización: sugerencia de @DaImTo tratando de:
Así que creé una carpeta en mi interfaz web de Drive y la compartí con mi cuenta de servicio. Luego, con la cuenta de servicio, cargué un archivo a esa carpeta (usando la biblioteca 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
Salida:
File ID: XXX
permissions: {u''items'': [{u''kind'': u''drive#permission'', u''name'': u''[email protected]'', u''domain'': u''developer.gserviceaccount.com'', u''etag'': u''"XXX"'', u''emailAddress'': u''[email protected]'', 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''}
Entonces, el archivo cargado automáticamente tiene dos permisos: 1. La cuenta de servicio es "propietario" 2. Mi cuenta principal es "escritor"
De hecho, puedo ver el archivo en la interfaz web, editarlo, eliminar, etc. Pero dado que la cuenta de servicio es el propietario, el archivo se contabiliza en la cuota de almacenamiento de la cuenta de servicio, por lo que esto no resuelve mi problema, es decir, todavía no puedo use más de 15GB con mi aplicación de respaldo.
Traté de transferir la propiedad a mi cuenta principal:
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()
... y obtuve un error:
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">
Intenté adjuntar transferOwnership = ''True'':
file1.auth.service.permissions().update(fileId=file1[''id''], permissionId=myperm[''id''], body=myperm, transferOwnership=''True'').execute()
tiene el mismo error Estoy atorado aqui.
Por cierto, en la ayuda de Google Transferir la propiedad del archivo dicen "Si eres un usuario de Google Apps, no puedes transferir la propiedad a otra persona que se encuentre fuera de tu dominio".
Una cuenta de servicio no eres tú. Piense en una cuenta de servicio como un usuario ficticio de Google, tiene su propia cuenta de Google drive, cuenta de calendario de Google ...
Probablemente esté relacionado con los desarrolladores que tienen acceso a él en la consola de desarrolladores de Google; si la aplicación que utiliza la cuenta de servicio comienza a enviar correo no deseado a Google Drive, la cuenta de la consola de desarrollador se cerrará. Pero más allá de eso, usted y cualquier cuenta de servicio que cree son entidades separadas. No tiene acceso a su cuenta de unidad ilimitada hasta que le dé acceso a su cuenta de unidad ilimitada. (Ojalá tuviera una cuenta ilimitada)
Ahora es una entidad, pero no estoy tan seguro de que la escuela pueda darle acceso. Realmente no estoy seguro de querer quitarle una parte del control de la cuenta de servicio. Algún administrador de la escuela podría simplemente eliminarlo un día y romper todo ...
Lo que sugiero que hagas es esto, dale acceso a la cuenta de servicio a tu cuenta de Google. Abre Google drive la versión web. Te sugiero que crees un nuevo directorio. En los permisos de uso compartido, tome la dirección de correo electrónico de las cuentas de servicio y dele acceso completo a ese directorio. Debería poder subir al directorio de su sorprendente cuenta de unidad ilimitada.
Actualización Solo pensé en algo: Probablemente tendrá que verificar a qué directorios tiene acceso una vez que le dé acceso al directorio de su unidad. Deberá asegurarse de que se cargue en la unidad que compartió y no en su directorio raíz.
actualizar Permisos:
Probablemente estés usando file.insert para subir el archivo. ese es solo el primer paso.
Una vez que haya subido el archivo, tendrá que aplicarle un parche y cambiar los permisos que lo enrutarán, ya que en lo personal no es el acceso a la cuenta de servicio del archivo. Cuando el archivo se carga, sigue siendo PROPIEDAD de la cuenta de servicio.
Tendrá que utilizar Archivos: parche para actualizar los permisos en el archivo y otorgarle, como usted no, acceso a la cuenta de servicio para el archivo.
Desafortunadamente no es posible (en este momento) establecer los permisos del archivo cuando se cargó. No estoy seguro de si esto es un error o simplemente no es compatible, creé una solicitud de problema hace unos días. Problema 3717: API de Google api, carga el archivo con permiso compartido