开源软件供应链点亮计划,等你来!(图)
优采云 发布时间: 2021-07-07 07:02开源软件供应链点亮计划,等你来!(图)
开源软件供应链照明计划等你来! >>>
随着新浪微博用户越来越多,我们有时会考虑在网站中整合新浪微博。例如,我目前的独立博客。
我博客的整合主要是这几个方面:我写了一个文章,同时发到微博上。同时,用户可以用自己的微博账号登录,可以选择将文章的评论同步到文章的微博。此外,用户可以选择是否将博客消息同步到新浪微博。
新浪微博开放平台地址在这里。文档地址在这里。
首先涉及的问题是用户使用新浪微博账号登录的问题,即授权机制。有两种基本方法:
OAuth Basic auth(需要强调的是,微博开放平台将于6月1日正式停止支持Basic Auth,因此不讨论该方法。其实要求用户名和密码的方法本质上是不安全。)
OAuth 新浪官方文档在这里。想了解OAuth技术说明的可以访问官方网站。
其实OAuth的流程还是很简单的。大致如下:
从 API 调用中获取请求令牌。将用户重定向到授权页面(auth url)。用户输入用户名和密码完成授权。重定向到 Callback_url。将请求令牌交换到新浪微博以获取访问令牌。执行。
了解了OAuth的原理后,既然是集成到Django中,自然需要下载Python版的微博SDK。
但是,在一切开始之前,您必须从新浪微博申请。申请地址在这里。这里需要强调的是,以后的应用需要申请审核,因为只有审核通过后,才能在源中显示个性化的应用名称。因此,在申请时,要注意申请介绍信息的完整性和正确的申请分类。 (在这个例子中,我们的分类是合作网站。)
申请完成后,您将获得您申请的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 手册请参阅此处。
文章来源: