【问题标题】:Google API quickstart.py error KeyError: '_module'Google API quickstart.py 错误 KeyError: '_module'
【发布时间】:2015-09-07 03:13:48
【问题描述】:

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

【问题讨论】:

  • 有什么适合您的解决方案吗?
  • 我对@9​​87654323@ 有同样的问题,显然这是由于存储了无效的 OAuth2 凭据(即 ServiceAccounts)。在单独的分支上工作以进行本地测试并与生产合并时发生。如果这可能会有所帮助。

标签: python google-api gmail-api


【解决方案1】:

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

也许 Ruby 客户端使用不同的文件格式,但我会感到惊讶。你确定不是不小心把client_secret.json保存为~/.credentials/gmail-quickstart.json吗?

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

【讨论】:

  • 有用的解释... +1
  • 我刚刚使用了 Google 提供给我的确切结构,但该文件仍然不会被接受 - 还有更多建议吗?
  • 重新认证,它给你一个'client_secrets.json',会使'credentials.json'中的数据失效;你必须在运行任何东西之前删除它。如果您有“settings.yaml”文件,则需要更新“client_config:”数据以对应新的“client_id”和“client_secret”。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在这个 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("&lt;any random name&gt;.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")
    

    【讨论】:

      【解决方案4】:

      我自己也在学习 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
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我遵循了这里列出的几个建议:

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

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

            李>

          最终代码为:

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

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

          【讨论】:

            猜你喜欢
            • 2018-12-29
            • 1970-01-01
            • 1970-01-01
            • 2021-01-05
            • 2018-08-01
            • 1970-01-01
            • 2020-04-26
            • 2014-11-05
            • 2016-08-02
            相关资源
            最近更新 更多