[Python] Programoni një bot për IRC

Sot unë do t'ju mësoj se si të programoni një bot para irc. Së pari, për ata që nuk e dinë, një bot është një program që lidhet me një kanal IRC dhe bashkëvepron me të, i cili na lejon, për shembull, të moderojmë kanalin pa që jemi të lidhur dhe kështu shmangni postën e bezdisshme, ose që njeh një seri urdhrash dhe ekzekuton kodin përkatës.
Megjithëse tashmë ka gati bot, unë sinqerisht jam një nga ata që duan të bëjnë programet e tyre për të mësuar dhe kënaqësinë e madhe që na jep pasi të shohim se funksionon ^^

Me këtë tha, le të kalojmë në tutorial.

Për të programuar botin do të na duhet një redaktues teksti i thjeshtë cualquiera (nano, gedit, medit, etj) dhe interpretues python (2.6 ose 2.7 do të jetë e nevojshme, nuk punon me pitonin 3.x).

Së pari ne importojmë modulet e kërkuara, në këtë rast do të na duhen vetëm dy:

[kodi] #! / usr / bin / env python
# - * - kodimi: utf-8 - * -

fole importi
importo vargun
[/ kodi]

Tani vazhdojmë të ngritur bot:

[kodi] HOST=»irc.desdelinux.neto"
PORTI = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Shtëpia»
lexues = "»
[/ kodi]

Unë do të shpjegoj çdo ndryshore:

  • MIKPRITËS: URL e serverit me të cilin do të lidhemi
  • PORTI: Porta e serverit. Si parazgjedhje është 6667.
  • NICK, IDENT dhe REALNAME: Ato korrespondojnë me nofkën e botit, identifikimin e tij dhe emrin e vërtetë.
  • CHAN: Kanali në të cilin bot do të hyjë
  • lexues: Në këtë variabël të dhënat e dërguara nga serveri do të ruhen.

Pasi të konfigurohet boti ynë, vazhdojmë lidhja

[kodi] s = socket.socket ()
s.lidhni ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("P USRDORUESI% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)
[/ kodi]

Linja e parë nuk ka shumë mister, e dyta krijon lidhja e serverit dhe tre të fundit dërgojnë të dhënat e botit në server për të vazhduar me hyrjen.

Pasi të lidhemi do të krijojmë një Lak i pafund në të cilën do të shkojmë marrja dhe dërgimi i të dhënave nga / në server:

[kodi] ndërsa 1:
lexues = lexues + s.recv (1024)
temp = string.split (lexuesi, "\ n")
lexues = temp.pop ()
për linjën në temp:
rresht = varg. rrip (rresht)
rreshti = rreshti. ndarja (CHAN + ':')

nëse rreshti [0]. gjeni ("PING")! = -1:
pingid = rreshti [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kodi]

Nga të gjitha rreshtat e shkruar më sipër, unë do të komentoj vetëm ato të rëndësishme.
me rresht = rresht.split (CHAN + ':') ajo që bëjmë është të ndajmë atë që na dërgon serveri kur le të marrim diçka nga kanali.
Për shembull, rreshti i mëposhtëm tregon se dikush ka shkruar diçka në kanal:

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

E para është pseudonimi i përdoruesit dhe të dhënat e lidhjes (të ndara nga!), Komanda (në këtë rast tregon se ai shkroi), kanali dhe më në fund, pas zorrës së trashë, mesazhi i dërguar. Unë nuk do të shpjegoj shumë komanda të tjera pasi që nuk bie brenda këtij udhëzuesi.

Linjat e tjera të rëndësishme janë ato ata janë pas nëse. Serveri shpesh dërgon komandën PING për të kontrolluar nëse përdoruesi është akoma i lidhur. Në këtë rast, bot dërgon komandën PONG me një ID që PING ka dërguar për të treguar te serveri se është akoma i lidhur.

Me këtë tashmë kemi bazën e botit. Tani do të vazhdoj të shpjegoj se si ta bëjmë botin të përgjigjet në përputhje me ato që duam për komanda të caktuara, qofshin ato nga vetë IRC apo nga përdoruesit.

Duke iu përgjigjur komandave të IRC:

PING dhe PRIVMSG janë shembuj të komandave IRC. Ka shumë komanda, por siç thashë edhe më parë, është diçka për të cilën nuk do të shkoj në detaje.
Për shembull, ne mund ta bëjmë botin të përshëndetet për përdoruesit që lidhen:

[kodi] nëse rreshti [0]. gjeni ('JOIN')! = -1:
name = rreshti [0] .split ('!') [0] .split (':') [1] nëse emri! = NICK dhe name.find (HOST) == -1:
s.send ("PRIVMSG% s: Mirësevini @% s ^^ \ n"% (CHAN, emri))
[/ kodi]

Së pari ne kontrollojmë nëse serveri dërgon komandën BASHKOHU që tregon se dikush është lidhur me serverin. Pastaj ne nxjerrim nick, ne kontrollojmë që pseudonimi nuk është url urc (nëse jo sa më shpejt që të ekzekutojmë botin, ai do të përshëndesë url) dhe së fundmi dërgojmë mesazhin e përshëndetjes.

Komandat Bot:

Tani si ta bëj bot-in tim përgjigjuni urdhërimeve të mia? Le të shohim më mirë një shembull:

[kodi] nëse rreshti [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Lidhja e Sonit \ n»% CHAN)
[/ kodi]

Në këtë shembull nëse dikush shkruan versioni $ bot do të tregojë mesazhin që tregon emrin, versionin dhe autorin e tij. Kodi i plotë i shembullit është ky:

[kodi] fole importi
importo vargun

HOST = »localhost»
PORTI = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Shtëpia»
lexues = "»
s = fole. fole ()
s.lidhni ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("P USRDORUESI% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)

ndërsa 1:

lexues = lexues + s.recv (1024)
temp = string.split (lexuesi, "\ n")
lexues = temp.pop ()
për linjën në temp:
linja e shtypjes
rresht = varg. rrip (rresht)
rreshti = rreshti. ndarja (CHAN + ':')

nëse rreshti [0]. gjeni ("PING")! = -1:
pingid = rreshti [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

nëse rreshti [0]. gjeni ('JOIN')! = -1:
name = rreshti [0] .split ('!') [0] .split (':') [1] nëse emri! = NICK dhe name.find (HOST) == -1:
s.send ("PRIVMSG% s: Mirësevini @% s ^^ \ n"% (CHAN, emri))

nëse len (vija) <1:
nëse rreshti [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Lidhja e Sonit \ n»% CHAN)
[/ kodi]

Shpresoj që ju pëlqeu ky tutorial, dhe natyrisht, ju lë lidhjen me kodin e botit tim, në mënyrë që të shihni kodin e tij të plotë dhe të shihni më mirë se si funksionon (megjithëse kam hequr disa komanda për përdorim personal).

CalicoBot


Shto si burim të preferuar