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



我是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码?

乌利希期刊指南2

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

首先,导入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)

步骤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_callbackURL,您可以请求用户已批准的访问令牌。你使用请求令牌签名此请求。这一切完成后,你扔掉请求令牌并使用返回的访问令牌。你应该把它存起来访问令牌在安全的地方,如数据库,供将来使用。

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

现在你有了一个访问令牌,你可以用它来调用受保护的方法。

EDIT:原来tumblr不支持PIN授权方法。

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

  • 启动cli应用程序(在修改回调url,秘密和令牌之后)
  • 点击浏览器中的链接
  • 允许应用
  • 查看允许应用程序后在浏览器中重定向到的页面的地址栏。它应该看起来像:

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

使用查询参数'oauth_verifier'的值作为您的PIN:XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

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

HTH !我是这样为tumblr工作的:)

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

它使用oauth2和urllib为您想要做的事情提供一个很好的包装。

看起来你想做的是用OAuth 2客户端访问OAuth 1 API。

查看https://github.com/simplegeo/python-oauth2,查找" three-legged OAuth example "

在oauth2和facebook上有这个问题。@deepvanbinnen的回答指引我走向正确的方向。

facebook实际上重定向到与此类似的页面

的http://localhost/blah?代码= AQAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # _ = _ '

然后使用"aqaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #_=_"作为PIN实际上让我访问了所请求的facebook帐户。

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

最新更新