読者です 読者をやめる 読者になる 読者になる

自分の過去ツイートを取得してみたら数が合わなかったがツイ消しのせいだった。

タイトルのとおり。
3200件のツイートを取得出来るはずが、数件取得できなかった。
ツイ消しした分が取得できないのかなーと思い、ツイ消ししてから取得するとツイ消しした分だけ所得件数が減ったのでそうだと思われる。

ツイ消ししても、ツイートがあったことは認識したままで、ツイ消しの分を3200の中に数えてしまうからこういう結果になるんだろう。

f:id:TAKEmaru:20131009115504p:plain

ツイートを取得するにあたり、なんとなくwxPythonを使ったGUIプログラムを書いたのでそのコード。

# coding: UTF-8

import wx
import tweepy
import sqlite3

consumer_key = "************"
consumer_secret = "************"
accessfile = 'twitter.dat'
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)


class MainFrame(wx.Frame):
    api = None
    lastid = None
    
    def __init__(self, *args, **kwds):
        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.TextCtrl(self, -1, style = wx.TE_MULTILINE | wx.TE_READONLY)

        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()

    def __set_properties(self):
        self.SetTitle("extract_tweet")
        self.list_box_timeline.SetMinSize((250, 200))

    def __do_layout(self):
        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()

    def onClickRefresh(self, event):
        conn = sqlite3.connect("./tweetsql") #接続
        cur = conn.cursor() #カーソルの作成
        cur.execute("""CREATE TABLE IF NOT EXISTS mystatus(statusid long, 
        postdate text, text text, replyto text, replyto_id logn, reply_status_id, 
        primary key (statusid) ON CONFLICT IGNORE)""") #テーブルが存在しない場合はテーブルを作成

        cur.execute("SELECT max(statusid) from mystatus") #最大のstatusidを抽出
        maxsaved = cur.fetchone()[0]
        if not maxsaved:
            maxsaved = 1

        count = cur.execute("SELECT statusid FROM mystatus")
        self.list_box_timeline.WriteText(u"before: "+str(len(count.fetchall()))+u"tweets\n") #リストにtweet数を追加する。

        print "max saved id = " + str(maxsaved)

        maxcount = -1
        for p in tweepy.Cursor(self.api.user_timeline, since_id=maxsaved).items(maxcount): #新しいtweetを追加
            cur.execute("""INSERT INTO mystatus(statusid, postdate, text, replyto, replyto_id,reply_status_id)
                                         VALUES(?,?,?,?,?,?)""",(p.id ,p.created_at, p.text, p.in_reply_to_screen_name, p.in_reply_to_user_id, p.in_reply_to_status_id))
            print p
        conn.commit() #変更を保存
        count = cur.execute("SELECT statusid FROM mystatus")
        self.list_box_timeline.WriteText(u"after:   "+str(len(count.fetchall()))+u"tweets\n") #リストにtweet数を追加する。
        conn.close() #切断

        event.Skip()

    def onClickAuth(self, event):
        ''' AccessTokenとAccessToken Secretを取得しシリアライズ '''
        import webbrowser
        import pickle
        
        # get_authorization_urlが時間がかかるのでInfo
        ret = wx.MessageBox(u'認証結果が返って来るまで時間がかかるかもしれません。\n実行しますか?',
                            u'認証', 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, u'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):
            file = open(accessfile)
            access_token = pickle.load(file)
            auth.set_access_token(access_token[0], access_token[1])
            self.api = tweepy.API(auth_handler=auth, api_root = "/1.1")

if __name__ == "__main__":
    app = wx.App(False)
    wx.InitAllImageHandlers()
    frame = MainFrame(None, wx.ID_ANY, "")
    app.SetTopWindow(frame)
    frame_wxTweepy.Show()
    app.MainLoop()


・参考
http://www.kabipan.com/computer/twitterwxPythonでTwitterクライアントを作ってみた。 - その時々