2012-05-31 19 views
14

Potrzebuję do tworzenia kopii zapasowych różnych typów plików do GDrive (nie tylko te, które można przekonwertować do formatu GDocs) z niektórych serwerów linuksowych.Jak przesłać plik na Dysk Google przy użyciu skryptu Python?

Jaki byłby najprostszy i najbardziej elegancki sposób na wykonanie tego przy pomocy skryptu Pythona? Czy którekolwiek z rozwiązań dotyczących GDocs będzie miało zastosowanie?

+3

Jaki jest sposób na przesłanie pliku na dysk w 2016? –

Odpowiedz

10

Można użyć API listy Dokumentów napisać skrypt, który zapisuje na dysku:

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

Zarówno API Lista Dokumenty i API Napęd interakcji z tych samych zasobów (tj samych dokumentów i plików) .

Ta próbka w bibliotece klienta Pythona pokazuje jak przesłać plik nieprzetworzony Drive:

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

+4

API listy dokumentów został wycofany z dniem 14 września 2012 r., A interfejs API Dysku Google powinien być używany zamiast https://developers.google.com/drive/ –

0

Obecna dokumentacja do zapisywania pliku na Dysku Google przy użyciu Pythona można znaleźć tutaj: https://developers.google.com/drive/v3/web/manage-uploads

Jednak sposób, w jaki aplet google drive go obsługuje przechowywanie i pobieranie dokumentów, nie jest zgodny z architekturą systemu plików POSIX. W rezultacie, jeśli chcesz zachować hierarchiczną architekturę zagnieżdżonych plików w systemie plików linux, będziesz musiał napisać dużo niestandardowego kodu, aby katalogi nadrzędne były zachowane na dysku Google.

Co więcej, google utrudnia uzyskanie dostępu do zapisu na normalnym koncie. Twój zakres uprawnień musi zawierać następujący link: https://www.googleapis.com/auth/drive. Aby uzyskać token umożliwiający dostęp do zwykłego konta użytkownika, użytkownik musi najpierw uzyskać dostęp do nieocenionych aplikacji przez join a group. Każdy utworzony oauth ma ograniczony okres przydatności do użycia.

Jeśli jednak uzyskasz token dostępu, poniższy skrypt powinien umożliwić zapisanie dowolnego pliku na komputerze lokalnym na tej samej (względnej) ścieżce na dysku 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. Zmodyfikowałem ten skrypt z modułu python labpack. Istnieje klasa o nazwie driveClient w tym module napisana przez rcj1492, która obsługuje zapisywanie, ładowanie, wyszukiwanie i usuwanie plików na dysku Google w sposób, który zachowuje system plików POSIX.

from labpack.storage.google.drive import driveClient 
Powiązane problemy