tw2改造した

2009/03/25 10:46

※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】

そういや、今は Afficheur を使っちゃっているんだが、 yoshiori 作、 a2c 改の tw2.py をいじくったやつをはっ付けておこう。codereposにコミットする程でもないし(twitterのライブラリをa2cが変えたがってるみたいな発言を見た気もするし)、ここに貼っちゃうのさ。ん?branch?まぁいいじゃん。動きも変えちゃってるし。

そうそう、tw2.pyってなにさ?

tw2.pyはプログラマ向け、TwitterとWassr用のマルチポスト、マルチタイムライン。Wassrへの移行を楽にしてくれるぜ。ちなみに、Python製のコマンドラインツールだ。

もちろん、プログラマ向けなので新しめのOSXのTerminalで動作させることが前提だぜ。Ubuntuかもしれんが、いずれにしてもモダンなOS使ってな。旧時代のOSは知らん。OSXの人はreadlineをまともにしておくといいぜ、きっと。

まず、pitとpython-twitterをインストールしようぜ。うろ覚えだから、pitがeasy_installでインストールまでできたか忘れた。多分できるけどできなかったら、 pypi からダウンロードしてpython setup.py installな。

  $ easy_install pit
  $ easy_install python-twitter

あとは、カレントがPYTHONPATH的に見えることを前提として、tw2.pyを好きなところに置いて、そっからpython tw2.pyな。

さてえさて、いろんなところで失敗するのを、おりゃーっと全部キャッチな。基本的にオレオレ用に作ってるからな、勘違いするなよ。正式版はcodereposな。

入力受付状態で、リターンキーを叩くと、フレンドタイムラインとリプライの一覧が表示されます。2度目以降リターンキーを叩くと、新しいタイムラインと新しいリプライだけが表示されます。うまく同じ発言だと気づけば、twitterの発言とwassrの発言をまとめてるよ。これ、プログラム終了するとリセットな。

fav ユーザ名 で、Wassrにイイネします。一応、そのユーザの最新の発言に対してのイイネな。twitterのfavは面白くも何ともないからできないぜ、きっと。

で、ここから下にコード貼るぜ。Pythonだからな。油断すんなよ、インデント的な意味で

tw2.py

    #!/usr/bin/env python
    # coding:utf-8

    import sys, simplejson, urllib2, urllib, twitter as tw, readline
    from pit import Pit
    import logging

    source = '清楚なクライアント  rev.everes'

    # KeyConfig
    getFriendsTimeLineKey = ['friends', 'f']
    getRepliesKey = ['res', 'r', '']
    sendPostKey = ['post', 'p']
    exitKey = ['xx', 'ZZ', 'exit', 'bye']

    # Log file Name
    logFileName = './wtLog.log'
    logging.basicConfig(filename=logFileName, level=logging.INFO, format='%(message)s',)

    class Wassr:
      def __init__(self, user, passwd):
        self.user = user
        self.passwd = passwd
      def user_latest(self, userid):
        try:
          r = self.getOpener().open('http://api.wassr.jp/statuses/show.json', urllib.urlencode({'id':userid}))
          data = simplejson.loads(r.read())
        except:
          return []
        return data
      def fav(self, status_rid):
        api_url = 'http://api.wassr.jp/favorites/create/%s.json' % status_rid
        r = self.getOpener().open(api_url, urllib.urlencode({'rid':status_rid}))
        data = simplejson.loads(r.read())
        return data
      def post(self, text, reply_to=None):
        try:
          text = text.encode('utf-8')
        except UnicodeDecodeError,e:
          pass
        post_data = dict(status=text,source=source)
        if reply_to:
            post_data['reply_status_rid'] = reply_to
        r = self.getOpener().open('http://api.wassr.jp/statuses/update.json', urllib.urlencode(post_data))
        data = simplejson.loads(r.read())
        return data
      def getTimeline(self):
        url = 'http://api.wassr.jp/statuses/friends_timeline.json'
        r = self.getOpener().open(url)
        data = simplejson.loads(r.read())
        return data
      def getReplies(self):
        url = 'http://api.wassr.jp/statuses/replies.json'
        r = self.getOpener().open(url)
        data = simplejson.loads(r.read())
        return data
      def getOpener(self):
        passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
        passman.add_password(None, 'api.wassr.jp', self.user, self.passwd)
        authhandler = urllib2.HTTPBasicAuthHandler(passman)
        opener = urllib2.build_opener(authhandler)
        opener.addheaders = [('User-agent', 'WassrClient(http://d.hatena.ne.jp/jYoshiori/) rev.everes')]
        return opener



    if __name__ == "__main__":
      import os
      readline.parse_and_bind("tab: complete")
      # 認証設定
      wassr_config = Pit.get('wassr.jp',{'require' : {'user':'Your wassr name','password':'Your wassr password'}})
      wassr = Wassr(wassr_config['user'],wassr_config['password'])
      twitter_config = Pit.get('twitter.com',{'require' : {'user':'Your twitter name','password':'Your twitter password'}})
      twitter = tw.Api(twitter_config['user'], twitter_config['password'])

      friends = set()
      friendsTimeLine = []
      replies = []

      def complete(text, status):
        results = [x for x in friends if x.startswith(text)] + [None]
        return results[status]

      def reply_post(target, text):
        try:
          twitter.PostUpdate(u'@%s %s' % (target, unicode(text, 'utf-8'),))
          print 'twitterに@した'
          data = wassr.user_latest(target)
          data_id = data[0]['rid']
          wassr.post(text, data_id)
          print 'wassrに返信した'
        except:
          print '... Reply failed.'

      def twitPost(input):
        # 投稿処理
        twit = ''.join(input[:])
        try:
          wassr.post(input)
        except:
          print '... Wassr post failed.'
        try:
          twitter.PostUpdate(input)
        except:
          print '... Twitter post failed.'
        print 'update : ' + input

      def wassrFav(target):
        result = wassr.fav(target)
        try:
            if result['status'] == 'ok':
                print 'favした'
                return
        except Error, e:
            print 'fav失敗したかも'
            print e
      def wassrLatest(target):
        return wassr.user_latest(target)

      def getReplies(wassr, twitter):
        # get twitter friends Replies
        reply_flag = False
        try:
          for data in reversed(wassr.getReplies()):
            rep = '%-12s : %s' % (data['user_login_id'] ,data['text'])
            if not rep in replies:
              if not reply_flag:
                print '\n\t---- REPLIES ---- \t'
                reply_flag = True
              replies.append(rep)
              print '[w]' + rep
            friends.add(data['user_login_id'])
        except:
          print '... Wassr get replies failed.'

        # get twitter friends Replies
        try:
          for data in reversed(twitter.GetReplies()):
            rep = '%-12s : %s' % (data.GetUser().GetScreenName() ,data.GetText())
            if not rep in replies:
              if not reply_flag:
                print '\n\t---- REPLIES ---- \t'
                reply_flag = True
              replies.append(rep)
              print '[t]' + rep
            friends.add(data.GetUser().GetScreenName())
        except:
          print '... Twitter get replies failed.'
        return 0


      def getFriensTimeLine(wassr, twitter):
        # FriendsTimeLineの取得
        from datetime import datetime
        print ' -----  Friends Time Line  -----'
        print datetime.now()
        try:
          for data in reversed(wassr. getTimeline()):
            twit = "%-12s: %s" % (data['user_login_id'] ,data['text'])
            if twit in friendsTimeLine:
              pass
            else:
              print '[w]' + twit
              logging.info(twit)
              friendsTimeLine.append(twit)
        except: print '.... Wassr get friend timeline failed.'
        try:
          for data in reversed(twitter.GetFriendsTimeline()):
            # Logging しる
            twit  = "%-12s: %s" % (data.GetUser().GetScreenName(), data.GetText())
            if twit in friendsTimeLine:
              pass
            else:
              print '[t]' + twit
              logging.info(twit)
              friendsTimeLine.append(twit)
        except: print '.... Twitter get friend timeline failed.'

      readline.set_completer(complete)
      prompt = '\n cmd: Friendstimeline[f] eXit[xx] \n> '
      import re
      reply_re = re.compile(r'^@([a-zA-Z0-9]+) (.*)')
      fav_re = re.compile(r'^fav ([a-zA-Z0-9]+).*')

      while True:
        input = raw_input(prompt)
        if reply_re.match(input):
          fragm = reply_re.split(input)
          fragm.remove('')
          reply_post(fragm[0], fragm[1])
          continue
        elif fav_re.match(input):
          fragm = fav_re.split(input)
          fragm.remove('')
          try:
              userid = fragm[0]
              latest_data = wassrLatest(userid)
              wassrFav(latest_data[0]['rid'])
          except IndexError, e:
              print e
          continue
        else :
          input = input.split(" ")
          if input[0] != '':
            if len(input) == 1:
              if len(input[0]) > 2:
                twitPost(unicode(' '.join(input), 'utf-8'))
                continue
              else:
                if input[0] in getFriendsTimeLineKey:
                  getFriensTimeLine(wassr, twitter)
                  continue
                elif input[0] in sendPostKey:
                  twitPost(unicode(input, 'utf-8'))
                  continue
                elif input[0] in getRepliesKey:
                  getReplies(wassr, twitter)
                  continue
                elif input[0] in exitKey:
                  print 'bye ;-)'
                  break
                else:
                  twitPost(unicode(' '.join(input), 'utf-8'))
                  continue
            else:
              twitPost(unicode(' '.join(input), 'utf-8'))
              continue
          else:
            getFriensTimeLine(wassr, twitter)
            getReplies(wassr, twitter)

Prev Entry

Next Entry