我正在努力将使用Google gdata API客户端+用户/通过身份验证的Python脚本转换为更适合生产的东西(API密钥).我对他们关于身份验证的文档的混乱状态感到非常沮丧.我承认自己并没有很好地掌握OAuth2,但对我的使用案例来说似乎更为复杂,即:每24小时点击一次谷歌分析,就可以获得我们网站上最受欢迎的X文章.
在这种情况下,我们不会处理修改某人的个人数据,并且所有活动都集中在一个帐户上.对于这么简单的事情来说,OAuth2似乎不值得复杂.
我在Google API控制台(https://code.google.com/apis/console/)上看到,我在那里注册并注意到有一个"简单API访问"部分,其中一个键位于"客户端ID"下方网络应用程序"(似乎是OAuth2).还有Google域名更新页面,https://www.google.com/accounts/UpdateDomain,但似乎与OAuth相关.
有没有办法使用这个简单的API访问密钥(而不是OAuth)来检索Python gdata客户端的分析数据,如果是这样,有没有人有任何身份验证示例?我已经对数据检索工作进行了一次身份验证,但我使用的是用户/传递方法,这种方法不适合生产.
bos*_*ter 12
格雷格
如果您已经在使用库gdata-python-client,那么如果您是应用程序将授权的唯一用户,这相对容易.
一般机制在2011年9月的博客文章中有详细介绍,但我会在这里描述它们的完整性.
第1部分:转到API控制台并启动一个新项目.
第2部分:从项目中,转到"服务"并启用"Analytics API"
第3部分:从项目中,转到"API访问"并单击"创建OAuth 2.0客户端ID ..."(您需要提供产品名称,但您提供的值无关紧要).当询问应用程序类型时,选择"已安装的应用程序",然后选择"创建客户端ID".由于您将是唯一的用户,因此您只需要一个刷新令牌,并且您可以通过一次性从桌面应用程序进行授权来实现此目的.
第4部分:从API控制台获取客户端ID和客户端密钥,然后创建一个空令牌:
import gdata.gauth
CLIENT_ID = 'id-from-apis-console'
CLIENT_SECRET = 'secret-from-apis-console'
SCOPE = 'https://www.google.com/analytics/feeds/' # Default scope for analytics
token = gdata.gauth.OAuth2Token(
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
scope=SCOPE,
user_agent='application-name-goes-here')
Run Code Online (Sandbox Code Playgroud)
我从GData FAQ获得了范围,但我不确定它是否正确.
第5部分:使用令牌创建授权URL供您访问:
url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob')
Run Code Online (Sandbox Code Playgroud)
由于您的应用程序是"已安装的应用程序",因此您的重定向URI是默认值'urn:ietf:wg:oauth:2.0:oob'.(另请注意,博客帖子有拼写错误并使用了关键字参数redirect_url.)
第6部分:访问网址并授权您的申请代表您的帐户提出请求.授权后,您将被重定向到包含代码的页面.此代码将用于交换访问令牌和长期刷新令牌.代码的生命周期为10分钟,访问令牌的生命周期为一小时.刷新令牌将允许您获得永久签名请求的新访问令牌(或直到您撤销帐户的权限).
第7部分:使用代码获取访问令牌:
code = 'random-string-from-redirected-page'
token.get_access_token(code) # This returns the token, but also changes the state
Run Code Online (Sandbox Code Playgroud)
这与博客文章略有不同,因为我们使用的是已安装的应用程序.
第8部分:使用令牌,您现在可以向分析客户端发出所有要求的请求:
import gdata.analytics.client
client = gdata.analytics.client.AnalyticsClient()
token.authorize(client)
Run Code Online (Sandbox Code Playgroud)
这是这里的大笔资金.当访问令牌过期时,将拒绝使用该令牌签名的API请求.但是,通过如上所述授权客户端,当所述请求失败时,token尝试使用刷新令牌来获得新的访问令牌.如果成功获取新的访问令牌,则客户端将重新发送使用新访问令牌签名的原始API请求.
我对Analytics API一无所知,所以我不会在那里提供任何更多细节.
未来使用注1:保存信息以备将来使用.您可以从不同的地方重复使用它,之后很容易使用.库中调用token_to_blob并token_from_blob提供了一些方法,允许将标记转换为字符串并转换为字符串:
saved_blob_string = gdata.gauth.token_to_blob(token)
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您可以将该字符串存储在一个文件中并终止正在运行的Python进程.如果您想再次使用它:
saved_blob_string = retrieve_string_from_file() # You'll need to implement this
token = gdata.gauth.token_from_blob(saved_blob_string)
Run Code Online (Sandbox Code Playgroud)
未来使用注意2:只要您拥有刷新令牌,此令牌将能够用于授权客户端并一次又一次地执行所有魔法.如果由于某种原因您希望在不调用的情况下再次获取访问令牌token.generate_authorize_url,则需要在对象上手动设置:
token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
Run Code Online (Sandbox Code Playgroud)
未来使用注意3:此外,如果您丢失了刷新令牌并希望获得另一个令牌而无需转到浏览器撤销原始approval_prompt令牌,则可以通过访问由以下内容生成的URL 来使用该参数获取新的刷新令牌:
url = token.generate_authorize_url(
redirect_uri='urn:ietf:wg:oauth:2.0:oob',
approval_prompt='force')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |