[Python] Programirajte bota za IRC

Danas ću vas naučiti kako programirati a bot za IRC. Prije svega, za one koji ne znaju, bot je program koji se povezuje s IRC kanalom i komunicira s njim, što nam omogućuje, na primjer, moderiranje kanala bez da smo povezani i na taj način izbjeći neželjenu poštu ili da prepozna niz naloga i izvrši odgovarajući kod.
Iako već postoje botovi, iskreno sam jedan od onih koji vole stvarati vlastite programe za učenje i veliko zadovoljstvo koje nam pruža nakon što vidi da to radi ^^

Uz to, prijeđimo na tutorial.

Za programiranje bota trebat će nam urednik običnog teksta cualquiera (nano, gedit, medit, itd.) i tumač pythona (Bit će potrebno 2.6 ili 2.7, ne radi s pythonom 3.x).

Prvo uvozimo potrebni moduli, u ovom slučaju trebat će nam samo dva:

[kod] #! / usr / bin / env python
# - * - kodiranje: utf-8 - * -

uvozna utičnica
uvozni niz
[/ code]

Sada nastavljamo do postaviti bot:

[kod] HOST=»irc.desdelinux.neto"
LUKA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Početna»
readbuffer = »»
[/ code]

Objasnit ću svaku varijablu:

  • DOMAĆIN: URL poslužitelja na koji ćemo se povezati
  • LUKA: Port poslužitelja. Po defaultu je 6667.
  • NIK, IDENTITET I PRAVO IME: Odgovaraju nadimku bota, njegovoj identifikaciji i pravom imenu.
  • CHAN: Kanal u koji će bot ući
  • čitač: U ovoj će se varijabli podaci koje šalje poslužitelj spremiti.

Jednom kada je naš bot konfiguriran, nastavljamo s vezu

[kod] s = socket.socket ()
s.povezati ((HOST, LUKA))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("KORISNIK% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("PRIDRUŽITE SE:% s \ r \ n"% CHAN)
[/ code]

Prvi redak nema puno tajne, drugi stvara veza s poslužiteljem a posljednja tri šalju podatke bota na poslužitelj kako bi nastavili s prijavom.

Jednom kad se povežemo, stvorit ćemo Beskonačna petlja u koju ćemo ići primanje i slanje podataka s / na poslužitelj:

[kod] dok 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
za liniju u temp:
linija = string.rstrip (linija)
linija = line.split (CHAN + ':')

ako je linija [0] .nađi ("PING")! = -1:
pingid = linija [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ code]

Od svih gore napisanih redaka, komentirat ću samo one važne.
s linija = linija.split (CHAN + ':') ono što radimo je podijeliti ono što nam poslužitelj šalje kada uzmimo nešto s kanala.
Na primjer, sljedeći redak označava da je netko napisao nešto na kanalu:

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

Prvi je korisnikov nadimak i podaci o vezi (odvojeni znakom!), Naredba (u ovom slučaju to znači da je napisao), kanal i na kraju, nakon dvotačke, poruka poslana. Neću objašnjavati još puno naredbi jer to ne spada u ovaj vodič.

Ostale su važne crte one su nakon if. Poslužitelj svako toliko šalje naredbu PING da provjeri je li korisnik još uvijek povezan. U tom slučaju, bot šalje naredbu PONG s ID-om koji je PING poslao da naznači poslužitelju da je još uvijek povezan.

S ovim već imamo bazu bota. Sada ću nastaviti objašnjavati kako natjerati bota da odgovara prema onome što želimo na određene naredbe, bilo da su od samog IRC-a ili od korisnika.

Odgovor na IRC naredbe:

PING i PRIVMSG primjeri su IRC naredbi. Postoji mnogo naredbi, ali kao što sam već rekao, to je nešto o čemu neću ulaziti u detalje.
Na primjer, možemo natjerati bota da pozdravi korisnike koji se povezuju:

[kod] ako je linija [0] .find ('PRIDRUŽI SE')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK i name.find (HOST) == -1:
s.send ("PRIVMSG% s: Dobrodošli @% s ^^ \ n"% (CHAN, ime))
[/ code]

Prvo provjeravamo šalje li poslužitelj naredbu PRIDRUŽITE što znači da se netko povezao s poslužiteljem. Zatim izvadimo nadimak, provjeravamo da nadimak nije IRC URL (ako ne čim pokrenemo bota, pozdravit će url) i na kraju šaljemo pozdravnu poruku.

Naredbe bota:

Sad kako mogu napraviti svog bota odgovoriti na moje vlastite naredbe? Pogledajmo bolje primjer:

[code] if line [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Sin Link \ n»% CHAN)
[/ code]

U ovom primjeru ako netko piše $ verzija bot će prikazati poruku koja navodi njegovo ime, verziju i autora. Kompletni kod primjera je sljedeći:

[kod] utičnica za uvoz
uvozni niz

HOST = »localhost»
LUKA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Početna»
readbuffer = »»
s = socket.socket ()
s.povezati ((HOST, LUKA))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("KORISNIK% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("PRIDRUŽITE SE:% s \ r \ n"% CHAN)

dok 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
za liniju u temp:
linija za ispis
linija = string.rstrip (linija)
linija = line.split (CHAN + ':')

ako je linija [0] .nađi ("PING")! = -1:
pingid = linija [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

ako je linija [0] .nađi ('PRIDRUŽI SE')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK i name.find (HOST) == -1:
s.send ("PRIVMSG% s: Dobrodošli @% s ^^ \ n"% (CHAN, ime))

ako je len (linija) <1:
ako je linija [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Sin Link \ n»% CHAN)
[/ code]

Nadam se da vam se svidio ovaj tutorial, i naravno, ostavljam vam vezu do koda mog bota kako biste mogli vidjeti njegov kôd u cijelosti i kako biste mogli bolje vidjeti kako to radi (iako sam uklonio neke naredbe za osobnu upotrebu).

CalicoBot


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   auroszx dijo

    Heh, nisam mogao propustiti Bota sranja kojim se voziš na IRC-u 😛 Vrlo zanimljiv članak.

  2.   Prestati dijo

    Vrlo jednostavno i jasno objašnjenje.
    Što ako, python kodu nedostaju sva udubljenja.

  3.   Rafa dijo

    Izvrstan članak i kako se lako povezati s IRC-om za programiranje bota:) ...

    Podsjeća me na ona vremena kad smo se osjećali kao programeri koji u chatovima na MSN-u ili MSNGroupama pišu skripte za mIRC.

  4.   truko22 dijo

    Zanimljivo čuvam ga 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    izvrsna!

  6.   elynx dijo

    Vrlo korisno, hvala Son_Link!

    Pozdrav!

  7.   dbillyx dijo

    Živjeli…

    slijedeći vaše linije i testirajući jedino što djeluje je
    uvozna utičnica
    uvozni niz

    HOST = »localhost»
    LUKA = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Početna»
    readbuffer = »»
    s = socket.socket ()
    s.povezati ((HOST, LUKA))
    s.send ("NICK% srn"% NICK)
    s.send ("KORISNIK% s% s bla:% srn"% (IDENT, HOST, PRAVO IME))
    s.send ("PRIDRUŽI SE:% srn"% CHAN)

    promjena kanala i nadimak sada dolje baca mi sintaksu pogreške

    Pitao sam druge poznanike i oni mi kažu da to ne izgleda kao python

    Ne znam u čemu griješim ili zašto sve kopiram i zalijepim u python i dam da uđe i poveže se s kanalom, ali nakon 250 sekundi kanal ga uklanja jer nije bilo odgovora od pong-a ...

  8.   prženica dijo

    Kompletni kod mi ne radi, zadnji odlomak je ono što ne uspije i ne mogu pronaći pogrešku. Ako izbrišem taj dio, on se povezuje i savršeno funkcionira. Testirano s Pythonom 2.7.3 na sustavu Windows 7.

    PS: U mom slučaju povezujem se s poslužiteljem lozinkom i dodajem ove retke:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Dupin dijo

    Bok, Son Link, hvala ti puno na članku, vrlo je zanimljiv, jednostavno ne mogu odgovoriti na poslane naredbe. Program ne ulazi u posljednje ako i ne mogu shvatiti zašto: "if len (line)> 1:"
    Čekam tvoj odgovor.
    hvala