2012-05-31 1176 views
14

Necesito hacer una copia de seguridad de varios tipos de archivos a GDrive (no solo aquellos convertibles a formatos GDocs) desde algún servidor Linux.¿Cómo subir un archivo a Google Drive usando un script de Python?

¿Cuál sería la forma más simple y elegante de hacer eso con un script de python? ¿Sería aplicable alguna de las soluciones pertenecientes a GDocs?

+3

¿Cuál es la forma de cargar en g en 2016? –

Respuesta

10

Puede utilizar la API de lista de documentos para escribir un guión que escribe para conducir:

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

Tanto la API de lista de documentos y la API de Drive interactúan con los mismos recursos (es decir mismos documentos y archivos) .

Esta muestra en la biblioteca cliente Python muestra cómo cargar un archivo sin convertir para conducir:

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

+4

La API de la lista de documentos quedó obsoleta a partir del 14 de septiembre de 2012 y, en su lugar, se debe utilizar la API de Google Drive https://developers.google.com/drive/ –

0

La documentación actual para guardar un archivo en Google Drive usando Python se puede encontrar aquí: https://developers.google.com/drive/v3/web/manage-uploads

Sin embargo, la forma en que la API api maneja el almacenamiento y recuperación de documentos no sigue la misma arquitectura que los sistemas de archivos POSIX. Como resultado, si desea preservar la arquitectura jerárquica de los archivos anidados en su sistema de archivos de Linux, necesitará escribir una gran cantidad de código personalizado para que los directorios principales se conserven en la unidad de Google.

Además de eso, google hace que sea difícil obtener acceso de escritura a una cuenta de disco normal. Su alcance de permiso debe incluir el siguiente enlace: https://www.googleapis.com/auth/drive y para obtener un token para acceder a la cuenta normal de un usuario, ese usuario debe primero join a group para proporcionar acceso a aplicaciones no revisadas. Y cualquier token oauth que se cree tiene una vida útil limitada.

Sin embargo, si obtiene un token de acceso, la siguiente secuencia de comandos debería permitirle guardar cualquier archivo en su máquina local en la misma ruta (relativa) en la unidad de 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. Modifiqué este script desde el módulo labpack python. Hay una clase llamada driveClient en ese módulo escrita por rcj1492 que se encarga de guardar, cargar, buscar y eliminar archivos en la unidad de google de una manera que preserve el sistema de archivos POSIX.

from labpack.storage.google.drive import driveClient 
Cuestiones relacionadas