gdata-python-api + 使用简单认证的分析工具
我正在把一个使用Google gdata API客户端和用户名/密码认证的Python脚本转换成更适合生产环境的版本,也就是用API密钥。我对他们关于认证的文档感到非常困惑。老实说,我对OAuth2的理解不太深,但感觉对于我这个使用场景来说,它似乎太复杂了。我的需求是:每24小时访问一次Google Analytics,获取我们网站上最受欢迎的X篇文章。
在这个情况下,我们并不涉及修改任何人的个人数据,所有的操作都是围绕一个账户进行的。对于这么简单的事情,使用OAuth2似乎不值得这么复杂。
我在Google API控制台(https://code.google.com/apis/console/)上注册了账号,注意到有一个“简单API访问”部分,下面有一个“用于Web应用程序的客户端ID”的密钥(看起来是OAuth2)。还有一个Google域名更新页面,https://www.google.com/accounts/UpdateDomain,但那似乎也是和OAuth有关的。
有没有办法使用这个简单API访问密钥(而不是OAuth)来用Python gdata客户端获取分析数据?如果可以的话,有人能提供一些认证的例子吗?我已经有了数据获取的代码,只要认证通过就能工作,但我现在用的是用户名/密码的方式,这在生产环境中不太合适。
1 个回答
Greg,
如果你已经在使用这个库 gdata-python-client,那么如果你是唯一一个需要授权的用户,这个过程相对简单。
这些基本步骤在2011年9月的一篇博客文章中有详细说明,不过我在这里也会简单描述一下。
第一步:去API控制台,创建一个新项目。
第二步:在项目中,找到“服务”,然后启用“分析API”。
第三步:在项目中,去“API访问”,点击“创建OAuth 2.0客户端ID...”(你需要提供一个产品名称,不过你填的内容其实没关系)。当问到应用类型时,选择“已安装应用”,然后点击“创建客户端ID”。因为你是唯一的用户,所以只需要一个刷新令牌,你可以通过在桌面应用中授权一次来获取这个令牌。
第四步:从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')
我从GData常见问题中得到了范围,不过我不确定这是否正确。
第五步:使用这个令牌创建一个授权网址供你访问:
url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob')
由于你的应用是“已安装应用”,所以你的重定向URI是默认的 'urn:ietf:wg:oauth:2.0:oob'
。(另外,注意到博客文章中有个拼写错误,使用了关键字参数 redirect_url
。)
第六步:访问这个网址,授权你的应用代表你的账户发起请求。授权后,你会被重定向到一个页面,上面有一个代码。这个代码将用于换取访问令牌和长期有效的刷新令牌。这个代码的有效期是10分钟,而访问令牌的有效期是一个小时。刷新令牌可以让你不断获取新的访问令牌(直到你撤销账户的权限)。
第七步:使用这个代码获取访问令牌:
code = 'random-string-from-redirected-page'
token.get_access_token(code) # This returns the token, but also changes the state
这和博客文章稍有不同,因为我们使用的是已安装应用。
第八步:有了令牌,你现在可以向分析客户端发起所有想要的请求:
import gdata.analytics.client
client = gdata.analytics.client.AnalyticsClient()
token.authorize(client)
这才是关键。当访问令牌过期时,使用该令牌签名的API请求会被拒绝。但是,通过上述方式授权客户端后,当请求失败时,token
会尝试使用刷新令牌获取新的访问令牌。如果成功获取到新的访问令牌,客户端会重新发送原始的API请求,并用新的访问令牌进行签名。
我对分析API不太了解,所以不会提供更多细节。
未来使用注意事项1:保存信息以便将来使用。你可以很方便地在不同地方重用这些信息。库中有叫做 token_to_blob
和 token_from_blob
的方法,可以将令牌转换为字符串,也可以从字符串转换回来:
saved_blob_string = gdata.gauth.token_to_blob(token)
完成后,你可以把这个字符串存储在文件中,然后结束你的Python进程。当你想再次使用它时:
saved_blob_string = retrieve_string_from_file() # You'll need to implement this
token = gdata.gauth.token_from_blob(saved_blob_string)
未来使用注意事项2:只要你有刷新令牌,这个令牌就可以用来授权客户端,重复执行所有操作。如果你想在不调用 token.generate_authorize_url
的情况下再次获取访问令牌,你需要手动在对象上设置这个:
token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
未来使用注意事项3:如果你丢失了刷新令牌,想要在不去浏览器撤销原始令牌的情况下获取另一个,你可以使用 approval_prompt
参数,通过访问以下网址生成的新链接来获取新的刷新令牌:
url = token.generate_authorize_url(
redirect_uri='urn:ietf:wg:oauth:2.0:oob',
approval_prompt='force')