2012-05-31 15 views
14

Ho bisogno di eseguire il backup di vari tipi di file su GDrive (non solo quelli convertibili in formati GDocs) da qualche server Linux.Come caricare un file su Google Drive utilizzando uno script Python?

Quale sarebbe il modo più semplice ed elegante per farlo con uno script Python? Potrebbe essere applicabile una qualsiasi delle soluzioni relative a GDocs?

+3

Qual è il modo 2016 per caricare su un'unità? L'API dell'elenco documenti –

risposta

10

È possibile utilizzare l'API Documents List per scrivere uno script che scrive a guidare:

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

Sia l'API Documents List e l'API unità interagiscono con le stesse risorse (cioè stessi documenti e file) .

Questo campione nella libreria client Python mostra come caricare un file non convertito a guidare:

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

+4

è stata ritirata a partire dal 14 settembre 2012 e l'API di Google Drive deve essere utilizzata al posto di https://developers.google.com/drive/ –

0

La documentazione corrente per il salvataggio di un file in Google Drive utilizzando Python può essere trovato qui: https://developers.google.com/drive/v3/web/manage-uploads

Tuttavia, il modo in cui l'API di google gestisce la memorizzazione e il recupero dei documenti non segue la stessa architettura dei file system POSIX. Di conseguenza, se si desidera preservare l'architettura gerarchica dei file nidificati sul proprio sistema di file linux, sarà necessario scrivere un sacco di codice personalizzato in modo che le directory madri vengano conservate sull'unità google.

Oltre a ciò, Google rende difficile ottenere l'accesso in scrittura a un account di unità normale. L'ambito dell'autorizzazione deve includere il seguente collegamento: https://www.googleapis.com/auth/drive e per ottenere un token per accedere all'account normale di un utente, tale utente deve prima join a group fornire l'accesso alle app non recensite. E qualsiasi token oauth creato ha una durata limitata.

Tuttavia, se si ottiene un token di accesso, il seguente script dovrebbe consentire di salvare qualsiasi file sul computer locale sullo stesso percorso (relativo) sull'unità google.

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. Ho modificato questo script dal modulo python labpack. C'è una classe chiamata driveClient in quel modulo scritto da rcj1492 che gestisce il salvataggio, il caricamento, la ricerca e l'eliminazione di file su google drive in un modo che preserva il file system POSIX.

from labpack.storage.google.drive import driveClient 
Problemi correlati