使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端

Posted

技术标签:

【中文标题】使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端【英文标题】:Oauth client initialization in python for tumblr API using Python-oauth2 【发布时间】:2011-11-26 00:13:20 【问题描述】:

我是 Oauth 的新手。过去,对于用 Python 编写的 twitter 应用程序,我使用 python-oauth2 库来初始化客户端,如下所示:

consumer = oauth.Consumer(key = CONSUMER_KEY, secret = CONSUMER_SECRET)
token = oauth.Token(key = ACCESS_KEY, secret = ACCESS_SECRET)
client = oauth.Client(consumer, token)

这很容易,因为 twitter 提供了 CONSUMER 和 ACCESS 密钥和秘密。但现在我需要为 tumblr 做同样的事情。问题是 tumblr 只提供了 CONSUMER_KEY、CONSUMER_SECRET 和这些 url:

Request-token URL   http://www.tumblr.com/oauth/request_token
Authorize URL       http://www.tumblr.com/oauth/authorize
Access-token URL    http://www.tumblr.com/oauth/access_token

如何使用这些数据初始化客户端以访问 tumblr API?

更新

jterrace 建议了我之前尝试使用的代码。它的问题是 oauth_callback。如果我没有指定任何内容,api 将返回错误“未指定 oauth_callback”,但如果我指定了一些 url,如“http://example.com/oauthcb/”并点击链接http://www.tumblr.com/oauth/authorize?oauth_token=9ygTF...,然后按允许按钮,tumblr 不显示任何 PIN 码页面,它会立即重定向到该回调 url,因为它是桌面应用程序,所以没用。为什么不显示 PIN 码?

UPD 2

Tumblr API 不支持 PIN 码授权。改用 xAuth - https://groups.google.com/group/tumblr-api/browse_thread/thread/857285e6a2b4268/15060607dc306c1d?lnk=gst&q=pin#15060607dc306c1d

【问题讨论】:

请阅读 OAuth 文档,而不是要求预先准备好的解决方案。它可能不是地球上最简单的协议,但肯定不是黑魔法。 我读过,甚至尝试了一些解决方案但没有成功。 【参考方案1】:

首先,导入oauth2 module并设置服务的URL和消费者信息:

import oauth2

REQUEST_TOKEN_URL = 'http://www.tumblr.com/oauth/request_token'
AUTHORIZATION_URL = 'http://www.tumblr.com/oauth/authorize'
ACCESS_TOKEN_URL = 'http://www.tumblr.com/oauth/access_token'
CONSUMER_KEY = 'your_consumer_key'
CONSUMER_SECRET = 'your_consumer_secret'

consumer = oauth2.Consumer(CONSUMER_KEY, CONSUMER_SECRET)
client = oauth2.Client(consumer)

第 1 步:获取请求令牌。这是一个临时令牌,用于 让用户授权访问令牌并签署请求以获取 说访问令牌。

resp, content = client.request(REQUEST_TOKEN_URL, "GET")

request_token = dict(urlparse.parse_qsl(content))
print "Request Token:"
print "    - oauth_token        = %s" % request_token['oauth_token']
print "    - oauth_token_secret = %s" % request_token['oauth_token_secret']

第 2 步:重定向到提供程序。因为这是一个 CLI 脚本,所以我们不需要 重定向。在 Web 应用程序中,您会将用户重定向到 URL 下面。

print "Go to the following link in your browser:"
print "%s?oauth_token=%s" % (AUTHORIZATION_URL, request_token['oauth_token'])

# After the user has granted access to you, the consumer, the provider will
# redirect you to whatever URL you have told them to redirect to. You can 
# usually define this in the oauth_callback argument as well.
oauth_verifier = raw_input('What is the PIN? ')

第 3 步:一旦消费者将用户重定向回 oauth_callback 您可以请求用户已批准的访问令牌的 URL。您使用 请求令牌以签署此请求。完成后你扔掉 请求令牌并使用返回的访问令牌。你应该存储这个 访问令牌安全的地方,如数据库,以备将来使用。

token = oauth2.Token(request_token['oauth_token'], request_token['oauth_token_secret'])
token.set_verifier(oauth_verifier)
client = oauth2.Client(consumer, token)

resp, content = client.request(ACCESS_TOKEN_URL, "POST")
access_token = dict(urlparse.parse_qsl(content))

print "Access Token:"
print "    - oauth_token        = %s" % access_token['oauth_token']
print "    - oauth_token_secret = %s" % access_token['oauth_token_secret']
print

现在您有了访问令牌,您可以使用它调用受保护的方法。

编辑: 原来 tumblr 不支持 PIN 授权方法。相关帖子here。

【讨论】:

我之前试过这个代码。它的问题是 oauth_callback。如果我没有指定任何内容,api 会返回错误“未指定 oauth_callback”,但如果我指定了一些 url,例如 example.com/oauthcb 并点击链接 tumblr.com/oauth/authorize?oauth_token=9ygTF...,然后按允许按钮,tumblr 不会显示任何PIN码页面,它立即重定向到那个回调url,因为它是桌面应用程序,所以没用。 啊,我明白了。看起来像they don't support PIN method 使用在回调 url 中的回调中找到的 oauth_verifier,而不是在浏览器(如 Twitter)中接收 pin。感谢@deepvanbinnen,其答案如下。 @jterrace 我是对的,这个脚本对客户端应用程序有好处吗? (例如objective-c) @jterrace 什么是 oauth_verifier?【参考方案2】:

如果你只是想获得一个访问令牌/秘密来签名,你可以将你的回调 URL 设置为:http://localhost/blah

启动 CLI 应用程序(在修改回调 URL、密码和令牌后) 点击浏览器中的链接 允许应用 允许您的应用后,在浏览器中查看您被重定向到的页面的地址栏。它应该类似于:

http://localhost/blah?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxx0123456789ABCDEFGHIJKLMN&oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

使用查询参数“oauth_verifier”的值作为您的 PIN: XXXXXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

CLI 应该打印出您的 oauth-token 和 oauth-token-secret。

HTH!以这种方式为 tumblr 工作:)

【讨论】:

【参考方案3】:

看看https://github.com/ToQoz/Pyblr

它使用 oauth2 和 urllib 为您正在尝试做的事情提供一个很好的包装器。

【讨论】:

这个库需要 access_token,但是如果没有 ACCESS_KEY 和 ACCESS_SECRET,我就无法创建它。【参考方案4】:

看来您正在尝试使用 OAuth 2 客户端访问 OAuth 1 API。

请参阅 https://github.com/simplegeo/python-oauth2 并查找“三足 OAuth 示例”。

【讨论】:

你错了。 Twitter 也使用 Oauth 1.0,python-oauth2 与它完美配合。 @clumpter 确实我看错了你的问题,我已经修正了这个建议。【参考方案5】:

在 oauth2 和 facebook 上遇到了这个问题。 @deepvanbinnen 的回答引导我走向正确的方向。

facebook实际上重定向到一个类似的页面

'http://localhost/blah?code=AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_'

然后使用 ' AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#_=_ 作为 PIN,实际上让我可以访问所请求的 Facebook 帐户。

【讨论】:

【参考方案6】:

@jterrance 的回答很好。但是,请意识到获取访问令牌是一个一个 _time_ 手动过程。访问令牌是您用于所有后续 API 调用的密钥。 (这就是他建议将访问令牌保存在数据库中的原因。)称为“PIN”的字符串(也称为验证密钥)不一定是数字。它可以是任何形式的可打印字符串。该验证密钥显示在授权页面上步骤 2 中打印的 URL 上,然后粘贴到“PIN”提示中。

【讨论】:

以上是关于使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端的主要内容,如果未能解决你的问题,请参考以下文章

Python - Oauth2 的 SSL 问题

在 MAC 控制台上使用 Python 2.7.15,virtualenv 使用不同版本的 Python 创建环境

如何在python 2.7中使用“e”(欧拉数)和幂运算

如何在 Python 3.x 和 Python 2.x 中使用 pip

如何在 Python 3 中使用来自 Python 2 的 .so 模块?

安装Anaconda3 后,怎样使用 Python 2.7