在Python中使用Python-oauth2初始化Tumblr API的Oauth客户端

7 投票
6 回答
7027 浏览
提问于 2025-04-17 03:11

我刚接触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 个回答

0

可以看看这个链接:https://github.com/ToQoz/Pyblr

这个项目使用了oauth2和urllib,给你想做的事情提供了一个很好的封装。

6

如果你只是想获取一个用来签名的访问令牌和密钥,你可以把你的回调网址设置为:http://localhost/blah

  • 启动命令行应用(当然要先修改回调网址、密钥和令牌)
  • 在浏览器中打开链接
  • 允许这个应用
  • 在你被重定向到的页面中查看地址栏,应该会看到类似这样的内容:

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

把查询参数中的 'oauth_verifier' 的值当作你的 PIN: XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

命令行应该会打印出你的 oauth-token 和 oauth-token-secret。

希望这对你有帮助!我就是这样让 tumblr 工作的 :)

11

首先,导入 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授权方法。相关帖子 在这里

撰写回答