[Python] Programmer en bot til IRC

I dag skal jeg lære dig at programmere en bot para IRC. For det første er en bot for dem, der ikke ved, et program, der forbinder til en IRC-kanal og interagerer med den, så vi f.eks. Kan moderere kanalen uden at vi er forbundet og dermed undgå spam, eller at den genkender en række ordrer og udfører den tilsvarende kode.
Selvom der allerede er bots klar, er jeg ærligt talt en af ​​dem, der kan lide at lave deres egne programmer til at lære og den store tilfredshed, det giver os efter at have set, at det fungerer ^^

Med det sagt, lad os gå videre til vejledningen.

For at programmere bot har vi brug for en almindelig teksteditor cualquiera (nano, gedit, medit osv.) og pythontolker (2.6 eller 2.7 vil være nødvendigt, fungerer ikke med python 3.x).

Først importerer vi krævede moduler, i dette tilfælde har vi kun brug for to:

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

importstik
importstreng
[/kode]

Nu går vi videre til opsæt bot:

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

Jeg vil forklare hver variabel:

  • HOST: URL'en til den server, som vi opretter forbindelse til
  • HAVN: Serverporten. Som standard er det 6667.
  • NICK, IDENT og REALNAME: De svarer til botens kaldenavn, dens identifikation og det rigtige navn.
  • CHAN: Kanalen, som boten vil komme ind pÃ¥
  • læsebuffer: I denne variabel gemmes de data, der sendes af serveren.

Når vores bot er konfigureret, fortsætter vi til forbindelsen

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

Den første linje har ikke meget mysterium, den anden skaber serverforbindelse og de sidste tre sender botens data til serveren for at fortsætte med login.

Når forbindelsen er oprettet, opretter vi en Uendelig løkke hvor vi vil gå modtagelse og afsendelse af data fra / til serveren:

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

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

Af alle ovenstående linjer vil jeg kun kommentere de vigtige.
med line = line.split (CHAN + ':') hvad vi gør er at opdele, hvad serveren sender os hvornår lad os få noget fra kanalen.
For eksempel angiver følgende linje, at nogen skrev noget på kanalen:

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

Den første er brugerens kaldenavn og forbindelsesdata (adskilt af!), Kommandoen (i dette tilfælde indikerer det, at han skrev), kanalen og endelig, efter kolon, sendte beskeden. Jeg vil ikke forklare mange flere kommandoer, da det ikke falder ind under denne tutorial.

De andre vigtige linjer er dem er efter if. Serveren sender så ofte PING-kommandoen for at kontrollere, om brugeren stadig er forbundet. I så fald sender boten PONG-kommandoen med et ID, som PING sendte for at indikere til serveren, at den stadig er tilsluttet.

Med dette har vi allerede bunden af ​​bot. Nu vil jeg fortsætte med at forklare, hvordan man får boten til at reagere, som vi ønsker, på bestemte kommandoer, hvad enten det er fra IRC selv eller fra brugere.

Svar på IRC-kommandoer:

PING og PRIVMSG er eksempler på IRC-kommandoer. Der er mange kommandoer, men som jeg sagde før, er det noget, jeg ikke vil gå i detaljer om.
For eksempel kan vi få bot til at sige hej til brugere, der opretter forbindelse:

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

Først kontrollerer vi, om serveren sender kommandoen JOIN hvilket indikerer, at nogen har forbindelse til serveren. Derefter trækker vi ud nick, kontrollerer vi, at nick ikke er IRC-url (hvis ikke så snart vi kører bot, hilser den på url) og til sidst sender vi hilsen.

Bot-kommandoer:

Nu hvordan laver jeg min bot svare på mine egne kommandoer? Lad os se bedre på et eksempel:

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

I dette eksempel, hvis nogen skriver $version bot viser meddelelsen med navn, version og forfatter. Den komplette kode i eksemplet er denne:

[kode] importstik
importstreng

VÆRT = »localhost»
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:
udskriv linje
line = string.rstrip (line)
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:
hvis linje [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/kode]

Jeg håber, du kunne lide denne tutorial, og selvfølgelig forlader jeg dig linket til koden til min bot, så du kan se dens kode fuldt ud, og du kan bedre se, hvordan den fungerer (selvom jeg har fjernet nogle kommandoer til personlig brug).

CalicoBot