[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:

[code] HOST=»irc.desdelinux.net»
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:

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


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   auroszx sa

    Heh, jeg kunne ikke savne Bot of the bullshit du kjører på IRC 😛 Veldig interessant artikkel.

  2.   Slutt sa

    Veldig enkel og tydelig forklaring.
    Hva om, python-koden mangler all fordypningen.

  3.   Rafa sa

    Utmerket artikkel og hvor enkelt det er å koble til en IRC for å programmere en bot:) ...

    Det minner meg om de gangene da vi følte at programmerere skrev skript for mIRC i chatter på MSN eller MSNGroups.

  4.   truko22 sa

    Interessant jeg beholder det 😀

  5.   Genesis Vargas J. (@elprincipiodeto) sa

    excellent!

  6.   elynx sa

    Veldig nyttig, takk Son_Link!

    Greetings!

  7.   dbillyx sa

    Jubel…

    å følge linjene dine og teste det eneste som fungerer er
    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% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("JOIN:% srn"% CHAN)

    endre kanal og nick nå nedenfor kaster meg feilsyntaks

    Jeg spurte andre bekjente, og de fortalte meg at det ikke ser ut som python

    Jeg vet ikke hva jeg gjør galt, eller hvorfor jeg kopierer alt og limer det inn i python og gir det inn, og det kobles til kanalen, men etter 250 sekunder fjerner kanalen det fordi det ikke var noe svar fra pong ...

  8.   pinnesteik sa

    Den komplette koden fungerer ikke for meg, det siste avsnittet er det som mislykkes, og jeg finner ikke feilen. Hvis jeg sletter den delen, kobles den sammen og fungerer perfekt. Testet med Python 2.7.3 på Windows 7.

    PS: I mitt tilfelle kobler jeg til en server med passord og legger til disse linjene:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Delfin sa

    Hei Son Link, tusen takk for artikkelen, den er veldig interessant, jeg kan ikke svare på sendte kommandoer. Programmet går ikke inn i det siste hvis, og jeg kan ikke finne ut hvorfor: "hvis len (linje)> 1:"
    Jeg venter på ditt svar.
    Takk