Google API faststart.py 错误 KeyError: '_module'

问题描述 投票:0回答:7

使用 Gmail API。我的客户端机密文件已下载并可用于 Ruby。当我尝试 faststart.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

python google-api gmail-api
7个回答
15
投票

尝试暂时将

creds = store.get()
替换为
creds = None
。如果这有效,您可以重构代码以始终从基于流的凭据实例化开始。这对我有用。看来 Google 示例与他们的 oauth2client 不同步。


13
投票

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

也许 Ruby 客户端使用不同的文件格式,但我会感到惊讶。您确定您没有不小心将

client_secret.json
保存为
~/.credentials/gmail-quickstart.json
吗?

无论如何,删除

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


2
投票

我自己正在学习 Python,并且遇到了类似的问题,但是使用的是 Calendar API 示例。事实证明,这是 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
投票

在此 GitHub 问题中:运行 gdrive_upload.py 时出现错误“KeyError: '_module'”

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

如果有人有同样的问题:

auth_token.txt
client_secret.json
不一样!不要从 google API 控制台链接
client_secret.json
。该文件将由脚本自动创建。

错误方式:

gauth.SaveCredentialsFile("client_secret.json")

正确方法:

gauth.SaveCredentialsFile("<any random name>.json")

额外:

自动执行 Google Drive 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")

1
投票

我通过将 client_secret.json 移动到与尝试读取它的 py 文件(quickstart.py)相同的目录来解决这个问题,我的文件位于桌面上,而我已将 json 保存到文档中。我也将 json 保存到桌面,天哪,它飞了!.

我不知道为什么当它们位于不同的目录中时它不起作用,定义自定义 credential_path 没有帮助。


1
投票

我遵循了此处列出的几项建议:

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

  • 使用skirill idea,而不是完全消除“credentials=store.get()”,我决定处理异常,这样它就可以与基于流的凭证实例化一起使用。

最终代码为:

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

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


0
投票

此错误的根本原因是您当前使用的

token.json
(或
storage.json
)文件是由使用较新的Python身份验证客户端库的应用程序编写的(意味着您的代码用最少的内容编写了该文件) ).

oauth2client
库较旧,需要这样的文件(由其自身编写)在 JSON 负载中包含不存在的
_module
条目。当然,暂时重命名
creds = None
是可行的,但实际上,您可以删除该令牌文件并再次运行脚本(并重新验证),而无需更改其任何代码。

如果您对此感到困惑,并且想要查看使用

oauth2client
的旧示例和使用替换客户端库的新示例,其中您的代码必须编写与
oauth2client
不兼容的(删节的)令牌文件,请参阅我在 https://github.com/wescpy/gsuite-apis-intro/tree/master/python 创建的两个 Drive 示例。

© www.soinside.com 2019 - 2024. All rights reserved.