Index: /lang/python/todotter/jsonfile.py
===================================================================
--- /lang/python/todotter/jsonfile.py (revision 11068)
+++ /lang/python/todotter/jsonfile.py (revision 11068)
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+# -*- coding: sjis -*-
+import json
+
+#json�ǂݍ���def read(filename):
+	try:
+		file = open(filename,'r')
+		mt = json.read(file.read())
+		file.close()
+	except:
+		mt = {}
+	return mt
+
+def write(filename,data):
+	file = open(filename,'w')
+	file.write(json.write(data))
+	file.close()
+	
Index: /lang/python/todotter/todotControl.py
===================================================================
--- /lang/python/todotter/todotControl.py (revision 11068)
+++ /lang/python/todotter/todotControl.py (revision 11068)
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# twitter/tmtの監視とメールを送る処理を行う
+
+if True:
+#if False:
+	homePath = "./"
+else:
+	homePath = "/home/yuki/todotter/"
+
+c_debug = False;
+#c_debug = True;
+"""
+指定されたユーザの発言を見て、ToDo:が含まれていれば登録する。
+
+"""
+def crawlAndAppend(userData,crawlUser,latest):
+	import twitter3,toDate,string
+	tw = twitter3.Twitter(userData)
+	a = tw.getWithUser(crawlUser)
+	a.reverse()
+	for x in a:
+		if c_debug:
+			print x[0],
+			print ":",
+			print x[1].encode("cp932"),
+			print toDate.toDate(x[2]),
+			print nowTime
+		
+		# 最終更新時刻以前のログはカット
+		if toDate.toDate(x[2]) - latest < datetime.timedelta(days =0) :
+			print "pass"
+			continue;
+		xs = x[1]
+		#xs = x[1].encode("utf-8")	
+		if( xs.startswith("[ToDo]") or xs.startswith("todo:") \
+			or xs.startswith(u"メモ：")):
+			#print "xs",
+			#xs = string.replace(xs,'todo:','')
+			#xs = string.replace(xs,'[ToDo]','')
+			xs = x[0] + " : "+xs
+			#xs = unicode(xs,'utf-8','ignore')
+			tw.put(xs)
+			print xs
+
+"""
+follower一覧を取ってくる
+>>> user = jsonfile.read(homePath+"user/twdata_todotter")
+>>> crawlUserList(user["user"])
+["showyou"]
+"""
+def crawlUserList(user):
+	import twitter3
+	tw = twitter3.Twitter(user)
+
+	return tw.getFollowersLite(user);
+
+import picklefile,todot,datetime,jsonfile
+
+user = jsonfile.read(homePath+"user/twdata_todotter") 
+try:
+	userData = picklefile.read(homePath+"user/twdata_todotuserdata")
+except:
+	userData = {} 
+crawlUserData = []
+
+#followerを見て、userDataの一覧を取ってくる
+# userData は、({"user":user,
+# "time":nexttime(次の定期更新時刻),"now":flag(直ぐに送信するか)},...)
+crawlUser = crawlUserList(user)
+print crawlUser
+
+nowTime =  datetime.datetime.today() 
+for u in crawlUser:
+	
+	if( userData.has_key(u[0])):
+		pass
+	else:
+		userData[u[0]]={}
+		userData[u[0]]["time"] = datetime.datetime.today() - datetime.timedelta(hours = 1)
+	#if userData[u]["now"]:
+	#	userData[u]["now"] = False
+		#todot.crawlAndRegist(u["user"])
+		
+	#もし最終更新時刻～現在時刻の間にtimeがあったら、todoスキャンする
+	#if nowTime > userData[u[0]]["time"]:
+	
+	print u[0]
+	crawlAndAppend(user,u[0],userData[u[0]]["time"])
+ 	print "userData",
+	print userData
+
+	userData[u[0]]["time"] = nowTime
+
+picklefile.write(homePath+"user/twdata_todotuserdata",userData)
Index: /lang/python/todotter/toDate.py
===================================================================
--- /lang/python/todotter/toDate.py (revision 11068)
+++ /lang/python/todotter/toDate.py (revision 11068)
@@ -0,0 +1,12 @@
+def toDate(date):
+	import time,datetime
+	dates = time.strptime(date,"%a %b %d %H:%M:%S +0000 %Y")
+	dt = datetime.datetime(dates[0],dates[1],dates[2],dates[3],dates[4],dates[5],dates[6])+datetime.timedelta(hours=9)
+	return dt
+
+if __name__ == "__main__":
+	import datetime
+	date = "Sat Dec 22 01:07:16 +0000 2007"
+	print toDate(date)
+	print datetime.datetime.today()
+	
Index: /lang/python/todotter/toDate2.py
===================================================================
--- /lang/python/todotter/toDate2.py (revision 11068)
+++ /lang/python/todotter/toDate2.py (revision 11068)
@@ -0,0 +1,14 @@
+def toDate2(date):
+	import time,datetime
+	dates = time.strptime(date,"%Y-%m-%dT%H:%M:%S+00:00")
+	dt = datetime.datetime(dates[0],dates[1],dates[2],dates[3],dates[4],dates[5],dates[6])+datetime.timedelta(hours=9)
+	
+	return dt
+
+if __name__ == "__main__":
+	import datetime
+	date = "2008-02-24T06:39:37+00:00"
+	
+	print toDate2(date)
+	print datetime.datetime.today()
+	
Index: /lang/python/todotter/twitter3.py
===================================================================
--- /lang/python/todotter/twitter3.py (revision 11068)
+++ /lang/python/todotter/twitter3.py (revision 11068)
@@ -0,0 +1,168 @@
+# -*- coding: utf-8 -*-
+import urllib2,urllib,json
+
+class Twitter:
+	def __init__(self, userdata):
+		self.user = userdata
+		
+	def setUser(self,userdata):
+		self.user = userdata
+		
+	def setAuthHandler(self):
+		#ユーザ名等設定する
+		#初回時のみで充分かなぁ
+		auth_handler = urllib2.HTTPBasicAuthHandler()
+		auth_handler.add_password('Twitter API','twitter.com',self.user['user'],self.user['pass'])
+		opener = urllib2.build_opener(auth_handler)
+		urllib2.install_opener(opener)
+		return opener
+		
+	def get(self,username): 
+		self.setAuthHandler()
+		data = urllib2.urlopen("http://twitter.com/statuses/friends_timeline.json")
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+		
+	def getPublicTimeline(self):
+		data = urllib2.urlopen("http://twitter.com/statuses/public_timeline.json")
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+		
+	def getReplies(self,username):
+		self.setAuthHandler()
+		data = urllib2.urlopen("http://twitter.com/statuses/replies.json")
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+	
+	def getDM(self,username):
+		self.setAuthHandler()
+		s = "http://twitter.com/direct_messages.json"
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		a = json.read(urlstring)
+		print a
+		return self.parseTwitJSONDM(a)
+		
+	def getWithPage(self,username,num): 
+		# page番号つきget
+		self.setAuthHandler()
+		s = "http://twitter.com/statuses/friends_timeline.json?page="+str(num)
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+		
+	def getWithUser(self,user): 
+		# page番号つきget
+		self.setAuthHandler()
+		s = "http://twitter.com/statuses/user_timeline/"+user+".json"
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+	
+	def getWithUserPage(self,username,num): 
+		# page番号つきget
+		self.setAuthHandler()
+		s = "http://twitter.com/statuses/user_timeline/"+username+".json?page="+str(num)
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSON(a)
+
+	def getFollowersLite(self,username):
+		# followerを取得	
+		
+		self.setAuthHandler()
+		# ここ変える
+		s = "http://twitter.com/statuses/followers.json?lite=true"
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		a = json.read(urlstring)
+		return self.parseTwitJSONFollowers(a)
+	def parseTwitJSON(self,a):
+		result = []
+		for x in a:
+			resultSub = []
+			#resultSub.append(x['created_at'])
+			y = x['user']
+			resultSub.append(y['screen_name'])
+			resultSub.append(x['text'])
+			resultSub.append(x['created_at'])
+			result.append(resultSub)
+			#print resultSub[0]+resultSub[1]
+		return result
+	
+	def parseTwitJSONDM(self,a):
+		result = []
+		for x in a:
+			resultSub = []
+			#resultSub.append(x['created_at'])
+			y = x['sender']
+			resultSub.append(y['screen_name'])
+			resultSub.append(x['text'])
+			resultSub.append(x['created_at'])
+			result.append(resultSub)
+			#print resultSub[0]+resultSub[1]
+		return result	
+	
+	def parseTwitJSONFollowers(self,a):
+		result = []
+		for x in a:
+			resultSub = []
+			#resultSub.append(x['created_at'])
+			#y = x['sender']
+			resultSub.append(x['screen_name'])
+			#resultSub.append(x['text'])
+			#resultSub.append(x['created_at'])
+			result.append(resultSub)
+			#print resultSub[0]+resultSub[1]
+		return result		
+	
+	def put(self,s):
+		self.setAuthHandler()
+		postdata = {}
+		postdata['status'] = s.encode('utf-8')
+		#postdata['source'] = s
+		param = urllib.urlencode(postdata)
+		data = urllib2.urlopen("http://twitter.com/statuses/update.json",param)
+		print data.read()
+
+	def getUserPageWithScraping(self,user,num):
+		self.setAuthHandler()
+		s = "http://twitter.com/"+user+"?page="+str(num)
+		print "url+" +s
+		data = urllib2.urlopen(s)
+		urlstring = data.read()
+		if num == 1:
+			return self.scrapeTwit(urlstring,True)
+		else:
+			return self.scrapeTwit(urlstring,False)
+		
+	# HTMLをスクレイプします。
+	def scrapeTwit(self,a,isFirst):
+		import re
+		# <span class="entry-title entry-content">~</span>(最短)
+		#reg = re.compile(r'<(.*?)>')
+		retList = []
+		
+		reg = re.compile("<span class=\"entry-title entry-content\">([\w\W]*?)</span>[\w\W]*?<abbr class=\"published\" title=\"([\w\W]*?)\">.*?</abbr>",re.MULTILINE)
+		reg2 = re.compile("<span class=\"entry_content\">([\w\W]*?)</span>[\w\W]*?<abbr class=\"published\" title=\"([\w\W]*?)\">.*?</abbr>",re.MULTILINE)
+		# もし1ページ目なら、最新の発言も取ってくる
+		#if isFirst :
+		#	a3 = reg.findall(a)
+		#	retList.append( a3[0] )
+
+		a2 = reg2.findall(a)
+		for aa in a2:
+			retList.append( (aa[0].strip(),aa[1]) )
+
+		return retList
Index: /lang/python/todotter/picklefile.py
===================================================================
--- /lang/python/todotter/picklefile.py (revision 11068)
+++ /lang/python/todotter/picklefile.py (revision 11068)
@@ -0,0 +1,16 @@
+#!/usr/bin/python
+# -*- coding: sjis -*-
+import cPickle as pickle
+
+#pickle�œǂݏ���
+def read(filename):
+	file = open(filename,'r')
+	data = pickle.load(file)
+	file.close()
+	return data
+
+def write(filename,data):
+	file = open(filename,'w')
+	pickle.dump( data,file )
+	file.close()
+
Index: /lang/python/todotter/user/twdata_sample
===================================================================
--- /lang/python/todotter/user/twdata_sample (revision 11068)
+++ /lang/python/todotter/user/twdata_sample (revision 11068)
@@ -0,0 +1,1 @@
+{"user":"","pass":""}
