新浪微博开放平台现在有两种授权机制:OAuth2.0和Basic Auth(仅用于开发者调试接口)。
在这里采用了Python SDK的OAuth1.0,原因就是OAuth1.0忽略CallBack_url也能通过认证。
代码(SinaBlogDemo.py):
#!/usr/bin/env python
# -*- coding: utf8 -*-
# generated by wxGlade 0.6.5 on Thu Jul 05 00:17:55 2012
import wx, urllib, urllib2, re
from weibo1 import APIClient, OAuthToken
# begin wxGlade: extracode
# end wxGlade
#显示消息对话框
def ShowMessageBox(msg):
dlg = wx.MessageDialog(None, msg,
'Message Box',
wx.OK | wx.ICON_INFORMATION
)
dlg.ShowModal()
#通过提供的账号和密码,返回APIClient对象实例
def GetBlogClient(uname, passw):
APP_KEY = u'783190658' # app key
APP_SECRET = u'7f63ae9eb3c1438e9f8932748ca8a341' # app secret
#实例化APIClient
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET)
#获取OAuth request token
reqToken = client.get_request_token()
#用户授权url
auth_url = client.get_authorize_url(reqToken)
post_data = urllib.urlencode({
"action": "submit",
"forcelogin": "",
"from": "",
"oauth_callback" : "http://api.weibo.com/oauth2/default.html",
"oauth_token" : reqToken.oauth_token,
"passwd" : passw,
"regCallback": "",
"ssoDoor": "",
"userId" : uname,
"vdCheckflag" : 1,
"vsnval":""
})
mat = re.search(
r'&oauth_verifier=(.+)',
urllib2.urlopen(urllib2.Request(
"http://api.t.sina.com.cn/oauth/authorize",
post_data,
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1)',
'Referer': auth_url
}
)).url
)
if mat:
client = APIClient(
APP_KEY,
APP_SECRET,
OAuthToken(
reqToken.oauth_token,
reqToken.oauth_token_secret,
mat.group(1)
))
#返回APIClient
return APIClient(APP_KEY, APP_SECRET, client.get_access_token())
else:
raise Exception()
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.label_1 = wx.StaticText(self, -1, u"账号:")
self.text_ctrl_uname = wx.TextCtrl(self, -1, u"")
self.label_2 = wx.StaticText(self, -1, u"密码:")
self.text_ctrl_passw = wx.TextCtrl(self, -1, u"", style=wx.TE_PASSWORD)
self.button_1 = wx.Button(self, -1, u"发送微博")
self.text_ctrl_msg = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE | wx.HSCROLL | wx.TE_RICH2)
self.__set_properties()
self.__do_layout()
self.Bind(wx.EVT_BUTTON, self.OnSend, self.button_1)
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame_1")
self.text_ctrl_msg.SetMinSize((374, 168))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.VERTICAL)
sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0)
sizer_3.Add(self.text_ctrl_uname, 0, 0, 0)
sizer_5.Add(sizer_3, 0, wx.ALL | wx.EXPAND, 3)
sizer_4.Add(self.label_2, 0, wx.ALIGN_CENTER_VERTICAL, 0)
sizer_4.Add(self.text_ctrl_passw, 0, 0, 0)
sizer_5.Add(sizer_4, 0, wx.ALL | wx.EXPAND, 3)
sizer_5.Add(self.button_1, 0, 0, 0)
sizer_2.Add(sizer_5, 0, wx.EXPAND, 0)
sizer_2.Add(self.text_ctrl_msg, 1, wx.EXPAND, 0)
sizer_1.Add(sizer_2, 1, wx.ALL | wx.EXPAND, 8)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
# end wxGlade
def OnSend(self, event): # wxGlade: MyFrame.<event_handler>
try:
blog = GetBlogClient(
self.text_ctrl_uname.GetValue(),
self.text_ctrl_passw.GetValue()
)
blog.post.statuses__update(status=self.text_ctrl_msg.GetValue())
ShowMessageBox(u'发送成功!')
except Exception, e:
ShowMessageBox(u'发送失败!')
event.Skip()
# end of class MyFrame
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
说明:
1.程序的界面部分的代码是由wxGlade图形化编辑后自动生成的。
2.程序中添加了一个函数GetBlogClient,参数分别为要登录微博的账号和密码,返回一个SDK中的APIClient实例
附:
1.新浪微博Python SDK下载地址: (点击打开链接)
2.新浪微博Python SDK使用说明文档(点击打开链接)
3.新浪微博API文档(点击打开链接)
4.新浪APPKEY集合(点击打开链接)
5.程序及源码包(点击打开链接)