Pythonでtwitterクライアント作ってみる - その1

なんかエンジニア仲間達と飲んでたら新しい言語覚えるときってどうするよ

みたいな話になって

某人が「twitterのクライアント作ったらいいんじゃね?」

って言ってたので作ってみようかなと

で、pythonGUIじゃ無くてCUIでやってみることにしました

まずはfollowしてる人の発言を取得できるとこからやってみました

以下ソース


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

import sys, time, os, re
import tty, termios
import StringIO
import pycurl
import threading
from xml.parsers import pyexpat
#import sqlite3

class Product(object): # Interface
def setAttribute(name, value): pass
def getAttribute(name): pass
def execute(): pass

class Parser: # Interface
def __init__(): pass
def parse(): pass

class XMLParser(Parser, threading.Thread):
p = None
str = ""
def __init__(self):
threading.Thread.__init__(self)
self.p = pyexpat.ParserCreate()

def startElement(obj, name, nodes):
global dispflg
if name == 'text':
dispflg = True
elif name == 'screen_name':
dispflg = True
else:
dispflg = False

def endElement(obj, name):
if name == 'text':
sys.stdout.write(" -> [ ")
sys.stdout.flush()
elif name == 'screen_name':
sys.stdout.write(" ]\n")
sys.stdout.flush()
time.sleep(0.1)

def charData(text, value):
if dispflg == True:
str = value.encode('UTF-8', 'replace').replace("\n", "")
str = str.replace(" ", "")
sys.stdout.write(str)
sys.stdout.flush()
#
def parse(self, str=""):
if str is not "": self.str = str
self.p.StartElementHandler = self.startElement
self.p.EndElementHandler = self.endElement
self.p.CharacterDataHandler = self.charData
self.p.Parse(self.str)



#
def run():
pass

class ApiContext: # Context
userID = 4671321
userName = "hagaeru3sei"
password = "**************"
responseType = "xml" # [xml, json, atom, rss] which one choise
url = "http://twitter.com"
response = ""
parser = XMLParser()

#
def setResponseType(self, type):
self.responseType = type
#
def getResponseType(self):
return self.type
#
def getUserURL(self):
return "http://twitter.com/users/show.xml?screen_name=hagaeru3sei"
#
def getTimeLineURL(self):
return self.url + "/statuses/friends_timeline." + self.responseType
# factory method
def Curl(*args):
return pycurl.Curl()
# set httpResponse
def setResponse(self, res):
self.response = res
def parse(self):
self.parser.parse(self.response)

class Twitter(Product, threading.Thread): # Twitter
context = None

#
def __init__(self):
threading.Thread.__init__(self)
self.context = ApiContext()
self.buffer = StringIO.StringIO()
#
def execute(self, *args):
curl = self.context.Curl()
curl.setopt(pycurl.URL, self.context.getTimeLineURL())
curl.setopt(pycurl.USERPWD, self.context.userName + ':' + self.context.password)
curl.setopt(pycurl.WRITEFUNCTION, self.buffer.write)
curl.setopt(pycurl.FOLLOWLOCATION, 1)
curl.setopt(pycurl.MAXREDIRS, 5)
curl.setopt(pycurl.CONNECTTIMEOUT, 30)
curl.setopt(pycurl.TIMEOUT, 300)
curl.setopt(pycurl.NOSIGNAL, 1)
curl.perform()

sys.stdout.write("\n")
sys.stdout.flush()

self.context.setResponse(self.buffer.getvalue())
self.context.parse()

#
def load(self):
threads = []
sys.stdout.write("Loading...")
sys.stdout.flush()

self.start()
threads.append(self)
cnt = 0
list = ['|', '/', '-', '\\']
while self.isAlive() is True:
sys.stdout.write(list[cnt])
sys.stdout.flush()
sys.stdout.write("\b")
sys.stdout.flush()
time.sleep(0.1)
cnt += 1
if cnt > 3:
cnt = 0
#sys.stdout.write("\n")
#sys.stdout.flush()

for thread in threads:
thread.join()
#
def run(self):
#while True:
# pass
self.execute()

#
def reload(self):
print('reload')

# main
def main(*args):
t = Twitter()
t.load()
return 0

if __name__ == "__main__":
try:
main();
except Exception,e:
print(e)

exit(0)

無駄なモジュールが多いのは拡張予定なので・・・

最終的にrubyのTermtterみたいな感じに出来たらいいなって思ってます

遠いなぁ・・・