Google API で遊ぶ

pythonでGoogle API を使ってみる

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:使いたいAPIを選択

APIを呼び出す場所:その他のUI(WindowsCLIツールなど)

アクセスするデータの種類:アプリケーションデータ

で必要な認証情報をクリック

2サービスアカウントを作成

サービスアカウントキーで作る場合と同じ

次へをクリックすると自動でjsonファイルがダウンロードされるので大切に保管する。

 

コードに使えるようにフォルダやファイル名を変更する

ファイル名は「プロジェクト名-***.json」のようになっている。

ファイル名を変えても大丈夫なので、今回紹介するコードをそのまま使いたい場合は「credentials.json」に変更してコードを保存するフォルダと同じところに移動させておく。

 

2 共有設定をする

クライアントIDはユーザーの権限を貸すようなイメージなので承認をしてあげればスコープの範囲でそのユーザーの情報を取得できる。

サービスアカウントは別のアカウント扱いのようなイメージなので、そのサービスアカウントで使いたいフォルダなどを共有してあげないとサービスアカウントからは見えない。

メールアドレスの確認

認証情報

サービスアカウントの管理をクリック

サービスアカウントの管理

使いたいサービスアカウントのメールをコピーする

コピーしにくかったら

操作

操作の3点をクリックして「クライアントIDの表示」をクリックすると

クライアント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
  • キーは定期的に変更するのがいいらしい(上のサイトを斜め読みして得た情報)