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