Shouji
@Shouji (祥司 平田)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Googleカレンダにpythonからアクセスしたい

解決したいこと

googleカレンダの予定をpython(windowsのアプリにするつもり)で取得しようとしてるが、OAuthのところで躓いています

拾ってきた例題を見ながらpythonでgoogleカレンダにアクセスし、登録された予定を取得しようとしています。

  1. Google API Consoleで、Google Calendar APIを有効にする
  2. 認証情報を作成し、クライアントIDとクライアントシークレットを取得する。
  3. 認証情報のjsonファイルをダウンロードしローカルに置く
    ここまではできました。以下そのファイル(改行を加えて一部伏せ字にしています)
{
	"installed": {
		"client_id": "XXX.apps.googleusercontent.com",
		"project_id": "XXX",
		"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_secret": "XXX",
		"redirect_uris": [
			"http://localhost"
		]
	}
}

発生している問題・エラー

以下googleカレンダにアクセスする部分のコードです

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from datetime import datetime, time, timedelta

# 認証情報ファイルのパスを指定して認証情報を取得
creds = Credentials.from_authorized_user_file('/PythonGui/gjog/client_secret.json', ['https://www.googleapis.com/auth/calendar'])

# Google Calendar APIを使用してカレンダーのイベントを取得する
service = build('calendar', 'v3', credentials=creds)

このコードを実行すると
Credentials.from_authorized_user_file
の部分(OAuth?)で以下のようなエラーになります

 File "n:\PythonGui\gjog\calenderInfoGet.py", line 8, in <module>
    creds = Credentials.from_authorized_user_file('n:/PythonGui/gjog/client_secret.json', ['https://www.googleapis.com/auth/calendar'])
  File "C:\Users\glp\Anaconda3\lib\site-packages\google\oauth2\credentials.py", line 440, in from_authorized_user_file
  File "n:\PythonGui\gjog\calenderInfoGet.py", line 8, in <module>
   return cls.from_authorized_user_info(data, scopes)  File "C:\Users\glp\Anaconda3\lib\site-packages\google\oauth2\credentials.py", line 390, in from_authorized_user_info
  raise ValueError(ValueError: Authorized user info was not in the expected format, missing fields client_secret, client_id, refresh_token.

(base) N:\PythonGui>C:/Users/glp/Anaconda3/python.exe n:/PythonGui/gjog/calenderInfoGet.py

エラーを見るとclient_secret, client_id, refresh_token.の形式不正のようですが、client_id, refresh_tokenはgoogleCloudに表示される内容と一致していますが、たしかにjsonにはrefresh_tokenは存在しません。

自分で試したこと

  1. 実際の環境ではjsonファイルはダウンロードしたまま(改行を入れていない)使用しています
  2. jsonファイルにはアクセスできています
    ファイルを削除して試すとファイル未存在のエラーが出ているので確かにjsonファイルのアクセスはできているようです
  3. client_id,client_secretはgoogleCloudで表示されるものと一致しています
  4. デスクトップ のクライアント IDは「有効化済み」と表示されています

疑問点と質問

  1. エラーに表示されるreflesh_tokenはなにか自分で設定すべき項目ですか?
  2. あるいはjsonの取得方法(googlecloudの操作など)が違っていて本来jsonに入るべき値がなくなっている

のでしょうか?
なにかヒントでもいただけると嬉しいです

1

2Answer

私は、こちらで解決しました。
  ↓↓↓
https://qiita.com/electronics_diy721/items/167d6c61dfd73180fdca
サービスアカウントを作成して、鍵を作る必要があるようです。
なので、ダウンロードしたjsonのフォーマットが違っていましたので、
jsonファイルを作り直したら成功しました。
同じかどうかわかりませんが、お試しください。

1Like

Comments

  1. 私も同じところで止まっております。

Your answer might help someone💌