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

When it’s ready.

出来るまで出来ない

tw2改造した

yosioriさんがcodereposに上げてくれたので、ブランチして色々いじってみた。オリジナルは、リプライとポストのみ取得だったので、フレンズタイムラインの取得と取得したtwitのファイルへの書き出しを行えるようにした。python2.6で動かしてます。
リポジトリー
http://coderepos.org/share/browser/lang/python/tw2/branches/tw2_a2c

必要なモジュールは、python-twitterとPit
Pitは、twitterwassrの設定が必要です。してなくても、初回起動時に聞かれると思います。(Pitがあるから気楽にコミットできる、ありがとやす>作者様)

挙動は、オリジナルと同じく、

  • なんか書いてエンターすると、投稿になります。
  • 空文字でエンターすると、返信一覧が見えます。
  • f とエンターするとフレンズタイムラインが見えてログに記録されます。ログは、スクリプトと同じフォルダに作成されます。
  • bye とエンターで終了します。

以下、ひどいソース

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

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

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

# 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 post(self, text):
    text = text.encode('utf-8')
   #text = text.encode('utf-7')
    self.getOpener().open('http://api.wassr.jp/statuses/update.json', urllib.urlencode({'status':text,'source':source}))
  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/)')]
    return opener


class Outputz:
  def __init__(self,key,uri):
    self.key = key
    self.uri = uri
  def post(self,count):
    param = urllib.urlencode({'key':self.key,'uri':self.uri, 'size':count})
    self.getOpener().open('http://outputz.com/api/post', param)
  def getOpener(self):
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'OutputsMiniblogClient(%s)' % self.uri)]
    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'])
  # outpuz設定
  outputz_key = Pit.get('outputz.com',{'require' : {'key':'Your outputz key'}})['key']
  twitter_outputz = Outputz(outputz_key, 'http://twitter.com/%s' % twitter_config['user'])
  wassr_outputz = Outputz(outputz_key, 'http://wassr.jp/user/%s' % wassr_config['user'])

  friends = set()
  friendsTimeLine = []

  def complete(text, status):
    results = [x for x in friends if x.startswith(text)] + [None]
    return results[status]
  
  # 投稿部分
  def twitPost(input):
    wassr.post(input[1])
    twitter.PostUpdate(input[1])
    twitter_outputz.post(len(input[1]))
    wassr_outputz.post(len(input[1]))
    print 'update : ' + input[1]

  def getReplies(wassr, twitter):
    # get twitter friends Replies
    print '\twassr replies\t'
    for data in reversed(wassr.getReplies()):
      print '%-12s : %s' % (data['user_login_id'] ,data['text'])
      friends.add(data['user_login_id'])
  
    # get twitter friends Replies        
    print '\n\twassr replies\t'
    for data in reversed(twitter.GetReplies()):
      print '%-12s : %s' % (data.GetUser().GetScreenName() ,data.GetText())
      friends.add(data.GetUser().GetScreenName())
    return 0

  readline.set_completer(complete)

  prompt = '\n cmd: Friendstimeline[f] eXit[xx] \n> '
  while True:
    input = raw_input(prompt).split(" ")
    if len(input) > 0:
      for i in range(len(input)):
        input[i] = unicode(input[i],'utf-8')
      if len(input[0]) > 2:
        input.append(input[0])
        twitPost(input)
    else:
      continue

    # FriendsTimeLineの取得
    if input[0] in getFriendsTimeLineKey: 
      print '  -----  twitter Friends Time Line  -----\n'
      for data in reversed(twitter.GetFriendsTimeline()):
        print '%-12s : %s' % (data.GetUser().GetScreenName() ,data.GetText())
        # Logging しる
        twit  = "tw[%s]%-12s: %s" % (data.GetCreatedAt(), data.GetUser().GetScreenName(), data.GetText())
        if twit in friendsTimeLine:
          pass
        else:
          logging.info(twit)
          friendsTimeLine.append(twit)
          
      print '\n -----  wassr Friends Time Line  -----'
      for data in reversed(wassr. getTimeline()):
        print "%-12s: %s" % (data['user_login_id'] ,data['text'])
        twit = "wr[]%-12s: %s" % (data['user_login_id'] ,data['text'])
        if twit in friendsTimeLine:
          pass
        else:
          logging.info(twit)
          friendsTimeLine.append(twit)

    elif input[0] in sendPostKey:
      twitPost(input)

    elif input[0] in getRepliesKey:
      getReplies(wassr, twitter)
      
    elif input[0] in exitKey:
      # exit
      print 'bye ;-)'
      break
    else: 
      print 'なんかおかしいぞ!'