summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icq_roombot_omegle.py274
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()
+