gdata-python-api + Analytics with simple auth



我正在努力使用Google gdata API客户端+user/pass身份验证将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 客户端检索分析数据,如果是这样,是否有人有任何身份验证示例?我已经有数据检索的东西在经过身份验证后工作,但我使用的是用户/传递方法,这不适合生产。

Greg,

如果您已经在使用 gdata-python-client 库,那么如果您是应用程序将授权的唯一用户,则这样做相对容易。

一般机制在 2011 年 9 月的一篇博客文章中详细介绍,但为了完整起见,我将在此处描述它们。

第 1 部分:进入 API 控制台并启动新项目。

第 2 部分:从项目中转到"服务"并启用"分析 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')

从GData常见问题解答中获得了范围,尽管我不确定它是否正确。

第 5 部分:使用令牌创建授权 URL 供您访问:

url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob')

由于您的应用程序是"已安装的应用程序",因此您的重定向 URI 是默认'urn:ietf:wg:oauth:2.0:oob'。(另请注意,博客文章有一个错别字,并使用了关键字参数redirect_url

第 6 部分:访问 URL 并授权您的应用程序代表您的帐户提出请求。授权后,您将被重定向到带有代码的页面。此代码将用于交换访问令牌和长期刷新令牌。代码的生存期为 10 分钟,访问令牌的生存期为一小时。刷新令牌将允许你获取新的访问令牌,用于永久签署请求(或直到你撤销帐户的权限)。

第 7 部分:使用代码获取访问令牌:

code = 'random-string-from-redirected-page'
token.get_access_token(code)  # This returns the token, but also changes the state

这再次与博客文章略有不同,因为我们使用的是已安装的应用程序。

第 8 部分:使用令牌,您现在可以向分析客户端发出要发出的所有请求:

import gdata.analytics.client
client = gdata.analytics.client.AnalyticsClient()
token.authorize(client)

这是一笔大钱。当访问令牌过期时,使用该令牌签名的 API 请求将被拒绝。但是,通过如上所述授权客户端,当所述请求失败时,token会尝试使用刷新令牌来获取新的访问令牌。如果成功获取新的访问令牌,客户端将重新发送使用新访问令牌签名的原始 API 请求。

我对分析 API 一无所知,所以我不会在那里提供更多细节。

未来使用注1:保存信息以备将来使用。您可以从不同的地方重复使用它,并且在此之后非常容易地使用它。库提供了一些称为token_to_blobtoken_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 来获取新的刷新令牌:

url = token.generate_authorize_url(
    redirect_uri='urn:ietf:wg:oauth:2.0:oob',
    approval_prompt='force')