https://developers.google.com の Quick Start などを参考に Google API を使うプログラムを作ったら、Client secrets must be for a web or installed app. というエラーが発生した。という場合
原因
OAuth 2.0 クライアント ID ではなく、サービスアカウントのキー (json ファイル)を指定すると発生する。メッセージの訳は「ウェブアプリかインストールされたアプリのクライアントシークレットを使え」ということだが、そういうこと。
対策
json ファイルを読み込むときに、InstalledAppFlow ではなくサービスアカウント専用のオブジェクトを利用する
from google_auth_oauthlib.flow import InstalledAppFlow
from google.oauth2 import service_account
flow = InstalledAppFlow.from_client_secrets_file(creds_path, scopes)
creds = flow.run_local_server(port=0)
creds = service_account.Credentials.from_service_account_file(creds_path, scopes=scopes)
[…] これでだいたい上手くいくと思いますが、 “Client secrets must be for a web or installed app.” などと新しいエラーが発生する場合は、こちらの記事も参照ください。 […]