[Python] Programmer en bot for IRC

I dag skal jeg lære deg hvordan du programmerer en bot til IRC. For det første, for de som ikke vet, er en bot et program som kobles til en IRC-kanal og samhandler med den, som for eksempel lar oss moderere kanalen uten at vi er koblet sammen og dermed unngå spam, eller at den gjenkjenner en rekke ordrer og utfører den tilsvarende koden.
Selv om det allerede er roboter klare, er jeg ærlig talt en av dem som liker å lage sine egne programmer for å lære og den store tilfredsstillelsen det gir oss etter å ha sett at det fungerer ^^

Med det sagt, la oss gå videre til opplæringen.

For å programmere boten trenger vi en ren tekstredigerer noen (nano, gedit, medit, osv.) og pythontolker (2.6 eller 2.7 vil være nødvendig, fungerer ikke med python 3.x).

Først importerer vi nødvendige moduler, i dette tilfellet trenger vi bare to:

[kode] #! / usr / bin / env python
# - * - koding: utf-8 - * -

importkontakt
importer streng
[/ Code]

NÃ¥ fortsetter vi til sette opp boten:

[kode] HOST=»irc.desdelinux.nett"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Hjem»
readbuffer = »»
[/ Code]

Jeg vil forklare hver variabel:

  • HOST: URL-en til serveren vi skal koble til
  • HAVN: Serverporten. Som standard er det 6667.
  • NICK, IDENT og REALNAME: De tilsvarer botens kallenavn, dens identifikasjon og det virkelige navnet.
  • CHAN: Kanalen boten vil gÃ¥ inn i
  • lesebuffer: I denne variabelen lagres dataene som serveren sender.

NÃ¥r bot er konfigurert, fortsetter vi til forbindelsen

[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)
[/ Code]

Den første linjen har ikke mye mysterium, den andre skaper serverforbindelse og de tre siste sender botens data til serveren for å fortsette med påloggingen.

Når vi er koblet til, vil vi opprette en Uendelig løkke der vi skal gå motta og sende data fra / til serveren:

[kode] mens 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
for linje i temp:
linje = streng.rstrip (linje)
line = line.split (CHAN + ':')

hvis linje [0] .find ("PING")! = -1:
pingid = linje [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]

Av alle linjene som er skrevet ovenfor, vil jeg bare kommentere de viktige.
med line = line.split (CHAN + ':') hva vi gjør er å dele hva serveren sender oss når la oss få noe fra kanalen.
For eksempel indikerer følgende linje at noen skrev noe på kanalen:

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

Den første er brukerens kallenavn og tilkoblingsdata (atskilt med!), Kommandoen (i dette tilfellet indikerer at han skrev), kanalen og til slutt, etter kolon, meldingen sendt. Jeg vil ikke forklare mange flere kommandoer siden det ikke faller inn under denne opplæringen.

De andre viktige linjene er de de er ute etter if. Serveren sender så ofte PING-kommandoen for å sjekke om brukeren fortsatt er tilkoblet. I så fall sender boten PONG-kommandoen med en ID som PING sendte for å indikere til serveren at den fortsatt er tilkoblet.

Med dette har vi allerede bunnen av boten. Nå skal jeg fortsette med å forklare hvordan jeg får boten til å svare i henhold til det vi ønsker på bestemte kommandoer, enten de er fra IRC selv eller fra brukere.

Svar på IRC-kommandoer:

PING og PRIVMSG er eksempler på IRC-kommandoer. Det er mange kommandoer, men som jeg sa tidligere, er det noe jeg ikke vil gå i detalj om.
For eksempel kan vi få bot til å si hei til brukere som kobler seg til:

[kode] hvis linje [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Velkommen @% s ^^ \ n"% (CHAN, navn))
[/ Code]

Først sjekker vi om serveren sender kommandoen BLI som indikerer at noen er koblet til serveren. Så trekker vi ut kallen, vi sjekker at kallen ikke er IRC-url (hvis ikke så snart vi kjører boten, vil den hilse på url) og til slutt sender vi hilsen.

Bot-kommandoer:

Nå hvordan lager jeg min bot svare på mine egne kommandoer? La oss bedre se på et eksempel:

[kode] hvis linje [1] == '$ versjon':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

I dette eksemplet hvis noen skriver $ versjon boten vil vise meldingen med navn, versjon og forfatter. Den komplette koden i eksemplet er denne:

[kode] importkontakt
importer streng

VERT = »lokal vert»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Hjem»
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)

mens 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
for linje i temp:
utskriftslinje
linje = streng.rstrip (linje)
line = line.split (CHAN + ':')

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

hvis linje [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Velkommen @% s ^^ \ n"% (CHAN, navn))

hvis len (linje) <1:
if line [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Jeg håper du likte denne veiledningen, og selvfølgelig lar jeg deg lenken til koden til boten min, slik at du kan se koden i sin helhet, og du kan se bedre hvordan den fungerer (selv om jeg har fjernet noen kommandoer for personlig bruk).

CalicoBot