import sys import httplib import urllib import time import json import logging from threading import Thread, Lock, Event __all__ = ['OmegleChat', 'get_count'] class Timer(Thread): """ This class defines a object that calls the function object given as func every given interval in a Thread and stops immedietly after stop() has been called """ 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 self.event = Event() def run(self): self.running = True while self.running: self.logger.debug("Timer.run itertaion") self.func() self.event.wait(self.interval) self.event.clear() self.logger.debug("self.running == False") def stop(self): self.running = False self.event.set() class RESTClient(object): headers = { "Host" : "omegle.com", "Content-type": "application/x-www-form-urlencoded; charset=utf-8", "Accept": "application/json" } def __init__(self,host,http_debuglevel=0): self.conn_lock = Lock() self.conn = httplib.HTTPConnection(host) self.conn.set_debuglevel(http_debuglevel) def request(self,method,path,params): self.conn_lock.acquire() self.conn.request(method,path,params,RESTClient.headers) resp = self.conn.getresponse() self.conn_lock.release() return resp class OmegleChat(RESTClient): def __init__(self,poll_interval=0.5,name=""): RESTClient.__init__(self,'www.omegle.com') self.timer = Timer(self.events, poll_interval) self.logger = logging.getLogger(__name__ + "." + self.__class__.__name__ + name) self.is_connected = False def start(self): resp = RESTClient.request(self, "POST", "/start", {}) body=resp.read() id=body.split("\"") if id.__len__() == 3: self.id = id[1] self.logger.info("Connected id=%s" % self.id) #Poll events self.timer.start() else: self.logger.error("Bad response: %s" % body) raise Exception("Bad response: %s" % body) def disconnect(self): self.logger.debug("/disconnect") self.is_connected = False self.timer.stop() r = RESTClient.request(self,"POST", "/disconnect", urllib.urlencode({'id': self.id})) 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): """does use its own "HTTPConnection" because its called async from a thread""" 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): #if a raw string given, assume its utf8 if msg.__class__ == str: msg = msg.decode("utf8") #convert utf8 to RAW-utf8 msg = msg.encode("utf8") r = RESTClient.request(self,"POST","/send",urllib.urlencode({'id':self.id,'msg':msg})) body = r.read() if body != "win": self.logger.error("/send; Bad response %s" % body) raise Exception("/send; Bad response %s" % body) def typing(self): r = RESTClient.request(self, "POST", "/typing", urllib.urlencode({'id':self.id})) 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): r = RESTClient.request(self, "POST", "/stoppedtyping", urllib.urlencode({'id':self.id})) 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(body.decode("utf8")) 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\"]") def get_count(): """Return the number of current online omegle users""" headers = { "Host" : "omegle.com", "Content-type": "application/x-www-form-urlencoded; charset=utf-8", "Accept": "application/json"} conn = httplib.HTTPConnection('www.omegle.com') conn.request("GET", "/count", urllib.urlencode({}), headers) body = conn.getresponse().read() conn.close() return body if __name__ == "__main__": logging.basicConfig(level=logging.INFO) print "Lets chat. Type \"quit\" to disconnect" chat = OmegleChat() def exit(): OmegleChat.on_disconnect(chat) sys.exit(0) chat.on_disconnect = exit 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)