web-dev-qa-db-ja.com

Google API quickstart.pyエラーKeyError: '_module'

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

30
ElioRubens

oauth2clientは、不正な構造を持つJSONファイルから資格情報をロードしようとしています。

たぶんRubyクライアントは別のファイル形式を使用しますが、驚かれるでしょう。保存しなかったのは確かですかclient_secret.json なので ~/.credentials/gmail-quickstart.json偶然?

とにかく、~/.credentials/gmail-quickstart.jsonおよび再認証により、正しい構造を持つ新しい資格情報ファイルが生成されます。

11
Matt

creds = store.get()を一時的にcreds = Noneに置き換えてみてください。これが機能する場合、コードをリファクタリングして、常にフローベースの資格情報のインスタンス化から開始できます。これは私のために働いた。 Googleサンプルはoauth2clientと同期していないようです。

7
skirill

Client_secret.jsonを、それを読み取ろうとしているpyファイル(quickstart.py)と同じディレクトリに移動することでこれを解決しました。私もjsonをデスクトップに保存しました。

カスタムcredential_pathを定義しても役に立たないため、異なるディレクトリにあるときに機能しない理由はわかりません。

1
simic0de

私は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
1
Randy B.

ここにリストされているいくつかの推奨事項に従いました。

  • simic0deで推奨されているように、client_secret.jsonを、読み取ろうとしているpyファイルと同じディレクトリに移動します。

  • 「credentials = store.get()」を完全に排除する代わりに、スキリルのアイデアを使用して、例外を処理することにしました。したがって、フローベースの資格情報のインスタンス化で機能します。

最終的なコードは次のとおりです。

try:
    credentials = store.get()
except:
    print('Working with flow-based credentials instantiation')

Except行に独自のコードを書くことができます。このアプローチにより、条件が満たされたときにstore.get()コマンドが機能するようになります。

0
xiaxio