Gmail API quickstart.py脚本返回KeyError'_module'

时间:2018-07-22 01:15:17

标签: python oauth-2.0 gmail-api

我启用了Gmail API,并下载了包含令牌的.json文件。我将其放置在脚本所在的文件夹中。当我尝试运行它时,出现此错误:

Traceback (most recent call last):
  File "email_clean.py", line 14, in <module>
    creds = store.get()
  File "C:\Python27\lib\site-packages\oauth2client\client.py", line 407, in get
    return self.locked_get()
  File "C:\Python27\lib\site-packages\oauth2client\file.py", line 54, in locked_get
    credentials = client.Credentials.new_from_json(content)
  File "C:\Python27\lib\site-packages\oauth2client\client.py", line 302, in new_from_json
    module_name = data['_module']
KeyError: '_module'

我知道,关于同一问题,还有其他一些问题,但是这些解决方案对我没有帮助。 token.json文件与脚本位于同一文件夹中,并且据我所知,URL似乎拼写正确。 JSON文件的格式正确。任何帮助将不胜感激。

这是脚本:

"""
Shows basic usage of the Gmail API.

Lists the user's Gmail labels.
"""
from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

# Setup the Gmail API
SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
store = file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
    creds = tools.run_flow(flow, store)
service = build('gmail', 'v1', http=creds.authorize(Http()))

# Call the Gmail API
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
if not labels:
    print('No labels found.')
else:
    print('Labels:')
    for label in labels:
        print(label['name'])

2 个答案:

答案 0 :(得分:0)

没有找到/读取您的token.json文件。 (您可以查看该文件,并看到它的第一行应显示为:

{"_module":  "oauth2client.client",
...

简单的解决方法(假设您的文件具有正确的信息)是将完整的绝对路径名传递给file.Storage(),而不只是文件名。

在您的情况下,您说json文件以

开头
{"installed": {"client_id": ...

那是您的客户端机密json文件,而不是凭据json-您需要使用前者来获取后者。该文件(带有"installed")是您对client.flow_from_clientsecrets()的调用使用的文件。成功后,将按file.Storage()所示写入文件,并且在后续尝试中,该流将在令牌文件中查找并在其中使用信息(而不是clientsecrets)。

修复可能很简单,只要确保您的token.json文件在首次尝试时不存在,便会尝试执行流程并重新创建文件。

关于流程的一个很好的解释是:Ashok Yogi's A beginners guide to Google OAuth and Google APIs

答案 1 :(得分:0)

弄清楚了。问题是我将.json文件另存为token.json,但没有意识到这是一个在进行身份验证后被创建的文件。技巧是删除token.json,然后从开发人员控制台将.json文件另存为凭据.json。