Google API quickstart.py错误KeyError:'_ module'

时间:2015-06-21 16:40:43

标签: python google-api gmail-api

使用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

5 个答案:

答案 0 :(得分:11)

oauth2client正在尝试从结构不正确的json文件加载凭据。

也许Ruby客户端使用不同的文件格式,但我会感到惊讶。您确定没有意外将client_secret.json保存为~/.credentials/gmail-quickstart.json吗?

无论如何,删除~/.credentials/gmail-quickstart.json并重新进行身份验证将生成具有正确结构的新凭据文件。

答案 1 :(得分:1)

我自己在学习Python并遇到类似的问题,但Calendar API example。事实证明,这是一个关于SCOPE的错字。

## 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应用程序启动了我的网络浏览器(Firefox)实例,并进入了Google登录界面。为了让Firefox正常运行,我必须首先正确设置我的DISPLAY变量。

$ export DISPLAY=:0
$ xhost +
access control disabled, clients can connect from any host

答案 2 :(得分:1)

我通过将client_secret.json移动到与尝试读取它的py文件相同的目录(quickstart.py)解决了这个问题,我将桌面上的json保存到了桌面上。我把json也保存到桌面上了,男孩,它飞了!。

我不知道为什么它们在不同的目录中时不起作用,定义自定义凭证路径无效。

答案 3 :(得分:1)

在这个 GitHub 问题中:error "KeyError: '_module'" when running gdrive_upload.py

sputnik-dev 于 2016 年 1 月 10 日回答:

<块引用>

如果有人遇到同样的问题:auth_token.txtclient_secret.json 不一样!不要从 google API 控制台链接 client_secret.json。该文件将由脚本自动创建。

错误方式:gauth.SaveCredentialsFile("client_secret.json")

正确的方法:gauth.SaveCredentialsFile("<any random name>.json")

额外:

自动执行谷歌驱动 API 身份验证的 PyDrive 代码。仅使用浏览器一次进行身份验证,以后再也不使用了。它会将您的凭据数据保存在 mycreds.json :)

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LoadCredentialsFile("mycreds.json")

if gauth.credentials is None:
    gauth.LocalWebserverAuth()

elif gauth.access_token_expired:
    gauth.Refresh()

else:
    gauth.Authorize()

gauth.SaveCredentialsFile("mycreds.json")

答案 4 :(得分:0)

我遵循了此处列出的一些建议:

  • 按照simic0de的建议,将client_secret.json与尝试读取它的py文件移动到同一目录。

  • 使用skirill想法,而不是完全消除“ credentials = store.get()”,我决定处理该异常,因此它将与基于流的凭据实例化一起使用。

最终代码是:

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

您可以在除外行中编写自己的代码。这种方法将使store.get()命令在满足条件时起作用。