Web网站中集成并调用新浪微博API的第一步

优采云 发布时间: 2021-06-24 02:00

  Web网站中集成并调用新浪微博API的第一步

  在使用新浪微博API:创建SDK一文中,我们准备了用于编写Web应用程序的SDK,并且可以在命令行上成功测试。现在,我们可以在Web网站中集成和调用新浪微博的API。

  微博登录

  使用新浪微博API的第一步是允许用户通过微博登录。在您的网站上放置一个“用微博账号登录”链接,指向网站的URL,例如/signin。代码如下:

  /static/i/signin.png

  效果如图:

  

  在URL映射处理函数签名中,创建一个APIClient实例,然后调用get_authorize_url()方法获取新浪微博认证的URL,并将用户重定向到该URL。代码如下:

  def _create_client():

_APP_ID = '12345'

_APP_SECRET = 'abc123xyz'

_REDIRECT_URI = 'http://example.com/callback'

return APIClient(_APP_ID, _APP_SECRET, _REDIRECT_URI)

@get('/signin')

def signin():

client = _create_client()

# 重定向到新浪微博登陆页:

raise seeother(client.get_authorize_url())

  用户在新浪微博的认证页面完成登录后,新浪微博会将用户重定向到我们指定的redirect_uri,并附加参数代码。处理redirect_uri的函数会提取参数代码,然后获取登录用户的访问令牌。代码如下:

  @get('/callback')

def callback():

client = _create_client()

r = client.request_access_token(ctx.request['code'])

access_token, expires_in, uid = r.access_token, r.expires_in, r.uid

  在获取access token的同时,新浪微博也会返回access token的过期时间和用户ID。 SDK 将过期时间转换为 UNIX 时间戳并返回。

  获得的访问令牌然后可以使用登录用户的身份调用 API 以获取更多用户详细信息。代码如下:

  @get('/callback')

def callback():

...

client.set_access_token(access_token, expires_in)

user = client.users.show.get(uid=uid)

logging.info(json.dump(user)) # { "uid": 1234, "screen_name": "Michael", … }

  接下来网站会判断该用户是否是第一次访问,如果是,则在数据库中创建一条记录,如果该用户已经存在,则更新该用户的相关信息。由于uid是用户在新浪微博上的唯一ID号,因此可以作为主键来存储用户信息。同时,访问令牌和过期时间一起存储在数据库中。代码如下:

  @get('/callback')

def callback():

...

if (_is_user_exist(uid)):

_update_user(user, access_token, expires_in)

else:

_create_user(user, access_token, expires_in)

  最后一步是在您的网站上使用会话或cookie来识别用户已登录,然后该用户可以以登录名访问您的网站。

  调用 API

  获得用户授权后,即可调用API。比如列出用户关注的微博列表,代码如下:

  @get('/list')

def list_weibo():

user = _user_from_session()

client = _create_client()

client.set_access_token(user.auth_token, user.expired_time)

r = client.statuses.home_timeline.get()

return Template('list.html', statuses = r.statuses)

  在HTML模板中,可以将JSON格式的状态列表转成HTML,代码如下:

  L = []

for st in statuses:

L.append('''

%s

%s

%s

''' % (st.user.profile_image_url, st.user.screen_name, st.text)

print ''.join(L)

  CSS处理后的最终HTML效果如图:

  

  但是仔细观察,我们输出的微博和新浪微博官网是不一样的。官网会把@和http开头的文字和#topic#改成超链接。怎么处理@某某某,#主题#和链接?下面是一个JavaScript正则匹配方案,代码如下:

  var g_all = /(\@[^\s\&\:\)\uff09\uff1a\@]+)|(\#[^\#]+\#)|(http\:\/\/[a-zA-Z0-9\_\/\.\-]+)/g;

var g_at = /^\@[^\s\&\:\)\uff09\uff1a\@]+$/;

var g_topic = /^\#[^\#]+\#$/;

var g_link = /^http\:\/\/[a-zA-Z0-9\_\/\.\-]+$/;

function format_text(t) {

ss = t.replace('').split(g_all);

L = []

$.each(ss, function(index, s) {

if (s===undefined)

return;

if (g_at.test(s)) {

L.push('' + s + '');

}

else if (g_topic.test(s)) {

L.push('' + s + '');

}

else if (g_link.test(s)) {

L.push('' + s + '');

}

else {

L.push(s);

}

});

return L.join('');

}

  发布微博

  发布微博的API是status/update,需要通过POST调用。发布微博代码如下:

  @post('/update')

def statuses_update():

text = ctx.request['text']

user = _user_from_session()

client = _create_client()

client.set_access_token(user.auth_token, user.expired_time)

r = client.statuses.update.post(status=text)

return True

  本文演示网站:

  本文网站源代码可从GitHub下载:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线