PyDrive y Google Drive: ¿automatizar el proceso de verificación?

Estoy tratando de usar PyDrive para cargar archivos en Google Drive utilizando un script local de Python que deseo automatizar para que pueda ejecutarse todos los días a través de un trabajo cron. He almacenado el ID de OAuth del cliente y el secreto de la aplicación Google Drive en un archivo settings.yaml localmente, que PyDrive selecciona para usar en la autenticación.

El problema que tengo es que aunque esto funciona algunas veces, de vez en cuando decide que necesita que proporcione un código de verificación (si uso CommandLineAuth), o me lleva a un navegador para ingresar la contraseña de la cuenta de Google ( LocalWebserverAuth), por lo que no puedo automatizar el proceso correctamente.

¿Alguien sabe qué configuración debo modificar, ya sea en PyDrive o en el lado de Google OAuth, para configurar esto una vez y luego confiar en que se ejecute automáticamente sin más aportaciones del usuario en el futuro?

Así es como se ve el archivo settings.yaml:

client_config_backend: settings client_config: client_id: MY_CLIENT_ID client_secret: MY_CLIENT_SECRET save_credentials: True save_credentials_backend: file save_credentials_file: credentials.json get_refresh_token: False oauth_scope: - https://www.googleapis.com/auth/drive.file 

Puede (debería) crear una cuenta de servicio, con un ID y una clave privada de la consola de API de Google. Esto no requerirá una verificación, pero deberá mantener la clave privada en privado.

Cree un objeto de credencial basado en el ejemplo de google python y asígnelo al objeto PyDrive GoogleAuth ():

 from apiclient.discovery import build from oauth2client.client import SignedJwtAssertionCredentials from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive # from google API console - convert private key to base64 or load from file id = "...@developer.gserviceaccount.com" key = base64.b64decode(...) credentials = SignedJwtAssertionCredentials(id, key, scope='https://www.googleapis.com/auth/drive') credentials.authorize(httplib2.Http()) gauth = GoogleAuth() gauth.credentials = credentials drive = GoogleDrive(gauth) 

EDITAR (septiembre de 2016): Para la última versión integrada de google-api-python-client (1.5.3), usaría el siguiente código, con el ID y la clave igual que antes:

 import StringIO from apiclient import discovery from oauth2client.service_account import ServiceAccountCredentials credentials = ServiceAccountCredentials.from_p12_keyfile_buffer(id, StringIO.StringIO(key), scopes='https://www.googleapis.com/auth/drive') http = credentials.authorize(httplib2.Http()) drive = discovery.build("drive", "v2", http=http)