Gmail APIを使用します。クライアントシークレットファイルがダウンロードされ、Rubyで動作します。 quickstart.py(python)バージョンを試すと、このエラーが発生します
File "quickstart.py", line 70, in <module>
main()
File "quickstart.py", line 55, in main
credentials = get_credentials()
File "quickstart.py", line 38, in get_credentials
credentials = store.get()
File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 374, in get
return self.locked_get()
File "/Library/Python/2.7/site-packages/oauth2client/file.py", line 79, in locked_get
credentials = Credentials.new_from_json(content)
File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 281, in new_from_json
module = data['_module']
KeyError: '_module'
ファイルをまったく変更せず、client_secret.jsonをその作業ディレクトリに追加し、google-api-python-clientもインストールします。私のpythonコードはここから来ました: https://developers.google.com/gmail/api/quickstart/python
oauth2clientは、不正な構造を持つJSONファイルから資格情報をロードしようとしています。
たぶんRubyクライアントは別のファイル形式を使用しますが、驚かれるでしょう。保存しなかったのは確かですかclient_secret.json
なので ~/.credentials/gmail-quickstart.json
偶然?
とにかく、~/.credentials/gmail-quickstart.json
および再認証により、正しい構造を持つ新しい資格情報ファイルが生成されます。
creds = store.get()
を一時的にcreds = None
に置き換えてみてください。これが機能する場合、コードをリファクタリングして、常にフローベースの資格情報のインスタンス化から開始できます。これは私のために働いた。 Googleサンプルはoauth2clientと同期していないようです。
Client_secret.jsonを、それを読み取ろうとしているpyファイル(quickstart.py)と同じディレクトリに移動することでこれを解決しました。私もjsonをデスクトップに保存しました。
カスタムcredential_pathを定義しても役に立たないため、異なるディレクトリにあるときに機能しない理由はわかりません。
私はPython自分で、同様の問題を抱えていましたが、 カレンダーAPIの例 で学習していました。
## Typo - Invalid definition
SCOPES = 'https://ww.googleapies.com/auth/calendar.readonly'
## Correct Value for SCOPE
SCOPES = 'https://www.googleapis.com/auth/calendar'
また、マットの答えは正しい方向に私を向けるのに役立ちます。 gmail-quickstart.jsonはclient_secret.jsonと同じものではありません。 client_secret.jsonを使用すると、OAuth2トークンをリクエストできます。 gmail-quickstart.jsonには、発行されたトークンとそれに関連付けられたメタデータが含まれています。 gmail-quickstart.jsonは、正常にログインするまで作成されません。
最後に考えたのは、ログインに成功するために、quickstart.pyアプリがWebブラウザー(Firefox)のインスタンスを起動し、Googleログイン画面に移動したことです。 Firefoxを適切に実行するには、まずDISPLAY変数を適切に設定する必要がありました。
$ export DISPLAY=:0
$ xhost +
access control disabled, clients can connect from any Host
ここにリストされているいくつかの推奨事項に従いました。
simic0deで推奨されているように、client_secret.jsonを、読み取ろうとしているpyファイルと同じディレクトリに移動します。
「credentials = store.get()」を完全に排除する代わりに、スキリルのアイデアを使用して、例外を処理することにしました。したがって、フローベースの資格情報のインスタンス化で機能します。
最終的なコードは次のとおりです。
try:
credentials = store.get()
except:
print('Working with flow-based credentials instantiation')
Except行に独自のコードを書くことができます。このアプローチにより、条件が満たされたときにstore.get()コマンドが機能するようになります。