【Python】用新浪api发微博

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值