目的
Google Sheets APIのPythonクライアントライブラリ『gspread』を使って、Heroku上のPythonスクリプトからGoogleスプレッドシートを操作したい
問題
- Google Sheets APIでGoogleスプレッドシートを操作するには、OAuth認証が必要
- https://www.kumilog.net/entry/2018/03/22/090000
- gspreadのリファレンスには『認証に必要な情報をJSONファイルで渡し、生成したcredentials変数』を使って認証する方法が紹介されている
- https://gspread.readthedocs.io/en/latest/oauth2.html
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('gspread-april-2cd … ba4.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open("Where is the money Lebowski?").sheet1
- Heroku上のPythonスクリプトで上記手順を実行するには、『認証に必要な情報が書かれたJSONファイル』をHerokuにデプロイする必要がある
- しかし、秘密情報である『認証に必要な情報が書かれたJSONファイル』をHerokuに置きたくない
- 認証に必要な情報はHerokuの環境変数から読み込みたい
という状況で、以下の記事を見つけた。
PythonのHerokuアプリケーションからGoogle Spread Sheetの読み書き
この記事では、環境変数とテンプレートから『認証に必要な情報が書かれたJSONファイル』を生成しているが、もっとシンプルな方法はないのか。
解決策
credentials変数を生成する際に、from_json_keyfile_nameではなく、from_json_keyfile_dictを使う。
from_json_keyfile_dictならば、認証に必要な情報をPython辞書オブジェクトで渡せる。
oauth2client.service_account module — oauth2client 4.1.2 documentation
認証に必要な情報をJSONファイルで渡す必要がなくなるので、『認証に必要な情報が書かれたJSONファイル』をHerokuに置く必要もなくなる。
コード
import gspread
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
# 辞書オブジェクト。認証に必要な情報をHerokuの環境変数から呼び出している
credential = {
"type": "service_account",
"project_id": os.environ['SHEET_PROJECT_ID'],
"private_key_id": os.environ['SHEET_PRIVATE_KEY_ID'],
"private_key": os.environ['SHEET_PRIVATE_KEY'],
"client_email": os.environ['SHEET_CLIENT_EMAIL'],
"client_id": os.environ['SHEET_CLIENT_ID'],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": os.environ['SHEET_CLIENT_X509_CERT_URL']
}
credentials = ServiceAccountCredentials.from_json_keyfile_dict(credential, scope)
gc = gspread.authorize(credentials)
wks = gc.open('Where is the money Lebowski?').sheet1
その他
- Herokuの環境変数にPRIVATE KEYを登録する際は、改行したうで、改行コードを消す。
hkmdvQ2feNjbklxE2MLRXrsDg\nVCCHmuITKnfFfrrXvUrkQLzVt
↓
hkmdvQ2feNjbklxE2MLRXrsDg
VCCHmuITKnfFfrrXvUrkQLzVt