※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 そういや、今は 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)