その時々

その時々で違うんです。特に決まっていないんです。

wxPythonでTwitterクライアントを作ってみた。

今回は、wxPythonを使ってTwitterクライアントを作ってみた。
GUI部分はwxGladeを利用して作成し、イベント部分はeclipse + pyDevで作成してみた。

wxGladeを使うと、GUI部分が簡単にコーディング出きるし、
途中でGUI部分を変えたくなっても、
他に手動やeclipseから記述したソースが上書きされずに反映出来るので、すごく便利。

さっそくソースを。

wxTweepy2

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.3 on Fri Jan 13 22:50:35 2012

import wx
import tweepy

consumer_key = '登録したときに発行されるやつ'
consumer_secret = '登録したときに発行されるやつ'
accessfile = 'wxTweepy2.dat'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)

# begin wxGlade: extracode
# end wxGlade

class wxTweepy2(wx.Frame):
    gapi = None
    lastid = None
    
    def __init__(self, *args, **kwds):
        # begin wxGlade: wxTweepy2.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.button_refresh = wx.Button(self, -1, u"更新")
        self.button_auth = wx.Button(self, -1, u"認証")
        self.list_box_timeline = wx.ListBox(self, -1, choices=[], style=wx.LB_SINGLE)

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnClickRefresh, self.button_refresh)
        self.Bind(wx.EVT_BUTTON, self.OnClickAuth, self.button_auth)
        
        self.OAuth()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: wxTweepy2.__set_properties
        self.SetTitle("wxTweepy2")
        self.list_box_timeline.SetMinSize((250, 200))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: wxTweepy2.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_2.Add(self.button_refresh, 0, 0, 0)
        sizer_2.Add(self.button_auth, 0, 0, 0)
        sizer_1.Add(sizer_2, 0, wx.EXPAND, 0)
        sizer_1.Add(self.list_box_timeline, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade

    def OnClickRefresh(self, event): # wxGlade: wxTweepy2.<event_handler>
        '''TimeLineを取得しリストへ追加'''
        for tl in self.gapi.home_timeline(self.lastid):
                self.list_box_timeline.Append( '[' + tl.user.name +']\t' +  tl.text + '\n',
                                               tl.id)
                self.lastid = tl.id
        event.Skip()

    def OnClickAuth(self, event): # wxGlade: wxTweepy2.<event_handler>
        ''' AccessTokenとAccessToken Secretを取得しシリアライズ '''
        import webbrowser
        import pickle
        
        # get_authorization_urlが時間がかかるのでInfo
        ret = wx.MessageBox('認証結果可返って来るまで時間がかかるかもしれません。\n実行しますか?',
                            '認証', wx.OK|wx.CANCEL|wx.ICON_QUESTION)
        if ret != wx.OK:
            event.Skip()
            return
            
        redirect_url = auth.get_authorization_url()
        webbrowser.open(redirect_url)
        box = wx.TextEntryDialog(None, 'PIN番号を入力してください。')
        if box.ShowModal() == wx.ID_OK:
            auth.get_access_token(box.GetValue())
            access_token = (auth.access_token.key, auth.access_token.secret)
            afile = open(accessfile, 'w')
            pickle.dump(access_token, afile)
            afile.close()
        event.Skip()

    def OAuth(self):
        '''OAuthによる認証'''
        import os
        import pickle
        
        if os.path.exists(accessfile):
            afile = open(accessfile)
            access_token = pickle.load(afile)
            auth.set_access_token(access_token[0], access_token[1])
            api = tweepy.API(auth_handler=auth)
            self.gapi = api
    
# end of class wxTweepy2


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_wxTweepy2 = wxTweepy2(None, -1, "")
    app.SetTopWindow(frame_wxTweepy2)
    frame_wxTweepy2.Show()
    app.MainLoop()

こんな感じのすごくシンプルなものが出来る。
実用性は、まだない、、、

参考サイト
wxPythonでpingのGUIを作ろう
tweepyでOAuth認証のためのkeyを・・・