Python :: Bot IRC

Le mer. 23 février 2011 par Kasey

Petit TP de la nuit : comment programmer un Bot IRC python en quelques lignes.

Principe

IRC étant un protocole tres simple; le principe du code est trés simple :

  • on ouvre un socket sur le bon port vers le bon serveur
  • on envois en texte les commandes qui vont bien
  • on boucle ensuite en analysant a intervale régulier le code
  • si on repère une string spécifique, on applique le code dan la condition (dans mon cas un exit ou une commande fortune bashfr :) )

Vous trouverez ci-dessous le code spécifique qui se passe de commentaire a mon humble avis.

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#! /usr/bin/python

import socket, string, time
from subprocess import Popen, PIPE

network = 'irc.freenode.net'
pseudo  = 'kasey-bot'
chan    = 'kaseybottest'
port    = 6667
fortune = '/opt/local/bin/fortune'

irc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
irc.connect((network,port))
#print irc.recv(4096)
irc.send('NICK %s\r\n' % pseudo)
irc.send('USER %s %s %s :Python IRC bot\r\n' % (pseudo,pseudo,pseudo))
irc.send('JOIN #%s\r\n' % chan)
irc.send('PRIVMSG #%s :Hello masters _o_\r\n' % chan)

while True:
    data = irc.recv(4096)
    if data.find('PING') != -1:
        irc.send('PONG '+data.split()[1]+'\r\n')
    if data.find('!%s quit' % pseudo) != -1:
        irc.send('PRIVMSG #%s : Ce sont les meilleurs qui partent en premier :-/ \r\n' % chan)
        irc.send('QUIT\r\n')
        exit()
    if data.find('bashfr') != -1:
        quote = Popen(fortune+' bashfr', stdout=PIPE, shell=True).stdout.read()
        i = 0
        for line in quote.splitlines(True):
            i += 1
            if i > 14: time.sleep(1)
            irc.send('PRIVMSG #%s :%s\r\n' % (chan,line.rstrip()))
#   print data

Note : les print sont des debugs qui affichent les commandes retournées par le serveur. Je vous ocnseille de les activer le temps de la mise au point du script :)