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)


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar