网站调用新浪微博内容(新浪微博用户日益增加,有时候会考虑在自己的网站中整合)

优采云 发布时间: 2022-03-04 09:09

  网站调用新浪微博内容(新浪微博用户日益增加,有时候会考虑在自己的网站中整合)

  随着新浪微博用户数量的增加,我们有时会考虑将新浪微博整合到我们的网站中。比如我现在的独立博客。

  我博客中的整合主要有以下几个方面:我写了一篇文章文章,会同步发到微博。同时,用户可以用自己的微博账号登录,可以选择将文章的评论同步到文章的微博。此外,用户可以选择是否将博客消息同步到新浪微博。

  新浪微博开放平台地址在这里。文档地址在这里。

  首先要涉及的问题是用户用自己的新浪微博账号登录的问题,也就是授权机制。有两种基本方法:

  OAuthBasic auth(需要强调的是,微博开放平台将于6月1日正式停止支持Basic Auth。因此,这种方法不再讨论,实际上需要用户名和密码的方法本质上是不安全的。)

  OAuth新浪官方文档在这里。如果想了解OAuth技术说明,可以访问官方网站。

  其实OAuth的过程还是很简单的。大致如下:

  调用 API 获取请求令牌。将用户重定向到授权页面(auth url)。用户输入用户名和密码完成授权。重定向到 Callback_url。向新浪微博交换请求令牌以获得访问令牌。结束。

  大致了解了OAuth的原理后,既然我们是集成到Django中的,自然需要下载。

  不过,在这一切开始之前,您必须向新浪微博申请您的应用程序。申请地址在这里。这里需要强调的是,应用以后需要申请审核,因为只有审核通过后,才能在源中显示个性化的应用名称。因此,在申请时,要注意申请介绍信息的完整性和正确的申请分类。(在这个例子中,我们的分类是 Collaboration网站。)

  申请完成后,您将获得您的应用程序的 App Key 和 App Secret。

  回到授权用户登录的主题。要允许新浪微博帐号访问,首先我们需要在 urlpatterns 中添加几个 URL。如下:

  urlpatterns = patterns('projectname.appname.views',

url(r'^log/$', 'login', name='log'),

url(r'^logincheck/$', 'login_check', name='logcheck'),

url(r'^logout/$', 'logout', name='logout'),

)

  接下来,我们启动视图文件。代码:

  #!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

基于django的新浪微博oauth views

需要django的session支持

"""

from django.http import HttpResponseRedirect

from weibopy.auth import OAuthHandler, WeibopError

from weibopy import oauth

consumer_key = '' # 设置你申请的a*敏*感*词*ey

consumer_secret = '' # 设置你申请的a*敏*感*词*ey对于的secret

class WebOAuthHandler(OAuthHandler):

def get_authorization_url_with_callback(self, callback, signin_with_twitter=False):

"""Get the authorization URL to redirect the user"""

try:

# get the request token

self.request_token = self._get_request_token()

# build auth request and return as url

if signin_with_twitter:

url = self._get_oauth_url('authenticate')

else:

url = self._get_oauth_url('authorize')

request = oauth.OAuthRequest.from_token_and_callback(

token=self.request_token, callback=callback, http_url=url

)

return request.to_url()

except Exception, e:

raise WeibopError(e)

def _get_referer_url(request):

referer_url = request.META.get('HTTP_REFERER', '/')

host = request.META['HTTP_HOST']

if referer_url.startswith('http') and host not in referer_url:

referer_url = '/' # 避免外站直接跳到登录页而发生跳转错误

return referer_url

def _oauth():

"""获取oauth认证类"""

return WebOAuthHandler(consumer_key, consumer_secret)

def login(request):

# 保存最初的登录url,以便认证成功后跳转回来

back_to_url = _get_referer_url(request)

request.session['login_back_to_url'] = back_to_url

# 获取oauth认证url

login_backurl = request.build_absolute_uri('/logincheck')

auth_client = _oauth()

auth_url = auth_client.get_authorization_url_with_callback(login_backurl)

# 保存request_token,用户登录后需要使用它来获取access_token

request.session['oauth_request_token'] = auth_client.request_token

# 跳转到登录页面

return HttpResponseRedirect(auth_url)

def login_check(request):

"""用户成功登录授权后,会回调此方法,获取access_token,完成授权"""

# http://mk2.com/?oauth_token=c30fa6d693ae9c23dd0982dae6a1c5f9&oauth_verifier=603896

verifier = request.GET.get('oauth_verifier', None)

auth_client = _oauth()

# 设置之前保存在session的request_token

request_token = request.session['oauth_request_token']

del request.session['oauth_request_token']

auth_client.set_request_token(request_token.key, request_token.secret)

access_token = auth_client.get_access_token(verifier)

# 保存access_token,以后访问只需使用access_token即可

request.session['oauth_access_token'] = access_token

# 跳转回最初登录前的页面

back_to_url = request.session.get('login_back_to_url', '/')

return HttpResponseRedirect(back_to_url)

def logout(request):

"""用户登出,直接删除access_token"""

del request.session['oauth_access_token']

back_to_url = _get_referer_url(request)

return HttpResponseRedirect(back_to_url)

  完成授权码之后,我们就需要知道怎么给新浪微博发消息了。其实下载的SDK下的exanples文件夹下的examples(是的,其实就是examples,这个英文水平不能抱怨),修改后直接使用即可。以 oauthSetTokenUpdate.py 为例,我们可以这样写:

  # -*- coding: utf-8 -*-

from weibopy.auth import OAuthHandler

from weibopy.api import API

consumer_key= '应用的key'

consumer_secret ='应用的App Secret'

auth = OAuthHandler(consumer_key, consumer_secret)

auth_url = auth.get_authorization_url()

print 'Please authorize: ' + auth_url

verifier = raw_input('PIN: ').strip()

auth.get_access_token(verifier)

api = API(auth)

status = api.update_status(status='hello world', lat='12.3', long='45.6') # 注意status必须是UTF-8编码的字符串,经纬度是可以不写的

print status.id

print status.text

  运行这个程序会提示一个 URL 链接,在浏览器中打开链接,并授予访问权限,你会得到一串 PIN 码。输入此 PIN 并发送推送,并且还将显示用户的访问令牌密钥和访问令牌密码。

  但是,这样做是不是有点太书呆子了?其实只要知道Access token key和Access token secret,我们就可以直接使用它们来创建API对象:

  # -*- coding: utf-8 -*-

from weibopy.auth import OAuthHandler

from weibopy.api import API

consumer_key= '应用的key'

consumer_secret ='应用的App Secret'

token = '用户的Access token key'

tokenSecret = '用户的Access token secret'

auth = OAuthHandler(consumer_key, consumer_secret)

auth.setToken(token, tokenSecret)

api = API(auth)

status = api.update_status(status='搞定收工~')

  这时候我们可以重构代码,写一个微博类来实现以上功能,实现一些api操作。

  class weibo(object):

def __init__(self):

self.consumer_key = consumer_key

self.consumer_secret = consumer_secret

def getAtt(self, key):

try:

return self.obj.__getattribute__(key)

except Exception, e:

print e

return ''

def getAttValue(self, obj, key):

try:

return obj.__getattribute__(key)

except Exception, e:

print e

return ''

def auth(self):

self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)

auth_url = self.auth.get_authorization_url()

print 'Please authorize: ' + auth_url

verifier = raw_input('PIN: ').strip()

self.auth.get_access_token(verifier)

self.api = API(self.auth)

def setToken(self, token, tokenSecret):

self.auth = OAuthHandler(self.consumer_key, self.consumer_secret)

self.auth.setToken(token, tokenSecret)

self.api = API(self.auth)

def update(self, message):

message = message.encode("utf-8")

status = self.api.update_status(status=message)

self.obj = status

id = self.getAtt("id")

return id

def destroy_status(self, id):

status = self.api.destroy_status(id)

self.obj = status

id = self.getAtt("id")

return id

def comment(self, id, message):

comment = self.api.comment(id=id, comment=message)

self.obj = comment

mid = self.getAtt("id")

return mid

def comment_destroy (self, mid):

comment = self.api.comment_destroy(mid)

self.obj = comment

mid = self.getAtt("id")

text = self.getAtt("text")

return mid

def repost(self, id, message):

post = self.api.repost(id=id, status=message)

self.obj = post

mid = self.getAtt("id")

return mid

def get_username(self):

if getattr(self, '_username', None) is None:

self._username = self.auth.get_username()

return self._username

  不知道读者是否还记得我们上面授权部分的代码。在login_check方法代码中,有这么一句话。

  request.session['oauth_access_token'] = access_token

  授权用户的 access_token 已存储在 session 变量中。因此,当用户授权完成后,我们可以直接使用 session 中存储的 access_token,如下所示:

  access_token = request.session.get('oauth_access_token', None)

if access_token is not None:

weibo_client = weibo()

weibo_client.setToken(access_token.key, access_token.secret)

weibo_client.update('全部完成~')

  上面的例子中只用到了一些 API,完整的 API 手册可以在这里找到。

  最后,本文参考了两篇文章文章:《django接入新浪微博OAuth》、《Python for新浪微博API开发介绍》

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线