大约一周前,我在谷歌上设置了一个应用程序。现在当我尝试跑步时:
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
creds = None
if os.path.exists('token.pickle'):
with open(self.CREDENTIALS_PATH+self.conjoiner+'token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request()) ##error here
我收到以下错误:
Exception has occurred: RefreshError
('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})
可能是什么问题?
token.pickle 包含应用程序的访问令牌和刷新令牌。
令牌已过期或被撤销。'
意味着此文件中的引用令牌不再起作用,这可能是由服务器原因引起的。
以上所有信息都可以在Oauth2过期文档
中找到选项1-3的解决方案是简单地删除token.pickle文件并再次请求用户授权。
对于第四点,您应该转到 Oauth2 同意屏幕下的 Google 开发者控制台,并将您的应用程序设置为生产。然后您的刷新令牌将停止过期。然后你就可以删除token.pickle,就不会再出现这个问题了。
这里或那里的答案都没有让我回到正轨,但解决方案非常简单(而且晦涩):
.pickle
文件并重新运行您的脚本。就我而言,我使用的是 Google Sheets API 的 Julia 包装器,名为 GoogleSheets。在这种情况下,这两个文件以
google_sheets_token
开头,并与 ~/.julia/config/google_sheets/
文件一起存储在 credentials.json
中。
我不知道为什么有两个 pickle 文件(也许是两个身份验证范围,尽管公平地说,谷歌的身份验证方案对我来说很神秘),但删除这两个文件会导致下次运行脚本时抛出 OAuth浏览器窗口中出现提示,一切又恢复正常了。
它们似乎经常过期,并且有各种关于其原因的可靠理论。但原因似乎随着它们过期而发生变化,因此每次删除它们似乎是最可靠的修复方法。