Как загрузить файл на Google Диск с помощью Python script?

Мне нужно выполнить резервное копирование различных типов файлов в GDrive (не только для конвертируемых в форматы GDocs) с какого-либо сервера linux.

Какой будет самый простой, самый элегантный способ сделать это с помощью python script? Будет ли применимо любое решение, относящееся к GDocs?

Ответы

Ответ 1

Вы можете использовать API-список документов для записи script, который записывает на диск:

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

И API списка документов, и API-интерфейс накопителя взаимодействуют с одними и теми же ресурсами (то есть с теми же документами и файлами).

Этот образец в клиентской библиотеке Python показывает, как загрузить файл без конвертации на диск:

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

Ответ 2

Текущую документацию по сохранению файла на диске Google с помощью python можно найти здесь: https://developers.google.com/drive/v3/web/manage-uploads

Тем не менее, способ, которым Google Api обрабатывает хранение и извлечение документов, не соответствует той же архитектуре, что и файловые системы POSIX. В результате, если вы хотите сохранить иерархическую архитектуру вложенных файлов в вашей файловой системе Linux, вам нужно будет написать много настраиваемого кода, чтобы родительские каталоги сохранялись на диске Google.

Кроме того, google затрудняет получение доступа на запись к обычной учетной записи. Ваша область разрешений должна включать следующую ссылку: https://www.googleapis.com/auth/drive и получить токен для доступа к обычной учетной записи пользователя, этот пользователь должен сначала присоединиться к группе, чтобы обеспечить доступ к незарегистрированным приложениям. И любой маркер oauth, который создан, имеет ограниченный срок хранения.

Однако, если вы получаете токен доступа, следующий script должен позволить вам сохранить любой файл на вашем локальном компьютере на том же (относительном) пути на диске 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. Я изменил этот script из модуля labpack python. В этом модуле, написанном rcj1492, есть класс, называемый driveClient, который обрабатывает сохранение, загрузку, поиск и удаление файлов на диске Google таким образом, сохраняет файловую систему POSIX.

from labpack.storage.google.drive import driveClient

Ответ 3

Я обнаружил, что PyDrive элегантно обрабатывает Drive Drive, а также имеет отличный документация (особенно для пользователя через часть аутентификации).

EDIT: Объедините это с материалом Автоматизация процесса проверки pydrive и Pydrive google drive автоматизировать аутентификацию, и это позволяет получить отличную документацию для получения информации. Надеюсь, это поможет тем, кто запутался в том, с чего начать.