Automatisation du processus de vérification du pydrive

j'essaie d'automatiser le GoogleAuth lors de l'utilisation de l' pydrive bibliothèque (https://pypi.python.org/pypi/PyDrive).

j'ai configuré le pydrive et l'API google de telle sorte que mon secret_client.json fonctionne mais nécessite une authentification web pour accéder à gdrive à chaque fois que j'exécute mon 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 est juste un fichier texte. De plus, lorsque j'essaie d'utiliser le script ci-dessus pendant que je suis connecté à un autre compte. Il n'est pas en mesure de télécharger le eng.txt dans mon gdrive qui a généré le secret_client.json mais le compte qui a été connecté quand j'autorise l'authentification

dans le post précédent, j'ai essayé ce qui suit, afin d'automatiser le processus de vérification, mais il donne des messages d'erreur:

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')

Erreur:

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')]

Mon authentification sur gdrive api ressemble à ceci:

enter image description here

Comment pourrais-je l'utiliser pydrive que je n'ai pas besoin de authentifier chaque fois que je l'utilise?

comment permettre une authentification automatique telle que le script python utilisant le script pydrive ne téléchargera que vers le compte qui a généré le secret_client.json et pas le compte actuellement connecté sur le navigateur internet?

36
demandé sur Frédéric Hamidi 2014-06-26 01:49:00

2 réponses

tout d'abord, vous vous méprenez sur un point très important de la façon dont cela fonctionne:

quand j'essaie d'utiliser le script ci-dessus pendant que je suis connecté dans un autre compte. Il ne télécharge pas l'eng.txt dans mon gdrive qui a généré le secret_client.json mais le compte qui a été connecté quand je autoriser l'authentification

C'est exactement comme ça que ça doit marcher. Vous, en tant que développeur, distribuer client_secret.json avec votre application, et ce fichier est utilisé par PyDrive pour authentifier la demande avec Google. Google veut savoir combien de requêtes API sont faites par chaque application là-bas pour toutes sortes de raisons (mesures, charger le compte, révoquer l'accès, etc.), il faut donc que l'application s'authentifie elle-même.

Maintenant, lorsque votre application s'exécute LocalWebserverAuth, il authentifie le client avec Google. Le client, bien sûr, est la personne qui utilise réellement votre application. Dans ce cas, le développeur et le client sont la même personne (vous), mais imaginez vous souhaitez distribuer votre application à un million de différentes personnes. Ils doivent être en mesure de s'authentifier et de télécharger des fichiers pour leur propre compte, plutôt que de les avoir tous dans le vôtre (le développeur), qui a fourni client_secret.json.

cela dit, il s'agit en fait d'un changement très mineur pour le faire afin que votre application n'ait pas à demander au client de s'authentifier chaque fois que vous lancez l'application. Vous avez juste besoin de utilisez LoadCredentialsFile et 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')
64
répondu dano 2016-04-12 17:02:11

une autre façon consiste à utiliser un flux d'auth personnalisé en écrivant un paramètre.fichier yaml dans le répertoire de travail. Et cette méthode fonctionne mieux que LocalWebserverAuth() générera un jeton qui expire dans juste une heure et il n'y a pas de jeton de rafraîchissement.

Un exemple de paramètres.fichier yaml ressemble à ceci

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

Avec ce fichier, vous devez utiliser un navigateur à l'authentification complète pour la première fois, et après que les informations d'identification.fichier json sera généré dans le travail répertoire avec un jeton d'actualisation.

Cette méthode fonctionne mieux si vous essayez d'automatiser votre script sur le serveur

5
répondu wang892 2018-04-10 19:43:02