google drive の Quickstart(サービスアカウント編)
ガイド
https://developers.google.com/drive/api/v3/quickstart/python?hl=ja
実行確認環境
win10
python3.7.1
google drive apiのQuickstartがクライアントIDでは動いたけどサービスアカウントで動かしたい場合の手順
参考にさせていただいたサイト:https://blog.amedama.jp/entry/2019/06/06/001208
正直「動くこと」を目的としているのでAuth周りをあまりわかっていない。
ちゃんとやりたい場合はhttps://cloud.google.com/docs/authentication/getting-startedとかを理解するといい?
クライアントID編は↓
playwithgoogleapi.hatenablog.com
1 サービスアカウントを作る
Google Cloud Platformで認証情報をクリック
「認証情報を作成」をクリック
サービスアカウントキーで作る場合
サービスアカウント:新しいサービスアカウント
サービスアカウント名:任意
役割:オーナー(適宜変える)
サービスアカウントID:自動でできる
キーのタイプ:JSON(デフォルト)
で作成をクリック
すると自動でjsonファイルがダウンロードされるので大切に保管する
ウィザードで選択するで作る場合
APIを呼び出す場所:その他のUI(Windows、CLIツールなど)
アクセスするデータの種類:アプリケーションデータ
で必要な認証情報をクリック
サービスアカウントキーで作る場合と同じ
次へをクリックすると自動でjsonファイルがダウンロードされるので大切に保管する。
コードに使えるようにフォルダやファイル名を変更する
ファイル名は「プロジェクト名-***.json」のようになっている。
ファイル名を変えても大丈夫なので、今回紹介するコードをそのまま使いたい場合は「credentials.json」に変更してコードを保存するフォルダと同じところに移動させておく。
2 共有設定をする
クライアントIDはユーザーの権限を貸すようなイメージなので承認をしてあげればスコープの範囲でそのユーザーの情報を取得できる。
サービスアカウントは別のアカウント扱いのようなイメージなので、そのサービスアカウントで使いたいフォルダなどを共有してあげないとサービスアカウントからは見えない。
メールアドレスの確認
使いたいサービスアカウントのメールをコピーする
コピーしにくかったら
操作の3点をクリックして「クライアントIDの表示」をクリックすると
右側にこんな表示が出るのでこのService accountのアドレスをコピーする(1行目は名前なので2行目から下)
共有設定
サービスアカウントで使いたいフォルダを表示させてフォルダ名▼>共有をクリック
先ほどコピーしたアドレスを張り付けて必要に応じて権限を編集可か閲覧のみ可を選んで(デフォルトは編集可)送信をクリック
3 コードの編集
①インポートするライブラリの変更
-
削除する行
import pickle from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request
-
追加する行
from google.oauth2.service_account import Credentials
②不要なコードの削除
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
③サービスアカウントを使う用のコード追加
creds = Credentials.from_service_account_file('credentials.json')
削除したところに追加する
全コード
from __future__ import print_function import os.path from googleapiclient.discovery import build from google.oauth2.service_account import Credentials def main(): """Shows basic usage of the Drive v3 API. Prints the names and ids of the first 10 files the user has access to. """ creds = Credentials.from_service_account_file('credentials.json') service = build('drive', 'v3', credentials=creds) # Call the Drive v3 API results = service.files().list( pageSize=10, fields="nextPageToken, files(id, name)").execute() items = results.get('files', []) if not items: print('No files found.') else: print('Files:') for item in items: print(u'{0} ({1})'.format(item['name'], item['id'])) if __name__ == '__main__': main()
4 コードの実行
サービスアカウントだと認証などはないのでそのまま結果が出る。
クライアントIDで実行したときはすべてのフォルダが対象で結果が出るがサービスアカウントだと共有してあるもののみが対象となる。
補足
- ウィザードで選択からサービスアカウントを作る場合使用するAPIを選ぶが、これ以外(例えばCalendar)のAPIも同じサービスアカウントで使える。
- サービスアカウントキーの自動でダウンロードされたjsonファイルを間違って消してしまった場合はGoogle Cloud Platformで
認証情報>認証情報を作成>サービスアカウントキー
と進みサービスアカウントにキーを再発行したいサービスアカウントを選んで作成をクリックすれば新しくキーが作られてそのjsonファイルが落とせる。 - 例えば「test」で新たに作った場合はキーIDが同じアカウントに2つつく。古いほうのキーは積極的に消さないと消えない。
- サービスアカウントキーの詳しい記載はたぶんここhttps://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja
- キーは定期的に変更するのがいいらしい(上のサイトを斜め読みして得た情報)