Google API で遊ぶ

pythonでGoogle API を使ってみる

Driveの情報を取得する

リファレンス

 https://developers.google.com/drive/api/v3/reference/about/get?hl=ja 

実行確認環境

win10

python3.7.1

 

ドライブの情報を取得するのにはaboutのgetを使う。

基本構文は

fields = 'ほしい項目'
results = service.about().get(fields=fields).execute()

必ず引数にfieldsを渡さないといけない。

fieldsはほかのメソッドとも共通で、戻り値に含まれる情報を指定する。

必須の項目かオプションかはメソッドにより異なる模様。

About: getでもらえる項目はこちら

fieldsの書き方のリファレンスはこちら

 

①全部の項目が欲しい

fields = '*'

 *と指定するとすべての項目がもらえる。

パフォーマンスを気にするならちゃんとほしい項目だけに絞ったほうがいいらしい。

 

②ほしい項目を指定したい

1. 項目が1つの場合

戻り値はdict型なので、ほしい項目のkeyを指定する

例えばuserを指定すると戻り値はこんな感じ

fields = 'user'
results = service.about().get(fields=fields).execute()
pprint(results)
>python about.py
{'user': {'displayName': 'hoge',
'emailAddress': 'hoge@hoge.com',
'kind': 'drive#user',
'me': True,
'permissionId': '00000000000'}}

2. 項目が複数の場合

複数の項目が欲しい場合は,で区切って指定する

fields = 'user,maxImportSizes'
results = service.about().get(fields=fields).execute()
pprint(results)
>python about.py
{'maxImportSizes': {'application/vnd.google-apps.document': '10485760',
'application/vnd.google-apps.drawing': '2097152',
'application/vnd.google-apps.presentation': '104857600',
'application/vnd.google-apps.spreadsheet': '104857600'},
'user': {'displayName': 'hoge',
'emailAddress': 'hoge@hoge.com',
'kind': 'drive#user',
'me': True,
'permissionId': '00000000000'}}

3. 項目の中の項目に絞りたい場合

例えば、userの中のユーザー名のみを取得したい場合は/で区切る

fields = 'user/displayName'
results = service.about().get(fields=fields).execute()
pprint(results)
>python about.py
{'user': {'displayName': 'hoge'}}

ユーザー名とメールアドレスなど複数指定する場合は()で囲う。/は不要

fields = 'user(displayName,emailAddress)'
results = service.about().get(fields=fields).execute()
pprint(results)
>python about.py
{'user': {'displayName': 'hoge',
'emailAddress': 'hoge@hoge.com'}}

 複数でなくても()で指定できる

fields = 'user(displayName)'
results = service.about().get(fields=fields).execute()
pprint(results)
>python about.py
{'user': {'displayName': 'hoge'}}

4. 組み合わせ方いろいろ

指定した項目がlist型の中にある場合はlistの中のすべての該当項目を取ってくれる

fields = ['user(displayName,emailAddress)',
'storageQuota/limit',
'driveThemes(id)',
'canCreateDrives']
results = service.about().get(fields=','.join(fields)).execute()
pprint(results)
>python about.py
{'canCreateDrives': False,
'driveThemes': [{'id': 'abacus'},
{'id': 'blueprints'},
...中略...,
{'id': 'wood'}],
'storageQuota': {'limit': '16106127360'},
'user': {'displayName': 'hoge',
      'emailAddress': 'hoge@hoge.com'}}

 

nuts = crazy

栗って英語でなんて言うんだっけ?(=chestnut)

と調べた派生で

そういえばフルハウスでよくミシェルがnutsっていうけどどういう意味なんだろう?

と調べたらこちらのサイトに行きつきました。

peta-eri.com

で結果がタイトルだったわけですが、

ほかにもいろいろ説明があってその中でnutsの派生語を紹介してた中の

結構深刻なレベルの変人

という言葉がツボに入ったのでメモ。

早く英語が分かるようになりたいなぁ~。

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

 

google drive の Quickstart(クライアントID編)

ガイド

https://developers.google.com/drive/api/v3/quickstart/python?hl=ja

実行確認環境

win10

python3.7.1

基本的にはステップの通りに進めば実行まではできる

 

1 credentials.jsonの取得

enable_the_drive_api

ENABLE THE DRIVE APIをクリック

download_client_configuration

DOWNLOAD CLIENT CONFIGURATIONをクリックするとcredentials.jsonがダウンロードされる

のちに使うAPIを追加したりサービスIDを作ったりしたくなったらAPI Consoleを使うことになるので右下のAPI Consoleに行ってみてもよい(いかなくてもとりあえずは動くはず)

consoleのurl:https://console.developers.google.com/

DONEで閉じる

 

2 ライブラリのインストール

Step 2に書かれているコマンドをそのまま実行すればOK

 

3 サンプルコードと1でダウンロードしたcredentials.jsonを同じフォルダに保存

同じフォルダにしたくない場合は下記のtoken.pickleとcredentials.jsonのファイルパスをフォルダまで指定する形にすればOK

    if os.path.exists('token.pickle'):
       
with open('token.pickle', 'rb') as token:

...中略...

        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:

蛇足:windowsの時は区切りが\なのでr'hoge\hoge'みたいに書くと楽

 

4 実行

Step 4に書かれてるコマンドをそのまま実行すればOK(ファイル名変えたらなそのファイル名で)

このアプリは確認されていません

gsuiteのアカウントなら出ないかも

これが出たら下の小さい「詳細」をクリック

(安全ではないページ)に移動

「QuickStart(安全ではないページ)に移動」をクリック

権限の付与

許可をクリック

選択内容を確認してください

許可をクリック

すると画面に

The authentication flow has completed, you may close this window

と出るので閉じてコマンドプロンプトにもどると結果が表示されている。

 

蛇足:QuickStartはStep 1で「ENABLE THE DRIVE API」をクリックしたときにgoogleさんが勝手に作ってくれたプロジェクトのアプリケーションの名前。Consoleで変更可能。ちなみにプロジェクト名もQuickStartになっている。自分で新しくプロジェクトを作ることも可能。

 

補足

  • tokenは1回発行されればもう認証は不要で使い続けられる。
  • なので、認証画面が出せない端末で動かしたかったら一度認証画面が出る端末で許可してtoken.pickleを作って、credentials.jsonとtoken.pickleをコピーすれば使える(tokenは大切に保管しましょう)。
  • スコープの変更や使うAPIを追加(変更)した場合はtokenの作り直しが必要で、古いtoken.pickleが残ったまま実行すると前のスコープのままになって増やしたはずのスコープは403エラーが出る。古いtokenを削除して認証をし直す。
  • 一番強いスコープはhttps://www.googleapis.com/auth/drive
  • どのAPIでもそのAPI名の後ろに.hogehogeがないものが全権を持っているスコープの模様。
  • 「このアプリは確認されていません」の表示を消すのはめんどくさそうなので必要に迫られたらちゃんと調べる(参考:https://www.eripyon.com/mt/2017/11/this_app_is_not_verified.html
  • Quickstartのサンプルコードはサービスアカウントだと動かない。

driveのスコープの種類:https://developers.google.com/drive/api/v3/about-auth?hl=ja

 

サービスアカウントで動かしたいときはちょっとサンプルをいじる必要があるのでまた次回。