Python 如何避免';检索访问令牌失败:{quot;error";:“invalid_grant";}';在离线GAE cron任务中?
这篇文章是一篇后续文章。Python 如何避免';检索访问令牌失败:{quot;error";:“invalid_grant";}';在离线GAE cron任务中?,python,google-app-engine,google-api,oauth-2.0,google-api-python-client,Python,Google App Engine,Google Api,Oauth 2.0,Google Api Python Client,这篇文章是一篇后续文章。http=credentials.authorize(httplib2.http())部分在测试时不再失败,但在GAE的cron运行时似乎仍然失败,因为它无法刷新我的access\u令牌: 我可以通过调用/fetch手动运行我的作业,比如在11:45 立即在11:55调度/cronfetch作业,然后,无任何访问令牌问题 但是,今天早上醒来时,我发现相同的/cronfetch任务(除了计时之外,时间相同,对于我的非测试日常任务,时间是01:00)失败了: → 为什么cro
http=credentials.authorize(httplib2.http())
部分在测试时不再失败,但在GAE的cron运行时似乎仍然失败,因为它无法刷新我的access\u令牌
:
/fetch
手动运行我的作业,比如在11:45/cronfetch
作业,然后,无任何访问令牌问题
/cronfetch
任务(除了计时之外,时间相同,对于我的非测试日常任务,时间是01:00)失败了:
→ 为什么cron作业在手动运行5分钟后工作,但在6小时后失败?我以为刷新令牌从未过期。我做错了什么
请注意,这是我的第一个GAE工作,也是我的第二个Python程序,非常欢迎您提供一般代码审查/建议,但请温和:)
代码已打开,可以在访问我的实例。谢谢你的帮助 当刷新令牌无法用于从当前用户获取新的访问令牌时,将返回
无效的\u授权。发生这种情况是因为存储的凭据对象具有空刷新令牌,即
>>> credentials.refresh_token is None
True
如中的注释所述:
如果用户已经授权了您的客户机ID,那么在随后为这些用户执行OAuth时,他们将不会看到OAuth对话框,也不会向您提供刷新令牌
您需要确保您的凭证
存储在有效的刷新令牌中,并且最简单的方法是在创建OAuth2WebServerFlow
或OAuth2Decorator
对象时使用approval\u prompt=force
(以您使用的为准).好吧,我想我不需要这个,因为我的cron任务只工作过一次!同一个cron任务怎么能在手动任务完成几分钟后工作,但6小时后失败?还有第二个问题:因为我使用的是OAuth2DecoratorFromClientSecrets
,它不会将额外的**kwargs
转发给OAuth2Decorator
,你怎么办您建议设置附加的approval\u prompt=force
参数吗?是否必须在初始化时执行此操作,或者如果创建我的decorator=OAuth2DecoratorFromClientSecrets…
并执行decorator.params.update({approval\u prompt='force'),是否可以
之后?谢谢。当凭据时,cron任务将工作。access\u token
有效,但access token将在1小时后过期。过期后,凭据。需要刷新\u token
以获取新的访问令牌。您可能需要装饰程序.params.update({approval\u prompt':'force})
但是没有充分的理由不将其传递给构造函数。好的,我不知道1小时的限制,谢谢。关于“没有充分的理由不将其传递给构造函数”,我很想!但是OAuth2DecoratorFromClientSecrets
似乎不尊重/转发额外的**kwargs
(这是我从源代码中了解到的,如果我尝试,它会引发异常),这就是我的问题。我遗漏了什么吗?是的,我不能评论使用OAuth2DecoratorFromClientSecrets
,因为我没有使用它,但如果你只是使用OAuth2Decorator
你就没有问题了。在那一个上选择你的毒药。即使在之后,我仍然会得到一个无效的\u grant
错误。我的测试场景:1.手动测试(/fetch
,有效),2.70分钟的等待,3.cron运行(/cronfetch
,返回无效授权
错误)。你知道吗?
...
E 2013-06-10 08:26:12.817 http://www.onedayonemusic.com/page/2/ : found embeds ['80wWl_s-HuQ', 'kb1Nu75l1vA', 'kb1Nu75l1vA', 'RTWcNRQtkwE', 'RTWcNRQtkwE', 'ZtDXezAhes8', 'ZtDXezAhes8', 'cFGxNJhKK9c', 'cFGxNJhKK9c'
I 2013-06-10 08:26:14.019 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-06-10 08:26:14.020 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 08:26:14.022 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus
I 2013-06-10 08:26:14.100 Refreshing due to a 401
I 2013-06-10 08:26:14.105 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-06-10 08:26:14.106 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-06-10 08:26:14.106 Refreshing access_token
E 2013-06-10 08:26:18.994 Deadline exceeded while waiting for HTTP response from URL: https://accounts.google.com/o/oauth2/token Traceback (most recent call last): File "/pyt
E 2013-06-10 08:26:18.996 http://www.onedayonemusic.com/page/3/ : found embeds ['80wWl_s-HuQ', '6VNu2MLdE0c', '6VNu2MLdE0c', 'YwQilKbK9Mk', 'YwQilKbK9Mk', 'KYdB3rectmc', 'KYdB3
E 2013-06-10 08:26:18.996 crawl_videos end
E 2013-06-10 08:26:18.996 create_playlist start
E 2013-06-10 08:26:18.996 create_playlist got creds
E 2013-06-10 08:26:18.996 create_playlist authorized creds
>>> credentials.refresh_token is None
True