[Python] Naprogramujte robota pre IRC

Dnes vás naučím programovať a Bot pre IRC. Najskôr pre tých, ktorí to nevedia, je robot program, ktorý sa pripája k IRC kanálu a interaguje s ním, čo nám umožňuje napríklad moderovať kanál bez že sme spojení a vyhnúť sa tak spamu alebo že rozpozná sériu príkazov a vykoná zodpovedajúci kód.
Aj keď už sú roboti pripravení, som úprimne jedným z tých, ktorí si radi pripravujú svoje vlastné programy na učenie a veľkú spokojnosť, ktorú nám poskytujú, keď videli, že to funguje ^ ^

Po tomto prejdime k výučbe.

Na programovanie robota budeme potrebovať a obyčajný textový editor akýkoľvek (nano, gedit, meditácia atď.) a tlmočník pythonu (Bude potrebných 2.6 alebo 2.7, nefunguje s pythonom 3.x.).

Najskôr importujeme požadované moduly, v tomto prípade budeme potrebovať iba dva:

[kód] #! / usr / bin / env python
# - * - kódovanie: utf-8 - * -

dovozná zásuvka
reťazec na import
[/ kód]

Teraz pokračujeme k nastaviť robot:

[kód] HOST=»irc.desdelinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Domov»
readbuffer = »»
[/ kód]

Vysvetlím každú premennú:

  • HOST: URL servera, ku ktorému sa pripojíme
  • PRÍSTAV: Port servera. Predvolene je to 6667.
  • NICK, IDENT a REALNAME: Zodpovedajú prezývke robota, jeho identifikácii a skutočnému menu.
  • ZMENA: Kanál, do ktorého robot vstúpi
  • readbuffer: V tejto premennej sa uložia údaje odoslané serverom.

Po nakonfigurovaní nášho robota pokračujeme k spojenie

[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 ("PRIPOJENIE:% s \ r \ n"% ZMENA)
[/ kód]

Prvý riadok nemá veľké tajomstvo, druhý vytvára pripojenie k serveru a poslední traja odošlú údaje robota na server, aby mohli pokračovať v prihlásení.

Po pripojení vytvoríme Nekonečná slučka v ktorej pôjdeme prijímanie a odosielanie údajov z / na server:

[kód] zatiaľ čo 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pre line in temp:
riadok = string.rstrip (riadok)
line = line.split (CHAN + ':')

ak riadok [0] .find ("PING")! = -1:
pingid = riadok [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kód]

Zo všetkých riadkov napísaných vyššie budem komentovať iba tie dôležité.
s line = line.split (CHAN + ':') to, čo robíme, je rozdelenie toho, čo nám server pošle poďme niečo z kanála.
Napríklad nasledujúci riadok naznačuje, že niekto niečo napísal na kanál:

:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^

Prvým je prezývka používateľa a údaje o pripojení (oddelené znakom!), Príkaz (v tomto prípade znamená, že napísal), kanál a nakoniec po dvojbodke správa odoslaná. Nebudem vysvetľovať oveľa viac príkazov, pretože to nespadá do tohto tutoriálu.

Ostatné dôležité riadky sú tie sú po if. Server tak často odosiela príkaz PING, aby skontroloval, či je používateľ stále pripojený. V takom prípade robot pošle príkaz PONG s ID, ktoré poslal PING, aby oznámil serveru, že je stále pripojený.

S týmto už máme základňu robota. Teraz budem pokračovať a vysvetlím, ako dosiahnuť, aby robot reagoval podľa toho, čo chceme, na určité príkazy, či už sú to od samotného IRC alebo od používateľov.

Reakcia na IRC príkazy:

PING a PRIVMSG sú príklady príkazov IRC. Príkazov je veľa, ale ako som už povedal skôr, je to niečo, o čom sa nebudem rozpisovať.
Napríklad môžeme bota pozdraviť používateľov, ktorí sa pripájajú:

[code] if line [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] ak name! = NICK a name.find (HOST) == -1:
s.send ("PRIVMSG% s: Vitajte @% s ^^ \ n"% (CHAN, meno))
[/ kód]

Najskôr skontrolujeme, či server pošle príkaz REGISTRÁCIA čo naznačuje, že sa niekto pripojil k serveru. Potom extrahujeme nick, skontrolujeme, či nick nie je IRC url (ak nie, hneď ako spustíme robota, pozdraví url) a nakoniec pošleme pozdravnú správu.

Príkazy robota:

Teraz, ako si vyrobím robota reagovať na moje vlastné príkazy? Pozrime sa radšej na príklad:

[code] if line [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kód]

V tomto príklade, ak niekto píše $ verzia robot zobrazí správu s uvedením jeho mena, verzie a autora. Celý kód príkladu je tento:

[code] import soketu
reťazec na import

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Domov»
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 ("PRIPOJENIE:% s \ r \ n"% ZMENA)

zatiaľ čo 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pre line in temp:
riadok tlače
riadok = string.rstrip (riadok)
line = line.split (CHAN + ':')

ak riadok [0] .find ("PING")! = -1:
pingid = riadok [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

ak riadok [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] ak name! = NICK a name.find (HOST) == -1:
s.send ("PRIVMSG% s: Vitajte @% s ^^ \ n"% (CHAN, meno))

ak len (riadok) <1:
ak riadok [1] == '$ verzia':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kód]

Dúfam, že sa vám tento návod páčil, a samozrejme vám nechám odkaz na kód môjho robota, aby ste videli celý jeho kód a lepšie videli, ako funguje (aj keď som odstránil niektoré príkazy pre osobné použitie).

CalicoBot