[Python] Programmeerige IRC jaoks bot

Täna õpetan teile, kuidas programmeerida a bot para IRC. Esiteks, neile, kes ei tea, on bot programm, mis ühendub IRC kanaliga ja suhtleb sellega, mis võimaldab meil näiteks kanalit modereerida ilma et me oleme ühendatud ja seega vältida rämpsposti või et see tuvastab rea tellimusi ja täidab vastava koodi.
Kuigi robotid on juba valmis, olen ausalt üks neist, kellele meeldib ise õppimiseks programme teha ja see pakub meile suurt rahulolu pärast seda, kui näeme, et see töötab ^^

Seda öeldes liigume õpetuse juurde.

Boti programmeerimiseks vajame a lihttekstiredaktor cualquiera (nano, gedit, mediteerimine jne) ja pythoni tõlk (Vajalik on 2.6 või 2.7, ei tööta Python 3.x-ga).

Kõigepealt impordime vajalikud moodulid, sel juhul vajame ainult kahte:

[kood] #! / usr / bin / env python
# - * - kodeerimine: utf-8 - * -

impordipesa
impordistring
[/ kood]

Nüüd jätkame üles seadma bot:

[kood] HOST=»irc.desdelinux.net»
SADAM = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Avaleht»
readbuffer = »»
[/ kood]

Seletan iga muutujat:

  • HOST: Serveri URL, millega me ühenduse loome
  • SADAM: Serveri port. Vaikimisi on see 6667.
  • NICK, IDENT ja REALNAME: Need vastavad roboti hüüdnimele, selle identifitseerimisele ja tegelikule nimele.
  • VAHETA: Kanal, kuhu robot siseneb
  • lugeja: Sellesse muutujasse salvestatakse serveri saadetud andmed.

Kui meie bot on konfigureeritud, jätkame ühendus

[kood] s = pesa.pesa ()
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 ("LIITU:% s \ r \ n"% CHAN)
[/ kood]

Esimesel real pole palju saladust, teisel tekib serveri ühendus ja viimased kolm saadavad sisselogimise jätkamiseks roboti andmed serverisse.

Kui ühendus on loodud, loome a Lõputu silmus milles me läheme andmete vastuvõtmine ja serverist saatmine:

[kood] samas 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
temperatuuri rea jaoks:
rida = string.rstrip (rida)
rida = line.split (CHAN + ':')

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

Kõigist ülal kirjutatud ridadest kommenteerin ainult olulisi.
koos line = line.split (CHAN + ':') jagame selle, mida server meile saadab saame kanalilt midagi.
Näiteks järgmine rida näitab, et keegi kirjutas kanalile midagi:

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

Esimene asi on kasutaja hüüdnimi ja tema ühenduse andmed (eraldatud tähega!), Käsk (antud juhul näitab see, et ta kirjutas), kanal ja lõpuks pärast koolonit saadetud sõnum. Ma ei selgita palju rohkem käske, kuna see ei kuulu selle õpetuse alla.

Teised olulised jooned on need on pärast if. Server saadab nii sageli PING-käsu, et kontrollida, kas kasutaja on endiselt ühendatud. Sellisel juhul saadab bot käsu PONG ID-ga, mille PING saatis serverile, et see on endiselt ühendatud.

Sellega on meil juba botipõhi olemas. Nüüd hakkan selgitama, kuidas panna robot reageerima vastavalt sellele, mida me soovime teatud käskudele, olgu need siis IRC enda või kasutajate käest.

IRC käskudele reageerimine:

IRC käskude näited on PING ja PRIVMSG. Käske on palju, kuid nagu ma varem ütlesin, on see midagi, mida ma ei hakka üksikasjalikumalt käsitlema.
Näiteks võime panna bot ütlema kasutajatele, kes ühendavad, tere öelda:

[kood] kui rida [0] .find ('LIITU')! = -1:
nimi = rida [0] .split ('!') [0] .split (':') [1] kui nimi! = NICK ja nimi.leidke (HOST) == -1:
s.send ("PRIVMSG% s: Tere tulemast @% s ^^ \ n"% (CHAN, nimi))
[/ kood]

Kõigepealt kontrollime, kas server saadab käsu LIITU mis näitab, et keegi on serveriga ühendatud. Seejärel eraldame hüüdnime, kontrollime, kas hüüdnimi ei ole IRC URL (kui mitte niipea, kui bot käivitame, tervitab see URL-i) ja lõpuks saadame tervitussõnumi.

Boti käsud:

Kuidas ma nüüd oma roboti valmistan vasta minu enda käskudele? Vaatame parem näidet:

[kood], kui rida [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kood]

Selles näites, kui keegi kirjutab $ versioon robot kuvab sõnumi, mis näitab tema nime, versiooni ja autorit. Näite täielik kood on järgmine:

[kood] impordipesa
impordistring

HOST = »kohalik host»
SADAM = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Avaleht»
readbuffer = »»
s = pistikupesa.pesa ()
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 ("LIITU:% s \ r \ n"% CHAN)

samas 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
temperatuuri rea jaoks:
trükirida
rida = string.rstrip (rida)
rida = line.split (CHAN + ':')

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

kui rida [0] .find ('LIITU')! = -1:
nimi = rida [0] .split ('!') [0] .split (':') [1] kui nimi! = NICK ja nimi.leidke (HOST) == -1:
s.send ("PRIVMSG% s: Tere tulemast @% s ^^ \ n"% (CHAN, nimi))

kui len (rida) <1:
kui rida [1] == '$ versioon':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kood]

Loodan, et teile meeldis see õpetus ja loomulikult jätan teile lingi oma roboti koodile, et näeksite selle koodi täielikult ja näeksite paremini, kuidas see töötab (kuigi olen mõned käsud isiklikuks kasutamiseks eemaldanud).

CalicoBot


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   auroszx DIJO

    Heh, ma ei saanud mööda vaadata selle jama botist, millega sa IRC-s sõidad 😛 Väga huvitav artikkel.

  2.   Cesar DIJO

    Väga lihtne ja selge selgitus.
    Mis siis, kui Pythoni koodil puudub kogu taane.

  3.   rafa DIJO

    Suurepärane artikkel ja kui lihtne on roboti programmeerimine IRC-ga ühenduse loomiseks:)…

    See tuletab mulle meelde neid aegu, kui tundsime, et programmeerijad kirjutavad MSN või MSNGroups vestlustes skripte mIRC jaoks

  4.   truko22 DIJO

    Huvitav, hoian seda 😀

  5.   Genesis Vargas J. (@elprincipiodeto) DIJO

    väga hea!

  6.   elynx DIJO

    Väga kasulik, aitäh Son_Link!

    Tervitused!

  7.   kõhuvalu DIJO

    Terviseks ...

    oma joonte järgimine ja ainus toimiv testimine on
    impordipesa
    impordistring

    HOST = »kohalik host»
    SADAM = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Avaleht»
    readbuffer = »»
    s = pistikupesa.pesa ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("LIITU:% srn"% CHAN)

    kanali ja hüüdi vahetamine viskab mulle allpool vea süntaksi

    Küsisin teistelt tuttavatelt ja nad ütlevad mulle, et see ei tundu python

    Ma ei tea, mida ma valesti teen või miks ma kõik kopeerin ja kleepin pythoni ning annan sisendi ja see ühendub kanaliga, kuid 250 sekundi pärast eemaldab kanal selle, sest pongilt ei tulnud vastust ...

  8.   pinfry DIJO

    Täielik kood ei tööta minu jaoks, viimane lõik on see, mis ebaõnnestub ja ma ei leia viga. Kui kustutan selle osa, siis see ühendub ja töötab ideaalselt. Testitud Windows 2.7.3-s Python 7-ga.

    PS: Minu puhul ühendan parooliga server ja lisan järgmised read:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Delfiin DIJO

    Tere, Son Link, tänan teid väga artikli eest, see on väga huvitav, ma lihtsalt ei oska saadetud käskudele vastata. Programm ei lähe viimasesse, kui ja ma ei saa aru, miks: "kui len (rida)> 1:"
    Ootan teie vastust.
    tänan