import sys import httplib import urllib import time import json import logging from threading import Thread, Lock class Timer(Thread): def __init__(self,func,interval=0.50): Thread.__init__(self) self.logger = logging.getLogger(__name__ + "." + self.__class__.__name__) self.func = func self.interval = interval self.running = False def run(self): self.running = True while self.running: self.func() time.sleep(self.interval) self.logger.debug("self.running == False") def stop(self): self.running = False class OmegleChat(object): headers = { "Host" : "omegle.com", "Content-type": "application/x-www-form-urlencoded; charset=utf-8", "Accept": "application/json" } def __init__(self,name="",poll_interval=0.5): self.conn = httplib.HTTPConnection('www.omegle.com') # self.conn.set_debuglevel(1) self.conn_lock = Lock() self.timer = Timer(self.events, poll_interval) self.logger = logging.getLogger(__name__ + "." + self.__class__.__name__ + name) self.is_connected = False def start(self): self.conn_lock.acquire() self.conn.request("POST", "/start", {}, OmegleChat.headers) self.conn_lock.release() r=self.conn.getresponse() body=r.read() id=body.split("\"") if id.__len__() == 3: self.id = id[1] self.logger.info("Connected id=%s" % self.id) else: self.logger.error("Bad response: %s" % body) raise Exception("Bad response: %s" % body) #Poll events self.timer.start() def disconnect(self): self.logger.debug("/disconnect") self.is_connected = False self.timer.stop() self.conn_lock.acquire() self.conn.request("POST", "/disconnect", urllib.urlencode({'id' : self.id}), OmegleChat.headers) r = self.conn.getresponse() self.conn_lock.release() body = r.read() self.logger.debug("/disconnect sent. Read: %s" % body) if body == "win": pass else: self.is_connected = True #disconnect failed raise Exception("/disconnect; Bad response: %s" % body) def events(self): conn = httplib.HTTPConnection('www.omegle.com') conn.request("POST", "/events", urllib.urlencode({'id' : self.id}), OmegleChat.headers) r=conn.getresponse() body=r.read() self.dispatch_event(conn,body) conn.close() def send(self,msg): msg = unicode(msg).encode("utf8") self.conn_lock.acquire() self.conn.request("POST", "/send", urllib.urlencode({'id':self.id,'msg':msg}), OmegleChat.headers) r=self.conn.getresponse() self.conn_lock.release() body = r.read() if body != "win": self.logger.error("/send; Bad response %s" % body) raise Exception("/send; Bad response %s" % body) def typing(self): self.conn_lock.acquire() self.conn.request("POST", "/typing", urllib.urlencode({'id':self.id}), OmegleChat.headers) r=self.conn.getresponse() self.conn_lock.release() body = r.read() if body != "win": self.logger.error("/typing; Bad response %s" % body) raise Exception("/typing; Bad response %s" % body) def stopped_typing(self): self.conn_lock.acquire() self.conn.request("POST", "/stoppedtyping", urllib.urlencode({'id':self.id}), OmegleChat.headers) r=self.conn.getresponse() self.conn_lock.release() body = r.read() if body != "win": self.logger.error("/stoppedtyping; Bad response %s" % body) raise Exception("/stoppedtyping; Bad response %s" % body) def dispatch_event(self,conn,body): try: data_set=json.read(unicode(body)) if not data_set: self.logger.debug("event: no data received") return for data in data_set: if data[0] == "typing": self.on_typing() elif data[0] == "gotMessage" and data.__len__() == 2: self.on_message(data[1]) elif data[0] == "connected": self.is_connected = True self.on_connect() elif data[0] == "strangerDisconnected": self.is_connected = False self.timer.stop() self.on_disconnect() elif data[0] == "stoppedTyping": self.on_stopped_typing() elif data[0] == "waiting": self.on_wait() else: self.logger.error("Unknown JSON Data: %s" % body) except json.ReadException: self.logger.error("Json ReadException. Body: %s" % body) def on_message(self,message): self.logger.info("<<< %s" % message) def on_connect(self): self.logger.info("Connection confirmed") def on_typing(self): self.logger.info("Stranger is typing") def on_stopped_typing(self): self.logger.info("Stranger stopped typing") def on_disconnect(self): self.logger.info("Stranger Disconnectet") def on_wait(self): self.logger.info("Server sent [\"waiting\"]") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) print "Lets chat. Type \"quit\" to disconnect" chat = OmegleChat() chat.start() while 1==1: try: cmd=sys.stdin.readline().strip() except KeyboardInterrupt: chat.disconnect() break if cmd=="quit": chat.disconnect() break else: print ">>> %s" % cmd chat.send(cmd)