【Python】用新浪api发微博

来源:互联网 发布:oracle查询当天数据 编辑:程序博客网 时间:2024/05/23 02:07

新浪微博开放平台现在有两种授权机制: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 2012import wx, urllib, urllib2, refrom 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 MyFrameif __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.程序及源码包(点击打开链接)

原创粉丝点击