Jak przesłać plik Na Dysk Google za pomocą skryptu Pythona?

Muszę wykonać kopię zapasową różnych typów plików na GDrive (nie tylko tych konwertowanych na GDocs) z jakiegoś linuksowego serwera.

Jaki byłby najprostszy, najbardziej elegancki sposób, aby to zrobić ze skryptem Pythona? Czy którekolwiek z rozwiązań dotyczących GDocs będzie miało zastosowanie?

Author: GJ., 2012-05-31

3 answers

Możesz użyć API listy dokumentów do napisania skryptu, który zapisuje na dysk:

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

Zarówno interfejs API listy dokumentów, jak i interfejs API dysku współdziałają z tymi samymi zasobami (tj. tymi samymi dokumentami i plikami).

Ta próbka w klienckiej bibliotece Pythona pokazuje, jak przesłać niezakończony plik na dysk:

Http://code.google.com/p/gdata-python-client/source/browse/samples/docs/docs_v3_example.py#180{[4]

 14
Author: Claudio Cherubino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 16:24:54

Aktualną dokumentację zapisywania pliku na Dysku google za pomocą Pythona można znaleźć tutaj: https://developers.google.com/drive/v3/web/manage-uploads

Jednak sposób, w jaki interfejs API Dysku google obsługuje przechowywanie i pobieranie dokumentów, nie jest zgodny z tą samą architekturą, CO systemy 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ć wiele niestandardowego kodu, aby rodzic katalogi są przechowywane na Dysku google.

Poza tym google utrudnia uzyskanie dostępu do zapisu na zwykłym koncie na dysku. Zakres uprawnień musi zawierać następujący link: https://www.googleapis.com/auth/drive aby uzyskać token dostępu do zwykłego konta użytkownika, użytkownik musi najpierw dołączyć do grupy , aby zapewnić dostęp do nie recenzowanych aplikacji. Każdy utworzony token oauth ma ograniczony okres przydatności do spożycia.

Jednakże, jeśli uzyskasz dostęp token, poniższy skrypt powinien pozwolić na 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 labpack Pythona. W module tym istnieje klasa o nazwie driveClient, napisana przez rcj1492, która zajmuje się zapisywaniem, ładowaniem, wyszukiwaniem i usuwaniem plików na Dysku google w sposób zachowujący system plików POSIX.

from labpack.storage.google.drive import driveClient
 5
Author: R J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-27 18:43:22

Odkryłem, że PyDrive obsługuje API dysku elegancko, a także ma świetną dokumentację (szczególnie Przeprowadzanie użytkownika przez część uwierzytelniania).

EDIT: Połącz to z materiałem na Automatyzowanie procesu weryfikacji pydrive i Pydrive Google drive automatyzuje uwierzytelnianie, a to sprawia, że jest to świetna dokumentacja, aby wszystko zaczęło działać. Mam nadzieję, że pomoże to tym, którzy są zdezorientowani, od czego zacząć.

 3
Author: avg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-24 13:18:39