[Python] Programirajte bota za IRC

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

Uz to, prijeđimo na tutorial.

Za programiranje bota trebat će nam urednik običnog teksta cualquiera (nano, gedit, medit, itd.) y el python interpreter (Bit će potrebno 2.6 ili 2.7, ne radi s python 3.x).

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

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

utičnica za uvoz
string za uvoz
[/ kod]

Sada nastavljamo sa postaviti bot:

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

Objasnit ću svaku varijablu:

  • HOST: URL servera na koji ćemo se povezati
  • LUKA: Port poslužitelja. Po defaultu je 6667.
  • NIK, IDENTITET I PRAVO IME: Oni odgovaraju nadimku bota, njegovoj identifikaciji i pravom imenu.
  • CHAN: Kanal u koji će bot ući
  • međuspremnik za čitanje: U ovoj varijabli podaci koji ih šalje poslužitelj bit će spremljeni.

Jednom kada je naš bot konfiguriran, nastavljamo vezu

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

Prvi redak nema puno misterije, drugi stvara veza sa serverom a posljednja tri šalju podatke bota na server kako bi nastavili s prijavom.

Jednom kad se povežemo, kreiraćemo a Beskonačna petlja u koji ćemo ići primanje i slanje podataka sa / na server:

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

Od svih gore napisanih redova, komentirat ću samo važne.
con linija = line.split (CHAN + ':') ono što radimo je podijeliti ono što nam server š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 ^^

Prva 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 linije oni 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 serveru da je i dalje povezan.

Ovim već imamo bazu bota. Sada ću nastaviti objašnjavati kako natjerati bota da reaguje kako želimo na određene naredbe, bilo od samog IRC-a ili od korisnika.

Odgovor na IRC naredbe:

PING i PRIVMSG su primjeri 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]. pronađ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))
[/ kod]

Prvo provjeravamo šalje li server naredbu JOIN što ukazuje da se neko povezao sa serverom. Zatim izvadimo nadimak, provjeravamo da nadimak nije IRC URL (ako ne čim pokrenemo bota, pozdravit će url) i na kraju šaljemo pozdravnu poruku.

Bot naredbe:

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

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

U ovom primjeru ako neko 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
string za uvoz

HOST = »localhost»
LUKA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Početna»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, LUKA))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("KORISNIK% s% s bla:% s \ r \ n"% (IDENT, HOST, PRAVO IME))
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:
if line [1] == '$ verzija':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Sin Link \ n»% CHAN)
[/ kod]

Nadam se da vam se svidio ovaj vodič, i naravno, ostavljam vam vezu do koda mog bota kako biste mogli vidjeti njegov kôd u potpunosti i kako biste mogli bolje vidjeti kako to funkcionira (iako sam uklonio neke naredbe za ličnu upotrebu).

CalicoBot


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  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 obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   auroszx rekao je

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

  2.   Cesar rekao je

    Vrlo jednostavno i jasno objašnjenje.
    Što ako, python kodu nedostaju sve uvlake.

  3.   rafa rekao je

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

    Podsjeća me na ona vremena kada smo se osjećali kao programeri koji pišu skripte za mIRC u MSN ili MSNGroups chatovima

  4.   truko22 rekao je

    Zanimljivo čuvam je 😀

  5.   Genesis Vargas J. (@elprincipiodeto) rekao je

    odlično!

  6.   elynx rekao je

    Vrlo korisno, hvala Son_Link!

    Pozdrav!

  7.   dbillyx rekao je

    Živjeli…

    prateći vaše linije i testirajući jedino što funkcionira je
    utičnica za uvoz
    string za uvoz

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

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

    Pitao sam druge poznanike i kažu mi da to ne liči na 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.   pinfry rekao je

    Kompletni kod mi ne funkcionira, zadnji paragraf je ono što ne uspije i ne mogu pronaći grešku. Ako izbrišem taj dio, on se povezuje i savršeno funkcionira. Testirano sa Python 2.7.3 na Windows 7.

    PS: U mom slučaju povežem se na server lozinkom i dodam ove redove:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   DoLpHiN rekao je

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