Simple Python IRC Bot
This article shows the code of a simple python irc bot.
To run it, you should create a file, e.g: pybot.py, copy following code in it, and exec:
$ python pybot.py
other way to run it:
$ chmod a+x pybot.py
$ ./pybot.py
BOT SOURCE CODE
#!/usr/bin/env python import socket import re class Bot(): # Change into values that suit you. NETWORK = 'irc.freenode.org' PORT = 6667 nick = 'ztbot' channel = '#emacs-es' owner = 'Zent' def __init__(self): self.quit_bot = False self.command_list = [] # initialy we have not received any command. self.data_buffer = '' # no data received yet. self.rexp_general = re.compile(r'^(:[^ ]+)?[ ]*([^ ]+)[ ]+([^ ].*)?$') def connect_to_server(self): self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.irc.connect((self.NETWORK, self.PORT)) self.irc.send('NICK ' + self.nick + '\r\n') self.irc.send('USER ' + self.nick + ' Ztbot Ztbot :Python IRC Bot\r\n') self.irc.send('JOIN ' + self.channel + '\r\n') def say_hello(self): # Say hello! self.irc.send('PRIVMSG ' + self.owner + ' :Hello World.\r\n') def parse_command(self, data): p = self.rexp_general r = p.search(data) if r is None: # command does not match. print "command does not match." return g = r.groups() print g sender = g[0] cmd = g[1] params = g[2] if cmd == 'PING': self.irc.send('PONG ' + params + '\r\n') return elif cmd == 'KICK': self.irc.send('JOIN ' + self.channel + '\r\n') return elif cmd == 'PRIVMSG': quit_rex = r'%s:[ ]+(quit|QUIT)' % self.nick if re.search(quit_rex, params) is not None: s_expr = 'PRIVMSG %s :OK, I am quitting now!\r\n' % self.owner self.irc.send(s_expr) self.irc.send('QUIT\r\n') self.quit_bot = True return hi_rex = r'(hi|hello|hola)[ ]+%s' % self.nick if re.search(hi_rex, params) is not None: msg = 'Hi, I am a pythonic irc bot!\r\n' self.irc.send('PRIVMSG %s :%s\r\n' % (self.channel, msg)) return def get_command(self): if len(self.command_list) > 0: result = self.command_list.pop(0) return result # There is no command available, we read more bytes. chunk = self.irc.recv(4096) self.data_buffer = ''.join([self.data_buffer, chunk]) self.command_list = self.data_buffer.split('\r\n') self.data_buffer = self.command_list.pop() if len(self.command_list) == 0: return None result = self.command_list.pop(0) return result def main(self): self.connect_to_server() self.say_hello() while True: com = self.get_command() while com is None: com = self.get_command() print "com: ", com self.parse_command(com) if self.quit_bot == True: break if __name__ == '__main__': myBot = Bot() myBot.main()
Just some CLUES ABOUT THE PYTHON IRC BOT CODE:
main function runs the main loop.
First it connects to irc server and sends a private message to its owner.
get_command function reads chunks of data from a socket, and split them into lines finished with CR LF.
parse_command function takes the command obtained from get_command and parses it using regular expressions.
Currently
- If server sends a PING, bot anwers with PONG.
- If bot gets kicked out from a channel it rejoins in it again.
- If you say hi to the bot it introduces itself.
- To quit the bot just tell quit to it. i.e:
ztbot: quit
NOTE:
I have written a more complex python irc bot able to upgrade its code on the fly using xreload.py
The code is available here: https://github.com/vhernando/Ztn-IRC-Bot
REFERENCE:
RFC 1459
http://www.hawkee.com/snippet/2497/
0 comentarios:
Post a Comment