2012-05-31 1 views
14

Мне нужно создать резервную копию различных типов файлов для GDrive (не только для конвертируемых в форматы GDocs) с какого-либо сервера Linux.Как загрузить файл на Google Диск с помощью скрипта Python?

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

+3

Что такое способ загрузки на g-накопитель 2016 года? –

ответ

10

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

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

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

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

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

+4

API-список документов был устаревшим с 14 сентября 2012 года, и вместо этого следует использовать API Google Диска https://developers.google.com/drive/ –

0

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

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

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

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

from labpack.storage.google.drive import driveClient 
0

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

EDIT: Объедините это с материалом на Automating pydrive verification process и Pydrive google drive automate authentication, и что делает для некоторых большой документации, чтобы получить вещи, идущие. Надеюсь, это поможет тем, кто смущен о том, с чего начать.