どうも。つじけ(tsujikenzo)です。このシリーズでは 「Google ColaboratoryのGoogle認証を自動化しよう」 について全3回でお送りします。今日は第3回目です。
前回のおさらい
前回は、「Google認証を自動化する下準備」をお届けしました。
今日は、最終回で、「Googleドライブを自動でマウントしよう」 をお届けします。
Drive APIとSpreadSheetAPIをONにする
サービスアカウントで認証を行う為に、GCPのAPIライブラリで、各サービスのAPIを有効にする必要があります。
今回は、ドライブとスプレッドシートのAPIをONにしましょう。
こちらのリンク先がドライブです。「有効にする」をクリックします。
こちらのリンク先が、スプレッドシートです。「有効にする」をクリックします。
鍵を作成する
前回作成したサービスアカウントを表示して、メールアドレスをクリックします。
上部の[キー]をクリックして、[鍵を追加]から[新しい鍵を作成]をクリックします。
キーのタイプを[JSON]にチェックをいれて、[作成]をクリックします。
すると、ダウンロードがはじまります。所定の場所に「JSONタイプの秘密鍵」をダウンロードできています。
秘密鍵はテキストファイルなので、メモ帳などで開けます。
こちらが、ファイルの中身ですが、JSONであることがわかります。(JSONについてはこちらの記事を参照ください)
秘密鍵は、後ほど使います。秘密鍵は大事な個人情報なので、他人に漏れないように管理しましょう。
認証用スタンドアロンスクリプトを作成する
GASのスタンドアロンスクリプトを作成します。名前はなんでもかまいません。
「コード.gs」のスクリプトファイル内に、以下のコードを記述します。
function doGet(e) {
const json ={
};
return ContentService.createTextOutput(JSON.stringify(json)).setMimeType(ContentService.MimeType.JSON);
}
const json ={ };の中に、先ほどのJSONの{}の中身をコピペします。({}が2重になってしまわないように気を付けましょう。)
上書き保存します。
WEBアプリとして公開する
このスクリプトファイルをWEBアプリとして公開します。右上の「デプロイ」から「新しいデプロイ」をクリックします。
歯車をクリックして、「ウェブアプリ」をクリックします。
アクセスできるユーザーを「全員」にします。最後に「デプロイ」をクリックします。
デプロイするとURLが発行されますので、コピーしておきます。
フォルダ作成と共有
マイドライブで、作業用のフォルダを作成します。名前はなんでもかまいません。
そのフォルダに共有権限を設定します。
誰に、フォルダ編集の権限を与えるかというと、そうです。前回作成したサービスアカウントです。
これで、サービスアカウントが、フォルダを編集する権限をもちます。
Google Colaboratoryを用意する
Google Colaboratoryのファイルを新規作成します。
名前をつけておきましょう。なんでもかまいません。
下記コードを書きます。[‘デプロイURL’]には、WEBアプリとして公開したURLを記入します。
import json
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://www.googleapis.com/auth/drive']
# 上記で発行されたURLを記載
json_file = 'デプロイURL'
# URLの情報を辞書型へ変換
key = json.loads(requests.get(json_file).text)
# credentialsの読み込み
credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope)
gauth = GoogleAuth()
gauth.credentials = credentials
drive = GoogleDrive(gauth)
driveを出力すると、内部で振られたアドレスが確認できます。(成功しています)
idを確認する
フォルダIDを確認してみましょう。ブラウザからフォルダIDをコピーします。
コードでフォルダidを取得し、assertで検証します。(assertはtry…catchと同様に例外を出力します。)
#フォルダ名を指定してフォルダIDを取得する
folder_id = drive.ListFile({'q': "title = 'オリジナルフォルダ'"}).GetList()[0]['id']
# 作成したフォルダIDと一致しているか確認
id = 'フォルダID'
# 一致していない場合はAssertionErrorがでる
assert folder_id == id
idが一致していれば何も出力されません。一致していなければ、このような例外が発生します。
おまけ(スプレッドシート)
スプレッドシートも同様に、認証用コードを用意します。
必要なモジュールや、scopeがドライブと異なりますが、基本的な考え方は同じです。
import gspread
import json
import requests
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
# 上記で発行されたURLを記載
json_file = 'デプロイURL'
# URLの情報を辞書型へ変換
key = json.loads(requests.get(json_file).text)
# credentialsを読み込む
credentials = ServiceAccountCredentials.from_json_keyfile_dict(key, scope)
gc = gspread.authorize(credentials)
ss_id = 'SSID'
sht_name = 'シート1'
workbook = gc.open_by_key(ss_id)
worksheet = workbook.worksheet(sht_name)
まとめ
以上で、「Googleドライブを自動でマウントしよう」をお届けしました。
共有とかWEBアプリとして公開は、反映に少し時間が掛かるので、待ってみてください。
Google Colabratoryは、スマホからの実行や、定期的な実行も可能です。
また、記事をまとめたいと思います。