listfile python google-api cloud google-drive-sdk pydrive

python - drive listfile



Automatizando el proceso de verificación pydrive (2)

Primero, estás malinterpretando una parte muy importante de cómo funciona esto:

cuando intento usar el script anterior mientras estoy conectado a otra cuenta. No carga el archivo eng.txt en mi gdrive que generó el secret_client.json pero la cuenta que se inició cuando autorizo ​​la autenticación

Así es exactamente como se supone que debe funcionar. Usted, como desarrollador, distribuye client_secret.json con su aplicación, y ese archivo es utilizado por PyDrive para autenticar la aplicación con Google. Google desea saber cuántas solicitudes de API están realizando cada aplicación por diversos motivos (métricas, cargo a la cuenta, revocación de acceso, etc.), por lo que requiere que la aplicación se autentique.

Ahora, cuando su aplicación ejecuta LocalWebserverAuth , está autenticando al cliente con Google. El cliente, por supuesto, es la persona que realmente usa su aplicación. En este caso, el desarrollador y el cliente son la misma persona (usted), pero imagine que desea distribuir su aplicación a un millón de personas diferentes. Deben poder autenticarse y cargar archivos en su propia cuenta de Drive, en lugar de tenerlos todos en el suyo (el desarrollador), que proporcionó client_secret.json .

Dicho esto, en realidad se trata de un cambio mínimo para que su aplicación no tenga que pedirle al cliente que se autentique cada vez que ejecute la aplicación. Solo necesita usar LoadCredentialsFile y SaveCredentialsFile .

from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() # Try to load saved client credentials gauth.LoadCredentialsFile("mycreds.txt") if gauth.credentials is None: # Authenticate if they''re not there gauth.LocalWebserverAuth() elif gauth.access_token_expired: # Refresh them if expired gauth.Refresh() else: # Initialize the saved creds gauth.Authorize() # Save the current credentials to a file gauth.SaveCredentialsFile("mycreds.txt") drive = GoogleDrive(gauth) textfile = drive.CreateFile() textfile.SetContentFile(''eng.txt'') textfile.Upload() print textfile drive.CreateFile({''id'':textfile[''id'']}).GetContentFile(''eng-dl.txt'')

GoogleAuth automatizar el proceso de GoogleAuth cuando pydrive biblioteca pydrive ( https://pypi.python.org/pypi/PyDrive ).

Configuré el pydrive y la API de Google para que mi secret_client.json funcione, pero requiere autenticación web para el acceso gdrive cada vez que ejecuto mi script:

from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() gauth.LocalWebserverAuth() drive = GoogleDrive(gauth) textfile = drive.CreateFile() textfile.SetContentFile(''eng.txt'') textfile.Upload() print textfile drive.CreateFile({''id'':textfile[''id'']}).GetContentFile(''eng-dl.txt'')

eng.txt es solo un archivo de texto. Además, cuando intento usar el script anterior mientras estoy conectado a otra cuenta. No carga el eng.txt en mi gdrive que generó el secret_client.json pero la cuenta que se inició cuando autorizo ​​la autenticación

De la publicación anterior, intenté lo siguiente para automatizar el proceso de verificación pero está dando mensajes de error:

import base64, httplib2 from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive from apiclient.discovery import build from oauth2client.client import SignedJwtAssertionCredentials from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive #gauth = GoogleAuth() #gauth.LocalWebserverAuth() # from google API console - convert private key to base64 or load from file id = "464269119984-j3oh4aj7pd80mjae2sghnua3thaigugu.apps.googleusercontent.com" key = base64.b64decode(''COaV9QUlO1OdqtjMiUS6xEI8'') credentials = SignedJwtAssertionCredentials(id, key, scope=''https://www.googleapis.com/auth/drive'') credentials.authorize(httplib2.Http()) gauth = GoogleAuth() gauth.credentials = credentials drive = GoogleDrive(gauth) drive = GoogleDrive(gauth) textfile = drive.CreateFile() textfile.SetContentFile(''eng.txt'') textfile.Upload() print textfile drive.CreateFile({''id'':textfile[''id'']}).GetContentFile(''eng-dl.txt'')

Error:

Traceback (most recent call last): File "/home/alvas/git/SeedLing/cloudwiki.py", line 29, in <module> textfile.Upload() File "/usr/local/lib/python2.7/dist-packages/pydrive/files.py", line 216, in Upload self._FilesInsert(param=param) File "/usr/local/lib/python2.7/dist-packages/pydrive/auth.py", line 53, in _decorated self.auth.Authorize() File "/usr/local/lib/python2.7/dist-packages/pydrive/auth.py", line 422, in Authorize self.service = build(''drive'', ''v2'', http=self.http) File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper return wrapped(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/apiclient/discovery.py", line 192, in build resp, content = http.request(requested_url) File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper return wrapped(*args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 475, in new_request self._refresh(request_orig) File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 653, in _refresh self._do_refresh_request(http_request) File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 677, in _do_refresh_request body = self._generate_refresh_request_body() File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 861, in _generate_refresh_request_body assertion = self._generate_assertion() File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 977, in _generate_assertion private_key, self.private_key_password), payload) File "/usr/local/lib/python2.7/dist-packages/oauth2client/crypt.py", line 131, in from_string pkey = crypto.load_pkcs12(key, password).get_privatekey() OpenSSL.crypto.Error: [(''asn1 encoding routines'', ''ASN1_get_object'', ''header too long'')]

Mi autenticación en gdrive api se ve así:

¿Cómo podría usar pydrive para no tener que autenticarme cada vez que lo uso?

¿Cómo permitir la autenticación automática de modo que el script de python que utiliza el script pydrive solo se cargue en la cuenta que generó el secret_client.json y no en la cuenta actualmente registrada en el navegador de internet?


Una forma alternativa es usar un flujo de autenticación personalizado escribiendo un archivo setting.yaml en el directorio de trabajo. Y este método funciona mejor cuando LocalWebserverAuth() generará un token que caducará en solo una hora y no habrá token de actualización.

Un archivo de muestra settings.yaml se parece a esto

client_config_backend: file client_config: client_id: <your_client_id> client_secret: <your_secret> save_credentials: True save_credentials_backend: file save_credentials_file: credentials.json get_refresh_token: True oauth_scope: - https://www.googleapis.com/auth/drive - https://www.googleapis.com/auth/drive.install

Con este archivo, aún debe usar un navegador para completar la autenticación por primera vez, y luego se generará un archivo credentials.json en el directorio de trabajo con un token de actualización.

Este método funciona mejor si intenta automatizar su script en el servidor