Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

便所の落書きレベルのコード

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()

うくく。