LinuxサーバーからGDrive(GDocs形式に変換可能なファイルだけでなく)にさまざまなファイルタイプをバックアップする必要があります。
pythonスクリプトでそれを行う最も簡単で最もエレガントな方法は何ですか?GDocsに関連するソリューションのいずれかが適用可能でしょうか?
Documents List APIを使用して、ドライブに書き込むスクリプトを記述できます。
https://developers.google.com/google-apps/documents-list/
Documents List APIとDrive APIはどちらも同じリソース(つまり、同じドキュメントとファイル)とやり取りします。
Pythonクライアントライブラリのこのサンプルは、変換されていないファイルをドライブにアップロードする方法を示しています。
http://code.google.com/p/gdata-python-client/source/browse/samples/docs/docs_v3_example.py#18
pythonを使用してGoogleドライブにファイルを保存するための現在のドキュメントは、ここにあります: https://developers.google.com/drive/v3/web/manage-uploads
ただし、GoogleドライブAPIがドキュメントの保存と取得を処理する方法は、POSIXファイルシステムと同じアーキテクチャに従っていません。その結果、ネストされたファイルの階層アーキテクチャをLinuxファイルシステムに保存したい場合は、親ディレクトリがGoogleドライブに保存されるように、多くのカスタムコードを記述する必要があります。
その上、Googleは通常のドライブアカウントへの書き込みアクセスを取得することを困難にします。権限スコープには次のリンクを含める必要があります: https://www.googleapis.com/auth/drive とユーザーの通常のアカウントにアクセスするためのトークンを取得するには、まずそのユーザーが joinグループ レビューされていないアプリへのアクセスを提供します。また、作成された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。私はlabpack
pythonモジュールからこのスクリプトを変更しました。保存、ロード、検索を処理するrcj1492によって書かれたモジュールに driveClient というクラスがありますそして、POSIXファイルシステムを維持する方法でグーグルドライブ上のファイルを削除します。
from labpack.storage.google.drive import driveClient
PyDrive がDrive APIをエレガントに処理し、優れた documentation (特にユーザーに認証部分を案内する)も備えていることがわかりました。
編集:pydrive検証プロセスの自動化 と Pydrive googleドライブ自動化認証 のマテリアルと組み合わせます== 、そしてそれは物事を進めるためのいくつかの素晴らしいドキュメントになります。どこから始めればよいか混乱している人に役立つことを願っています。