gpt4 book ai didi

python - "' 凭据 ' object has no attribute ' access_token '"将 google-auth 与 gspread 结合使用时

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:03 25 4
gpt4 key购买 nike

我想使用 gspread从 Python 编辑 Google 表格的模块。 setup instructions包含以下示例:

import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name('gspread-april-2cd … ba4.json', scope)

gc = gspread.authorize(credentials)

然而,根据https://pypi.org/project/oauth2client/ oauth2client 库已弃用。所以我尝试使用 google-auth 对其进行如下调整:

import gspread
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
'my_client_secrets.json')

scoped_credentials = credentials.with_scopes(
['https://www.googleapis.com/auth/spreadsheets'])

gc = gspread.authorize(scoped_credentials)

不幸的是,我遇到了以下错误:

(lucy-web-CVxkrCFK) bash-3.2$ python nps.py
Traceback (most recent call last):
File "nps.py", line 54, in <module>
gc = gspread.authorize(scoped_credentials)
File "/Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/gspread/__init__.py", line 38, in authorize
client.login()
File "/Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/gspread/client.py", line 46, in login
if not self.auth.access_token or \
AttributeError: 'Credentials' object has no attribute 'access_token'

如果我进入调试器,我确实看到 credentials 有一个 token 属性,但没有 access_token 属性:

> /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/scripts/nps.py(54)<module>()
53 import ipdb; ipdb.set_trace()
---> 54 gc = gspread.authorize(scoped_credentials)
55

ipdb> type(credentials)
<class 'google.oauth2.service_account.Credentials'>
ipdb> type(scoped_credentials)
<class 'google.oauth2.service_account.Credentials'>
ipdb> dir(credentials)
['__abstractmethods__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_abc_impl', '_additional_claims', '_from_signer_and_info', '_make_authorization_grant_assertion', '_project_id', '_scopes', '_service_account_email', '_signer', '_subject', '_token_uri', 'apply', 'before_request', 'expired', 'expiry', 'from_service_account_file', 'from_service_account_info', 'has_scopes', 'project_id', 'refresh', 'requires_scopes', 'scopes', 'service_account_email', 'sign_bytes', 'signer', 'signer_email', 'token', 'valid', 'with_claims', 'with_scopes', 'with_subject']

google-auth 生成的Credentialsoauth2client 生成的不是同一个对象吗?

最佳答案

根据 gspread 文档,gspread.authorize方法仅支持由 oauth2client library 创建的凭据对象.使用新的 google-auth一,gspread应该增加对它的支持。

如果您不想使用已弃用的 oauthclient2,可能的解决方法是使用 authlib利用 gspread.Client 的 session 参数类(class)。关于如何执行此操作有一个很好的教程 here .

2020 年 4 月 27 日更新

version 3.4.0开始gspread 现在支持 google-auth .您可以在 dedicated documentation 中找到所有详细信息.这是作者的官方声明:

Older versions of gspread have used oauth2client. Google has deprecated it in favor of google-auth. If you’re still using oauth2client credentials, the library will convert these to google-auth for you, but you can change your code to use the new credentials to make sure nothing breaks in the future.

关于python - "' 凭据 ' object has no attribute ' access_token '"将 google-auth 与 gspread 结合使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com