在Python中使用Python-oauth2初始化Tumblr API的Oauth客户端
我刚接触Oauth。在之前为Twitter应用写Python代码时,我使用了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,还有这些网址:
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”,但是如果我指定一个网址,比如“http://example.com/oauthcb/”,然后点击这个链接 http://www.tumblr.com/oauth/authorize?oauth_token=9ygTF...,再按允许按钮,Tumblr并不会显示任何PIN码页面,而是直接重定向到那个回调网址,这对桌面应用来说没什么用。为什么不显示PIN码呢?
更新 2
Tumblr的API不支持PIN码授权。可以改用xAuth - https://groups.google.com/group/tumblr-api/browse_thread/thread/857285e6a2b4268/15060607dc306c1d?lnk=gst&q=pin#15060607dc306c1d
6 个回答
可以看看这个链接:https://github.com/ToQoz/Pyblr
这个项目使用了oauth2和urllib,给你想做的事情提供了一个很好的封装。
如果你只是想获取一个用来签名的访问令牌和密钥,你可以把你的回调网址设置为:http://localhost/blah
- 启动命令行应用(当然要先修改回调网址、密钥和令牌)
- 在浏览器中打开链接
- 允许这个应用
- 在你被重定向到的页面中查看地址栏,应该会看到类似这样的内容:
把查询参数中的 'oauth_verifier' 的值当作你的 PIN: XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn
命令行应该会打印出你的 oauth-token 和 oauth-token-secret。
希望这对你有帮助!我就是这样让 tumblr 工作的 :)
首先,导入 oauth2模块,并设置服务的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)
第一步:获取请求令牌。 这是一个临时令牌,用来让用户授权一个访问令牌,并且用来签名请求以获取这个访问令牌。
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']
第二步:重定向到提供者。 由于这是一个命令行脚本,我们不进行重定向。在网页应用中,你会把用户重定向到下面的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? ')
第三步: 一旦消费者把用户重定向回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授权方法。相关帖子 在这里。