概要
あるアプリを作成中に、サービスアカウントを利用して、google driveへファイルをアップロードし、そのファイルをユーザが閲覧可能な状態にするための実装を行っていました。
python google drive
と検索すると、公式では以下の情報が表示されますが、この方法だとブラウザを介することでしか実現できないので、今回は採用していません。
chatGPTに尋ねること数回で完成するので、メモに近いです。
準備
- GoogleアカウントでSAを作成(ブラウザ上で何か権限を追加する必要なし)
- 対象のプロジェクトにて、Google Drive API有効化
- 必要なライブラリインストール
pip install oauth2client google-api-python-client
実装
今回はPDFファイルをアップロードしたかったので、以下のように実装しました。
アップロード先は個人ドライブです。SA経由でアップロードするので、ユーザに権限不要後、共有アイテムから確認可能な形になります。
アップロード先を共有ドライブとする場合は、service.files().create
に渡す値をもう少し複雑です。(参考資料)
from oauth2client.service_account import ServiceAccountCredentials
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
scope = ['https://www.googleapis.com/auth/drive']
# Parsing JSON credentials for a service account:
credentials = ServiceAccountCredentials.from_json_keyfile_name('sa.json', scope)
service = build('drive', 'v3', credentials=credentials)
# アップロードするファイルのパス
file_path = 'XXX.pdf'
# ファイルメタデータを定義
file_metadata = {
'name': os.path.basename(file_path),
}
# ファイルをアップロード
media = MediaFileUpload(file_path, mimetype='application/pdf')
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
fileId = file.get('id')
file_url = f'https://drive.google.com/file/d/{fileId}/view'
# 特定のメールアドレスにアクセス権を付与する関数
permissions = {
'type': 'user',
'role': 'reader',
'emailAddress': email
}
service.permissions().create(fileId=fileId,
body=permissions,
).execute()
try:
permissions = service.permissions().list(fileId=fileId).execute()
except Exception as e:
print('An error occurred:', e)
permissions = service.permissions().list(fileId=fileId).execute()