web-dev-qa-db-fra.com

Comment télécharger un fichier sur Google Drive en utilisant un script Python?

J'ai besoin de sauvegarder divers types de fichiers sur GDrive (pas seulement ceux convertibles aux formats GDocs) à partir d'un serveur Linux.

Quelle serait la façon la plus simple et la plus élégante de le faire avec un script python? Est-ce que l'une des solutions relatives aux GDocs serait applicable?

24
GJ.

Vous pouvez utiliser l'API Documents List pour écrire un script qui écrit sur Drive:

https://developers.google.com/google-apps/documents-list/

L'API Liste de documents et l'API Drive interagissent avec les mêmes ressources (c'est-à-dire les mêmes documents et fichiers).

Cet exemple dans la bibliothèque cliente Python montre comment télécharger un fichier non converti sur Drive:

http://code.google.com/p/gdata-python-client/source/browse/samples/docs/docs_v3_example.py#18

14

La documentation actuelle pour enregistrer un fichier sur Google Drive en utilisant python peut être trouvée ici: https://developers.google.com/drive/v3/web/manage-uploads

Cependant, la façon dont l'API Google Drive gère le stockage et la récupération des documents ne suit pas la même architecture que les systèmes de fichiers POSIX. Par conséquent, si vous souhaitez conserver l'architecture hiérarchique des fichiers imbriqués sur votre système de fichiers linux, vous devrez écrire beaucoup de code personnalisé afin que les répertoires parents soient conservés sur google drive.

En plus de cela, Google rend difficile l'accès en écriture à un compte de lecteur normal. L'étendue de votre autorisation doit inclure le lien suivant: https://www.googleapis.com/auth/drive et pour obtenir un jeton pour accéder au compte normal d'un utilisateur, cet utilisateur doit d'abord rejoindre un groupe pour donner accès à des applications non vérifiées. Et tout jeton oauth créé) a une durée de conservation limitée.

Cependant, si vous obtenez un jeton d'accès, le script suivant devrait vous permettre d'enregistrer n'importe quel fichier sur votre machine locale sur le même chemin (relatif) sur Google Drive.

def migrate(file_path, access_token, drive_space='drive'):

    '''
        a method to save a posix file architecture to google drive

    NOTE:   to write to a google drive account using a non-approved app,
            the oauth2 grantee account must also join this google group
            https://groups.google.com/forum/#!forum/risky-access-by-unreviewed-apps

    :param file_path: string with path to local file 
    :param access_token: string with oauth2 access token grant to write to google drive
    :param drive_space: string with name of space to write to (drive, appDataFolder, photos)
    :return: string with id of file on google drive
    '''

# construct drive client
    import httplib2
    from googleapiclient import discovery
    from oauth2client.client import AccessTokenCredentials
    google_credentials = AccessTokenCredentials(access_token, 'my-user-agent/1.0')
    google_http = httplib2.Http()
    google_http = google_credentials.authorize(google_http)
    google_drive = discovery.build('drive', 'v3', http=google_http)
    drive_client = google_drive.files()

# prepare file body
    from googleapiclient.http import MediaFileUpload
    media_body = MediaFileUpload(filename=file_path, resumable=True)

# determine file modified time
    import os
    from datetime import datetime
    modified_Epoch = os.path.getmtime(file_path)
    modified_time = datetime.utcfromtimestamp(modified_Epoch).isoformat()

# determine path segments
    path_segments = file_path.split(os.sep)

# construct upload kwargs
    create_kwargs = {
        'body': {
            'name': path_segments.pop(),
            'modifiedTime': modified_time
        },
        'media_body': media_body,
        'fields': 'id'
    }

# walk through parent directories
    parent_id = ''
    if path_segments:

    # construct query and creation arguments
        walk_folders = True
        folder_kwargs = {
            'body': {
                'name': '',
                'mimeType' : 'application/vnd.google-apps.folder'
            },
            'fields': 'id'
        }
        query_kwargs = {
            'spaces': drive_space,
            'fields': 'files(id, parents)'
        }
        while path_segments:
            folder_name = path_segments.pop(0)
            folder_kwargs['body']['name'] = folder_name

    # search for folder id in existing hierarchy
            if walk_folders:
                walk_query = "name = '%s'" % folder_name
                if parent_id:
                    walk_query += "and '%s' in parents" % parent_id
                query_kwargs['q'] = walk_query
                response = drive_client.list(**query_kwargs).execute()
                file_list = response.get('files', [])
            else:
                file_list = []
            if file_list:
                parent_id = file_list[0].get('id')

    # or create folder
    # https://developers.google.com/drive/v3/web/folder
            else:
                if not parent_id:
                    if drive_space == 'appDataFolder':
                        folder_kwargs['body']['parents'] = [ drive_space ]
                    else:
                        del folder_kwargs['body']['parents']
                else:
                    folder_kwargs['body']['parents'] = [parent_id]
                response = drive_client.create(**folder_kwargs).execute()
                parent_id = response.get('id')
                walk_folders = False

# add parent id to file creation kwargs
    if parent_id:
        create_kwargs['body']['parents'] = [parent_id]
    Elif drive_space == 'appDataFolder':
        create_kwargs['body']['parents'] = [drive_space] 

# send create request
    file = drive_client.create(**create_kwargs).execute()
    file_id = file.get('id')

    return file_id

PS. J'ai modifié ce script à partir du module labpack python. Il y a une classe appelée driveClient dans ce module écrit par rcj1492 qui gère l'enregistrement, le chargement, la recherche et supprimer des fichiers sur Google Drive d'une manière qui préserve le système de fichiers POSIX.

from labpack.storage.google.drive import driveClient
4
R J

J'ai trouvé que PyDrive gère l'API Drive avec élégance, et il a également une grande documentation (en particulier en guidant l'utilisateur à travers la partie d'authentification).

EDIT: Combinez cela avec le matériel sur Automatisation du processus de vérification pydrive et Authentification Pydrive google drive automate , et cela donne une excellente documentation pour faire avancer les choses. J'espère que cela aide ceux qui ne savent pas par où commencer.

3
avg