Django开发中整合新浪微博API
原文链接:http://qinxuye.me/article/sina-weibo-api-in-developing-diango/
Update:如果想了解更多第三方帐号登录,请看这篇文章。
随着新浪微博用户日益增加,我们有时候会考虑在自己的网站中整合新浪微博。比如说我现在的独立博客。
在我的博客中做到整合主要就这几方面:我写一篇文章,就会同步发送至微博。同时呢,用户可以用微博帐号登录,并且可以选择把对文章的评论,同步评论到文章的微博。另外,用户可以选择是否把博客留言同步至新浪微博。
新浪微博开放平台地址在这里。文档地址在这里。
首先要涉及的问题,就是用户用新浪微博帐号登录的问题,即授权机制。基本方法有两种:
- OAuth
- Basic auth(需要强调的是,微博开放平台将于6月1日正式停止Basic Auth的支持。因此,此种方法不作讨论了,其实需要用户名和密码的方式本身就不安全。)
OAuth新浪官方的文档在这里。想要了解OAuth技术说明的可以访问官方网站。
其实,OAuth的流程还是很简单的。大致如下:
- 向API调用获得request token。
- 将用户重定向到授权页(auth url)。
- 用户输入用户名和密码完成授权。重定向到Callback_url。
- 用request token向新浪微博换取access token。
- 完成。
大致了解了OAuth的原理以后,由于我们是整合至Django,自然需要下载微博SDK的Python版。
不过,在全部开始前,你得先向新浪微博申请你的应用。申请地址在这里。这里要强调的是,日后应用需要申请审核,因为只有审核通过后,在来源中才能显示个性的应用名。所以,在申请的时候,注意应用介绍信息的完整,以及应用分类的填写正确。(在本例中,我们的分类是合作网站。)
申请完成以后将会得到你的应用的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'),
)
接着,我们开始views文件。代码:
#!/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 = '' # 设置你申请的appkey
consumer_secret = '' # 设置你申请的appkey对于的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,这英文水平,吐槽不能)中的例子基本上拿来改改就可以直接使用了。拿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。
不过呢,这么做是不是有点太nerd了。其实我们只要知道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 = '搞定收工~' )
|
这个时候,我们可以重构一下代码,写一个weibo类,来实现以上的功能,并且实现一些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》,以及《新浪微博API开发简介之Python篇》
Django开发中整合新浪微博API相关推荐
- Django 开发中的最佳实践之一
为什么80%的码农都做不了架构师?>>> Django 开发中的最佳实践之一 本文关注 Django 开发中调试的部分. 出自 Flask 项目旗下的 Werkzeug deb ...
- django 开发中数据库可以怎样优化
django 开发中数据库可以怎样优化 (1)设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能: (2)使用缓存,减少对数据库的访问: (3)在 orm 框架下设置表时,能用 varchar ...
- Django开发中问题和报错集合
记录django项目开发过程中的遇到的问题,导致原因和已经奏效的解决方法 常见报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbc in ...
- 看EyeEm如何在产品开发中整合、运用深度学习模型
原文:One Model At A Time: Integrating And Running Deep Learning Models In Production At EyeEm 作者:Miche ...
- 直播系统开发中如何优化API接口的并发
概述 在直播系统中,API接口并发的优化是非常重要的,因为它可以提高系统的稳定性和性能.本文将介绍一些优化API接口并发的方法. 理解API接口并发 在直播系统中,API接口是用于处理客户端请求的关键 ...
- Django开发中经常出现的问题
一. RuntimeError: Model class apps.users.models.UserProfile doesn't declare an explicit app_label and ...
- 关于在Android音视频开发中,Google API的MediaCodeC与成熟开源编码器X264的应用对比及使用场景
在2019年的一个大项目中,有一个功能模块让笔者感触颇深,那就是实时音视频的预览,当然这不是普通的开开直播,画面出来了就完了那么简单,如果你是一个开发者,那么你肯定知道同样大小的一张图片里,色彩丰富的 ...
- Django开发中常用的命令总结
1. 创建一个Django Project#使用下面的命令可以创建一个projectdjango-admin.py startproject mysite #创建好之后可以看到如下的pro... 1. ...
- JAVA EE 开发中 常用的API包
2019独角兽企业重金招聘Python工程师标准>>> API 常见的几个类:lang/util/io/math/net awt -------- 用于创建用户界面和绘制图形的所有类 ...
最新文章
- 索引块与数据块的区别
- js 获得明天0点时间戳_Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战...
- capture 原理图添加pcb封装_Altium Designer18制作两层PCB入门
- git使用记录_备忘
- 计算机大作业visio选题,大作业一 用Visio绘网络结构图
- asp oracle 分页显示,asp + oracle 分页方法(不用存储过程)
- idea查找类 方法在哪里被使用
- C语言基础—进制转换
- 由于简繁汉字一对多而导致经常写错的繁体字
- 深度学习基础笔记——卷积神经网络概念及其计算方式
- 由WMT机器翻译双向夺冠看搜狗语音交互布局
- 硬盘变成Raw格式 与 移动硬盘报I/O错误问题
- TK1刷机以及简单配置
- 笔记本计算机在桌面显示器,解决办法:笔记本电脑如何关闭屏幕,但仍可以使用?...
- 我的北漂在路上--------时不时的停下脚步思考
- 程序员必备的思维能力:抽象思维
- AI视频生成工具 抖音短视频剪辑软件
- 数据可能只有在你眼里才一文不值
- 使用kubecm管理k8s多集群环境
- 10-3-查看文章详情
热门文章
- 对Linux既拉又打 微软与开源的“爱恨情仇”
- 外贸网站 云服务器,外贸网站买哪个云服务器好
- ios运行html游戏,Html游戏 - IOS的​​Safari浏览器崩溃
- 什么是PA,与LNA的区别是什么
- FreeCodeCamp和JavaScript纹身
- element ui的table表格因竖向滚动条导致表头错位问题解决
- 一个鸡蛋让面馆老板生意涨了几倍?生平第一次把顾客当“傻子”
- 零中频接收机频率转换图_高功率雷达发射机与数字接收机
- 链接脚本使用AT加载地址的总结
- [论文素材]Background----NLP