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?
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]
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
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ąć.
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