[Python] Programar un bot per IRC

En el dia d'avui us vaig a ensenyar a programar un bot per IRC. Primer de tot, per als que no ho sàpiguen, un bot és un programa que es connecta a un canal d'IRC i interactuar amb el, el que ens permet, per exemple, moderar el canal sense que nosaltres estiguem connectats i així evitar l'spam, o que reconegui una sèrie d'ordres i executeu el codi corresponent.
Si bé ja existeixen brossa llestos, sincerament sóc de als quals els agraden fer els seus propis programes per aprendre i la gran satisfacció que ens dóna després de veure que funciona ^^

Dit això, passem a l'tutorial.

Per programar el bot necessitarem un editor de text pla qualquiera (Nano, gedit, Medit, etc) i intèrpret de Python (Serà necessari el 2.6 o 2.7, no funciona amb python 3.x).

Primer importem els mòduls necessaris, En aquest cas només necessitarem de dues:

[Code] #! / Usr / bin / env python
# - * - coding: utf-8 - * -

presa d'importació
import string
[/ codi]

Ara procedim a configurar el bot:

[code] HOST=»irc.desdelinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
Realname = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
[/ codi]

Pas a explicar cada variable:

  • HOST: L'URL de servidor a què ens connectarem
  • PORT: El port de servidor. Per defecte és el 6667.
  • NICK, IDENT i realname: Corresponen a l'nick de el bot, la seva identificació i el nom real.
  • CHAN: El canal a què entrés el bot
  • readbuffer: En aquesta variable es ira guardant les dades enviades pel servidor.

Un cop configurat el nostre bot procedim a la connexió

[Code] s = socket.socket ()
s.connect ((HOST, PORT))
s.send ( «NICK% s \ r \ n»% NICK)
s.send ( «USER% s% s bla:% s \ r \ n»% (IDENT, HOST, realname))
s.send ( «JOIN:% s \ r \ n»% CHAN)
[/ codi]

La primera línia no té gaire misteri, la segona crea la connexió amb el servidor i les tres ultimes envien a l'servidor les dades de el bot per a procedir a l'inici de sessió.

Un cop connectats crearem un bucle infinit en el qual anirem rebent i enviant les dades del / a el servidor:

[Code] while 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, «\ n»)
readbuffer = temp.pop ()
for line in temp:
line = string.rstrip (line)
line = line.split (CHAN + ':')

if línia [0] .find ( «PING»)! = -1:
pingid = línia [0] .split () [1] s.send ( «PONG% s \ r \ n»% pingid)
[/ codi]

De totes les línies amunt escrites només comentés les importants.
Amb line = line.split (CHAN + ':') El que fem és dividir el que ens envia el servidor quan rebem alguna cosa des del canal.
Per exemple la següent línia indica que algú va escriure alguna cosa al canal:

:[email protected] PRIVMSG #Home :Hola ^^

El primer és el nick de l'usuari i dades de la seva connexió (separats per!), La comanda (en aquest cas indica que va escriure), el canal i per últim, després dels dos punts el missatge enviat. No explicaré molts mes comandaments ja que això no entra dins d'aquest tutorial.

Les altres línies importants són les que estan després del if. El servidor de tant en tant envia la comanda PING per comprovar si l'usuari encara aquesta connectat. En aquest cas el bot envia la comanda PONG amb una ID que li comandament PING per indicar a l'servidor que segueix connectat.

Amb això ja tenim la base de l'amp. Ara procediré a explicar com fer que el bot respongui segons vulguem a certs ordres, siguin de l'propi IRC o dels usuaris.

Responent a comandaments de IRC:

PING i PRIVMSG són exemples d'ordres d'IRC. Hi ha molts comando, però com vaig dir anteriorment, és una cosa del que no entri en un detall.
Per exemple, podem fer que el bot saludi als usuaris que es connectin:

[Code] if línia [0] .find ( 'JOIN')! = -1:
name = línia [0] .split ( '!') [0] .split ( ':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ( «PRIVMSG% s: Benvinguts% s ^^ \ n»% (CHAN, name))
[/ codi]

Primer vam comprovar si el servidor envia la comanda JOIN que indica que connecto algú a servidor. Després extraiem el nick, vam comprovar que el nick no sigui la url del l'IRC (Si no quant executem el bot saludés a la url) i per últim vam enviar el missatge de salutació.

Comandaments de el bot:

Ara ¿com faig que el meu bot respongui als meus propis comandaments? Millor mirem un exemple:

[Code] if línia [1] == '$ versio':
s.send ( «PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Són Link \ n»% CHAN)
[/ codi]

En aquest exemple, si algú escriu $ versio el bot mostrés el missatge indicant el seu nom, versió i autors. El codi complet de l'exemple és aquest:

[Code] import socket
import string

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
Realname = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ( «NICK% s \ r \ n»% NICK)
s.send ( «USER% s% s bla:% s \ r \ n»% (IDENT, HOST, realname))
s.send ( «JOIN:% s \ r \ n»% CHAN)

mentre que 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, «\ n»)
readbuffer = temp.pop ()
for line in temp:
print line
line = string.rstrip (line)
line = line.split (CHAN + ':')

if línia [0] .find ( «PING»)! = -1:
pingid = línia [0] .split () [1] s.send ( «PONG% s \ r \ n»% pingid)

if línia [0] .find ( 'JOIN')! = -1:
name = línia [0] .split ( '!') [0] .split ( ':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ( «PRIVMSG% s: Benvinguts% s ^^ \ n»% (CHAN, name))

if len (line) <1:
if línia [1] == '$ versio':
s.send ( «PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Són Link \ n»% CHAN)
[/ codi]

Espero que aquest tutorial us troba agradat, i com no, us deixo l'enllaç a el codi de la meva bot perquè vegeu el seu codi a el complet i pugueu veure millor com treballa (Tot i que he tret alguns comandaments d'ús personal).

CalicoBot