Python3下用Tornado调用新浪微博API.0认证的顺序
优采云 发布时间: 2021-05-21 21:17
Python3下用Tornado调用新浪微博API.0认证的顺序
使用Tornado试用新浪微博开放平台API
Tornado作为Python异步无阻塞服务器和轻量级Web框架,非常吸引人。为了体验OAuth 2. 0身份验证,我使用了Tornado构建了网站并调用了新浪微博API。新浪微博的OAuth 2. 0身份验证序列如下:
以下内容简要说明了如何在Python 3下使用Tornado完成上述四个步骤。
将用户带到新浪认证页面
假设我们要开发的客户端的域名是,在Sina中创建一个新应用程序,然后在设置中填写此安全域名,以便我们可以跨站点请求XMLRequests。
此步骤是编写html页面,在Tornado中则是编写模板。假设我们在客户端上放置了一个名为“使用新浪微博登录”的按钮,代码如下:
Login
通过这种方式,您只需单击此按钮即可转到新浪的身份验证页面。用户通过身份验证后,新浪会将用户转到您提供的redirect_uri地址,这里是
因此,我们需要使用Tornado来处理身份验证服务器发送给我们的代码。
龙卷风在后台使用代码交换access_token
这部分有两个步骤:
配置Tornado的路由表,然后让r'/ auth_code'路由到AuthCodeHandler处理程序。然后,我们可以重写此处理程序的get方法以获取代码。然后我们使用POST方法将代码发送到Sina,这是它可以反映Tornado的异步和非阻塞功能的强大之处。龙卷风的AsyncHTTPClient可以发起异步请求。 @ gen.coroutine装饰器可用于编写异步(如同步)。代码如下:
from urllib.parse import urlencode
import json
import tornado.web
from tornado import gen
from tornado.httpclient import AsyncHTTPClient
from handlers.token import TokenBaseHandler
class AuthCodeHandler(TokenBaseHandler):
"""
已经获得用户授权, 向API服务器获取Token
"""
@gen.coroutine
def get(self):
auth_code = self.get_argument("code", "No code")
post_data = {
"client_id": "你的App Key",
"client_secret": "你的App Secret",
"grant_type": "authorization_code",
"code": auth_code,
"redirect_uri": "http://dropthej.com"
}
http_client = AsyncHTTPClient()
response = "init"
body = urlencode(post_data)
try:
response = yield http_client.fetch(
"https://api.weibo.com/oauth2/access_token",
method="POST",
body=body
)
except Exception as e:
self.write(str(e))
return;
token_json = json.loads(str(response.body, encoding='utf-8'))
# set token_json
self.application.token_json = token_json
self.write("
" + str(token_json['access_token']))
url = "http://dropthej.com/?tk=" + token_json['access_token']
self.redirect(url)
由于我们仅使用它来与他的API一起使用,因此我们不会在cookie中编写access_token,而是使用一种简单的方法将其放入URL中。这样,应用程序的每个页面都会被带入。tk参数可以保留用户的登录状态。在这里,我们返回到此页面,因此我们在html中收到此tk并使用它来调用Sina API。
为什么发送GET和POST请求?应该使用龙卷风在后台发送此消息吗?前端的javascript无法完成吗?由于应将“应用程序秘密”发送到此处,因此称为“秘密”,您仍然可以将其发送到前端。遍历用户计算机是非常不安全的。 Secret旨在验证这是真实客户端发送的请求,因此必须在后台发送,并且必须由客户端而不是用户完成。
使用jQuery调用Sina API以获取用户的最新主页微博
这不是重点。我不会再说了。效果非常好,也很高兴。主要代码如下:
var xyz;
$(function() {
$.ajax({
url: "https://api.weibo.com/2/statuses/home_timeline.json",
type: "GET",
dataType: "jsonp",
data: {
"access_token": ac_tk
},
success: function(result) {
xyz = result.data.statuses;
for (x in xyz) {
$("#tbody").append("" + xyz[x].user.name + "" + xyz[x].text + "");
}
}
});
});
效果如图所示:
链接到本文