diff options
Diffstat (limited to 'icq_roombot_omegle.py')
-rw-r--r-- | icq_roombot_omegle.py | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/icq_roombot_omegle.py b/icq_roombot_omegle.py new file mode 100644 index 0000000..e3fef73 --- /dev/null +++ b/icq_roombot_omegle.py @@ -0,0 +1,274 @@ +#!/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 + +accs = [['370496181', 'megahal123'], ['446323989','gagaga']] +i=1 +uin = accs[i][0] +password = accs[i][1] + +CHATROOM_UID = "370496181" + +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 need some stranger in ur chatroom, so we put a Stranger in ur chatroom so u can chat with him while u chat with others (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 ): + self.sendMessage(CHATROOM_UID, "/leave") + 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, '') + self.sendMessage(CHATROOM_UID, "/join OMEGLE") + + 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 = multiparts[0][0].decode('latin1') + 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 u"%connect%" in message: + 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: + print "Not connected" +# self.sendMessage(user.name, "Not connected, type >connect<") + elif self.omegleConns[user.name].is_connected and u"%disconnect%" in message: + 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() + |