[Python] Programar un bot per IRC

En el dia d'avui us vaig a ensenyar a programar un bot per la 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 el 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:

:son_link!sonlink@127.0.0.1 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


Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   AurosZx va dir

    Je, no podia faltar el Bot de les bestieses que muntes en l'IRC 😛 Molt interessant l'article.

  2.   Cesar va dir

    Molt simple i clara la expicación.
    El que si, a el codi python li falta tota la indentació.

  3.   rafa va dir

    Excel·lent article i el fàcil que és connectar-se a un IRC per programar un bot:) ...

    Em recorda aquells temps en què ens sentiem programadors a l'escriure scripts per a mIRC en els xats de MSN o MSNGroups

  4.   truko22 va dir

    Interessant m'ho guardo 😀

  5.   Genesis Vargas J. (@elprincipiodeto) va dir

    excel · lent!

  6.   Elynx va dir

    Molt útil, gràcies Son_Link!

    Salutacions!

  7.   dbillyx va dir

    salutacions ...

    seguint les teves línies i provant l'únic que funciona és
    presa d'importació
    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% SRN»% NICK)
    s.send ( «USER% s% s bla:% SRN»% (IDENT, HOST, realname))
    s.send ( «JOIN:% SRN»% CHAN)

    canviant el canal i el nick ara el de baix em tira sintaxi d'error

    li pregunti a altres coneguts i em diuen que això no sembla python

    no es que andare fent malament o que perquè copio tot i ho pego en python i li dono enter i es connecta a canal però després de 250 segons el canal el treu per que no hi va haver resposta de taula ...

  8.   pinfry va dir

    No em funciona el codi complet, l'últim paràgraf és el que falla i no aconsegueixo trobar l'error. Si aquesta part l'esborro es connecta i funciona perfectament. Provat amb Python 2.7.3 a Windows 7.

    PD: En el meu cas em connecto a un servidor amb contrasenya i afegeixo aquestes línies:
    PASS = »Passdelbot»
    s.send ( «PASS% s \ r \ n»% PASS)

  9.   DOLPHIN va dir

    Hola Són Link, moltes gràcies per l'article, està molt interessant, només que no aconsegueixo respondre a les comandes enviades. El programa no entra en l'últim if i no aconsegueixo esbrinar el per què: «if len (line)> 1:»
    Espero la teva resposta.
    Gràcias