【问题标题】:Gmail API quickstart.py script returns KeyError '_module'Gmail API quickstart.py 脚本返回 KeyError '_module'
【发布时间】:2018-12-29 20:55:10
【问题描述】:

我启用了 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'

我知道对于同一问题还有其他几个关于 SO 的问题,但这些解决方案对我没有帮助。 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'])

【问题讨论】:

    标签: python oauth-2.0 gmail-api


    【解决方案1】:

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

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

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

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

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

    这是您的客户端机密 json 文件,而不是凭证 json - 您需要使用前者来获取后者。该文件(带有"installed")是用于调用client.flow_from_clientsecrets() 的文件。成功时,将写入file.Storage() 指示的文件,在随后的尝试中,流程将查看令牌文件并使用其中的信息(而不是客户端机密)。

    修复可能很简单,只需确保您的 token.json 文件在第一次尝试时不存在,然后它将尝试执行流程并重新创建文件。

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

    【讨论】:

    • 添加完整路径没有帮助。我确实检查了 JSON 文件,但其中没有“_module”字符串。
    • 您的 json 文件是否以 {"installed": {"client_id": ".... 开头?如果是这样,那是您的 client_id json,而不是凭证 json。
    • 确实如此。那么如何获取凭证文件呢? API 文档中的示例没有提到我需要下载其他文件。
    • Ashok Yogi 的博客很清楚!注意 python 3.8 你需要调整 urllib 的导入。
    【解决方案2】:

    想通了。问题是我将 .json 文件保存为 token.json,没有意识到这是一个在通过身份验证后会创建的文件。诀窍是删除 token.json,然后将开发者控制台中的 .json 文件保存为 credentials.json。

    【讨论】:

    • 您好,我的问题和您一模一样,但我不明白您是如何解决的。可以详细点吗?
    • @mamadede 我不知道还能如何解释它......我只是删除了我错误创建的 token.json 文件,然后从开发者控制台保存了 credentials.json 文件。然后我只是重新运行了脚本并且它起作用了。因此,在store = file.Storage('token.json') 的行中,确保它没有指向您计算机上实际存在的文件。在flow = client.flow_from_clientsecrets('credentials.json', SCOPES) 的行中,确保您确实将该文件放在正确的位置。
    猜你喜欢
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2021-03-26
    • 2023-03-30
    相关资源
    最近更新 更多