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

clu*_*ter 7 python oauth access-token

我是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)
Run Code Online (Sandbox Code Playgroud)

这很简单,因为twitter提供了消费者和访问密钥和秘密.但现在我需要为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
Run Code Online (Sandbox Code Playgroud)

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

UPD

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

UPD 2

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

jte*_*ace 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)
Run Code Online (Sandbox Code Playgroud)

第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']
Run Code Online (Sandbox Code Playgroud)

第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? ')
Run Code Online (Sandbox Code Playgroud)

步骤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
Run Code Online (Sandbox Code Playgroud)

现在您已拥有访问令牌,您可以使用它来调用受保护的方法.

编辑:原来tumblr不支持PIN授权方法.相关帖子在这里.


小智 6

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

  • Fireup CLI-app(在修改callback-url,secret和token ofcourse之后)
  • 按照浏览器中的链接进行操作
  • 允许应用
  • 在允许您的应用后,查看您在浏览器中重定向到的页面的地址栏.它应该看起来像:

HTTP://本地主机/嗒嗒组oauth_token = xxxxxxxxxxxxxxxxxxxxxxxxxx0123456789ABCDEFGHIJKLMN&oauth_verifier = XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

使用query-parameter'oauth_verifier'的值作为您的PIN:XXXXXXXXXXXXXXXXXXXXXXXXX0123456789abcdefghijklmn

CLI应该打印出你的oauth-token和oauth-token-secret.

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