#!/usr/bin/python # -*- vim: encoding: utf-8 -*- import struct import sys import thread from twisted.words.protocols import oscar from twisted.internet import reactor, protocol from twisted.python import log from omegle import OmegleChat # TEST RUN randoms = [['370496181', 'megahal123'], ['446323989','gagaga']] i=1 uin = randoms[i][0] password = randoms[i][1] class OmegleICQChat(OmegleChat): def __init__(self,icqconn,user): self.user = user self.icqconn = icqconn OmegleChat.__init__(self,name="omegle") def on_message(self,message): self.send_icqconn( message ) def send_icqconn(self,message): #send stopped typing snac reactor.callFromThread(self.icqconn.sendSNAC, 0x04, 0x14, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'+chr(len(self.user))+self.user+"\x00\x00") #von omegle kommt immer unicode message = unicode(message) #message.decode("utf-8") message = message.encode("iso-8859-1","replace") print "Omegle->%s: %s" % (self.user,message.__repr__()) reactor.callFromThread(self.icqconn.sendMessage, self.user, message ) def on_typing(self): """ 0x02 begin 0x01 idle 0x00 finish """ reactor.callFromThread(self.icqconn.sendSNAC, 0x04, 0x14, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'+chr(len(self.user))+self.user+"\x00\x02") print "Omegle->%s: (begin typing)" % self.user def on_stopped_typing(self): reactor.callFromThread(self.icqconn.sendSNAC, 0x04, 0x14, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'+chr(len(self.user))+self.user+"\x00\x01") def on_connect(self): print "Omegle->%s: (connected)" % self.user self.send_icqconn( "== Sup dawg, we heard u like to meet strangers so we put a Stranger in ur chat so u can chat while u chat (until you type \"disconnect\" without quotes) ==" ) def on_disconnect(self): print "Omegle->%s: (disconnected)" % self.user self.send_icqconn( "==Stranger Disconnected ==" ) CAP_TYPING = '\x56\x3f\xc8\x09\x0b\x6f\x41\xbd\x9f\x79\x42\x26\x09\xdf\xa2\xf3' # [4, 20, 0, 0, 2854066430L, '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\t222840035\x00\x02'] class icqBot( oscar.BOSConnection ): capabilities = [oscar.CAP_CHAT,CAP_TYPING] def __init__(self,s,p,factory,**kwargs): self.factory = factory oscar.BOSConnection.__init__(self, s, p,**kwargs) """ handles typing SNAC """ def oscar_04_14(self,snac): data = snac[3] if len(data) == len("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\t222840035\x00\x02"): user = data[11:20] state = data[20:22] if not self.omegleConns.has_key(user): self.omegleConns[user] = OmegleICQChat(self,user) if state == "\x00\x00": #finish try: self.omegleConns[user].stopped_typing() except: pass elif state == "\x00\x01": #idle pass elif state == "\x00\x02": #begin try: self.omegleConns[user].typing() except: pass else: print "Unknown state in typing snac\nuser %s\ndata %s\nsnac %s\nstate %X%X" % (user,data,snac,state[0],sate[1]) else: print "komisches tpying snac" def initDone( self ): self.requestSelfInfo() self.requestSSI().addCallback(self.gotBuddyList) self.omegleConns = {} def shutdown( self ): for conn in self.omegleConns: if conn.is_connected: conn.disconnect() def updateBuddy(self, user): print "icq: Update buddy %s" % user def gotBuddyList( self, buddylist ): self.activateSSI() self.setProfile("Forget ICQ, MSN, Yahoo and the other shitty protocols! Use XMPP/Jabber!") self.setIdleTime( 0 ) self.clientReady() for user in buddylist[0][0].users: print "icq: Authorize %s" % user.name self.sendAuthorizationResponse(user.name, True, '') def receiveMessage( self, user, multiparts, flags ): print "icq: receiveMessage(%s,%s,%s)" % (user,multiparts,flags) if "auto" in flags: print "'auto' message, abort" return # because i cant receive the "budded added signal" i auth on every message self.sendAuthorizationResponse(user.name, True, '') if not self.omegleConns.has_key(user.name): self.omegleConns[user.name] = OmegleICQChat(self,user.name) try: message = None if len(multiparts[0]) == 2: if multiparts[0][1] == "unicode": message = unicode(multiparts[0][0]) else: try: message = multiparts[0][0].decode(multiparts[0][1]) except Exception,e: self.sendMessage(user.name,str(e)) else: try: message = str(multiparts[0][0]) except Exception,e: self.sendMessage(user.name,str(e)) #filter qip \x00CHAR\x00CHAR - qip sucks at unicode? message_neu = filter(lambda x: x!=u"\x00", message) if len(message_neu) != len(message): client_sucks = True message = message_neu if not self.omegleConns[user.name].is_connected: if message == u"connect": self.omegleConns[user.name].start() self.sendMessage(user.name, "Please stand by.....") if client_sucks: self.sendMessage(user.name, "Hey, dein ICQ-Client sendet scheiss") else: self.sendMessage(user.name, "Not connected, type >connect<") elif self.omegleConns[user.name].is_connected and message == "disconnect": try: self.omegleConns[user.name].disconnect() except Exception,e: self.sendMessage(user.name, str(e)) self.sendMessage(user.name, "Disconnecting") elif self.omegleConns[user.name].is_connected and not self.omegleConns[user.name].is_confirmed: self.sendMessage(user.name, "Wait for connection confirm from omegle") else: # if len(multiparts[0]) == 2: # print "send to omegle: %s" % message.decode(multiparts[0][1]) # if multiparts[0][1] == "unicode": # self.omegleConns[user.name].send(unicode(message)) # else: try: # self.omegleConns[user.name].send(message.decode(multiparts[0][1])) print "%s->Omegle: %s" % (user.name, message.__repr__()) self.omegleConns[user.name].send(message) except Exception,e: print "icq(%s): Error %s" % (user.name,e) self.sendMessage(user.name,str(e)) # else: # print "send to omegle: %s" % message # self.omegleConns[user.name].send(message) except Exception,e: print "error: %s %s -> %s" % (user,multiparts,e) def chatReceiveMessage( self, chat, user, message ): self.receiveMessage( self, user, message, 0 ) def sendAuthorizationResponse(self, uin, success, responsString): packet = struct.pack("b", len(uin)) + uin if success: packet += struct.pack("b", 1) else: packet += struct.pack("b", 0) packet += struct.pack(">H", len(responsString)) + responsString self.sendSNACnr(0x13, 0x1a, packet) def connectionLost(self,reason): print "connnection los called: %s " % reason print dir(self) self.factory.connectionLost(reason) #self.shutdown() class OscarCrap( oscar.OscarAuthenticator ): BOSClass = icqBot # override this to connect our factory to our clients def connectToBOS(self, server, port): c = protocol.ClientCreator(reactor, OscarCrap.BOSClass, self.username, self.cookie, self.factory) return c.connectTCP(server, port) from twisted.internet.protocol import Protocol, ReconnectingClientFactory, ClientFactory class OscarFactory(ClientFactory): OAClass=OscarCrap def __init__(self, uid,password,icq=1): self.uid = uid self.password = password self.icq = icq def buildProtocol(self, addr): p = OscarFactory.OAClass(self.uid,password,icq=self.icq) p.factory = self return p def startedConnecting(self, connector): print 'Started to connect to oscar' def connectionLost(self,reason): print "CONECTION LOST - start njew factory" reactor.connectTCP('login.icq.com', 5238, OscarFactory(uin,password,icq=1)) class OscarClientFactory(ReconnectingClientFactory): def startedConnecting(self, connector): print 'Started to connect.' def buildProtocol(self, addr): print 'Connected.' print 'Resetting reconnection delay' self.resetDelay() #return protocol.ClientCreator( reactor, OscarCrap, uin, password, icq=1 ) p=OscarCrap(uin, password, icq=1 ) p.factory = self return p def clientConnectionLost(self, connector, reason): print 'Lost connection. Reason:', reason # ReconnectingClientFactory.clientConnectionLost(self, connector, reason) def clientConnectionFailed(self, connector, reason): print 'Connection failed. Reason:', reason # ReconnectingClientFactory.clientConnectionFailed(self, connector, # reason) import logging logging.basicConfig(level=logging.INFO) log.startLogging(sys.stdout) #protocol.ClientCreator( reactor, OscarCrap, uin, password, icq=1 ).connectTCP( 'login.icq.com', 5238 ) reactor.connectTCP('login.icq.com', 5238, OscarFactory(uin,password,icq=1)) #.connectTCP( 'login.icq.com', 5238 ) reactor.run()