使用 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 客户端的主要内容,如果未能解决你的问题,请参考以下文章
在 MAC 控制台上使用 Python 2.7.15,virtualenv 使用不同版本的 Python 创建环境
如何在 Python 3.x 和 Python 2.x 中使用 pip