便所の落書きレベルのコード
benjyo ni twisted no code ga kaiteatta yo!!!
from twisted.web.client import getPage from twisted.internet import reactor,defer import urllib import simplejson _CREATE_URL = "http://www.lingr.com/api/session/create/" _ENTER_URL = "http://www.lingr.com/api/room/enter" _SAY_URL = "http://www.lingr.com/api/room/say" _OBSERVE_URL = "http://www.lingr.com/api/room/observe/" _GET_MESSAGES_URL = "http://www.lingr.com/api/room/get_messages/" _EXIT_URL = "http://www.lingr.com/api/room/exit'" api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" class Lingr(object): session = {} ticket = {} counter = 0 observeCallbacks = [] start = True def __init__(self, api_key): self.api_key = api_key data = dict(api_key = api_key, format = "json", client_type="human") self.d = getPage(_CREATE_URL, method = 'POST', postdata = urllib.urlencode(data)) def session_response(json): json = simplejson.loads(json) self.session = json["session"] self.d.addCallback(session_response).addErrback(self.error) def enter_room(self, id, nickname = "anonymous"): def enter(result): data = dict(session = self.session,id = id, nickname = nickname,format="json") d = getPage(_ENTER_URL, method = 'POST', postdata=urllib.urlencode(data)) def enter_response(json): json = simplejson.loads(json) self.ticket = json["ticket"] self.counter = json["room"]["counter"] self.login = True print "%s enter %s room" % (nickname, id) d.addCallback(enter_response).addCallback(self.observe).addErrback(self.error) self.d.addCallback(enter).addErrback(self.error) def observe(self, result): data = dict(session = self.session, ticket= self.ticket, counter = self.counter, format = "json") d = getPage(_OBSERVE_URL+"?"+urllib.urlencode(data), method = 'GET') def observe_response(json): json = simplejson.loads(json) self.counter = json["counter"] messages = json["messages"] return messages d.addCallback(observe_response) self._observeCallback(d) d.addCallback(self.observe).addErrback(self._observeError).addErrback(self.error) def _observeError(self, err): r = err.trap(KeyError) self.observe(None) def _observeCallback(self, deferred): for callback in self.observeCallbacks: deferred.addCallback(callback) def exit(self): data = dict(session = self.session, ticket= self.ticket, format = "json") d = getPage(_EXIT_URL, method = 'POST', postdata=urllib.urlencode(data)) def exit_response(json): reactor.stop() self.start = False d.addCallback(exit_response).addErrback(self.error) def error(self, err): print err if self.login: self.exit() def start(self): def _delay(): reactor.callInThread(self.sendMessage) reactor.callLater(5, _delay) reactor.run() def say(self, message): message = unicode(message, "japanese.sjis") message = message.encode('utf-8') data = dict(session = self.session, message = message, ticket= self.ticket, format = "json") d = getPage(_SAY_URL, method = 'POST', postdata=urllib.urlencode(data)) d.addCallback(lambda data: data).addErrback(self.error) def sendMessage(self): while self.start: msg = raw_input() reactor.callFromThread(self.say, msg) if __name__ == '__main__': def res(messages): for m in messages: type = m["type"] nickname = m["nickname"] timestamp = m["timestamp"] text = m["text"] print "%s says: %s at %s" % (nickname, text, timestamp) lingr = Lingr(api_key) lingr.enter_room("xxxxx", nickname="xxxxxxxxxxx") lingr.observeCallbacks.append(res) try: lingr.start() except KeyboardInterrupt: lingr.exit()
うくく。