[Python] Naprogramujte robota pre IRC

Dnes vás naučím programovať a Bot pre IRC. Najskôr pre tých, ktorí to nevedia, je robot program, ktorý sa pripája k IRC kanálu a interaguje s ním, čo nám umožňuje napríklad moderovať kanál bez že sme spojení a vyhnúť sa tak spamu alebo že rozpozná sériu príkazov a vykoná zodpovedajúci kód.
Aj keď už sú roboti pripravení, som úprimne jedným z tých, ktorí si radi pripravujú svoje vlastné programy na učenie a veľkú spokojnosť, ktorú nám poskytujú, keď videli, že to funguje ^ ^

Po tomto prejdime k výučbe.

Na programovanie robota budeme potrebovať a obyčajný textový editor akýkoľvek (nano, gedit, meditácia atď.) a tlmočník pythonu (Bude potrebných 2.6 alebo 2.7, nefunguje s pythonom 3.x.).

Najskôr importujeme požadované moduly, v tomto prípade budeme potrebovať iba dva:

[kód] #! / usr / bin / env python
# - * - kódovanie: utf-8 - * -

dovozná zásuvka
reťazec na import
[/ kód]

Teraz pokračujeme k nastaviť robot:

[kód] HOST=»irc.desdelinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Domov»
readbuffer = »»
[/ kód]

Vysvetlím každú premennú:

  • HOST: URL servera, ku ktorému sa pripojíme
  • PRÍSTAV: Port servera. Predvolene je to 6667.
  • NICK, IDENT a REALNAME: Zodpovedajú prezývke robota, jeho identifikácii a skutočnému menu.
  • ZMENA: Kanál, do ktorého robot vstúpi
  • readbuffer: V tejto premennej sa uložia údaje odoslané serverom.

Po nakonfigurovaní nášho robota pokračujeme k spojenie

[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 ("PRIPOJENIE:% s \ r \ n"% ZMENA)
[/ kód]

Prvý riadok nemá veľké tajomstvo, druhý vytvára pripojenie k serveru a poslední traja odošlú údaje robota na server, aby mohli pokračovať v prihlásení.

Po pripojení vytvoríme Nekonečná slučka v ktorej pôjdeme prijímanie a odosielanie údajov z / na server:

[kód] zatiaľ čo 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pre line in temp:
riadok = string.rstrip (riadok)
line = line.split (CHAN + ':')

ak riadok [0] .find ("PING")! = -1:
pingid = riadok [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kód]

Zo všetkých riadkov napísaných vyššie budem komentovať iba tie dôležité.
s line = line.split (CHAN + ':') to, čo robíme, je rozdelenie toho, čo nám server pošle poďme niečo z kanála.
Napríklad nasledujúci riadok naznačuje, že niekto niečo napísal na kanál:

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

Prvým je prezývka používateľa a údaje o pripojení (oddelené znakom!), Príkaz (v tomto prípade znamená, že napísal), kanál a nakoniec po dvojbodke správa odoslaná. Nebudem vysvetľovať oveľa viac príkazov, pretože to nespadá do tohto tutoriálu.

Ostatné dôležité riadky sú tie sú po if. Server tak často odosiela príkaz PING, aby skontroloval, či je používateľ stále pripojený. V takom prípade robot pošle príkaz PONG s ID, ktoré poslal PING, aby oznámil serveru, že je stále pripojený.

S týmto už máme základňu robota. Teraz budem pokračovať a vysvetlím, ako dosiahnuť, aby robot reagoval podľa toho, čo chceme, na určité príkazy, či už sú to od samotného IRC alebo od používateľov.

Reakcia na IRC príkazy:

PING a PRIVMSG sú príklady príkazov IRC. Príkazov je veľa, ale ako som už povedal skôr, je to niečo, o čom sa nebudem rozpisovať.
Napríklad môžeme bota pozdraviť používateľov, ktorí sa pripájajú:

[code] if line [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] ak name! = NICK a name.find (HOST) == -1:
s.send ("PRIVMSG% s: Vitajte @% s ^^ \ n"% (CHAN, meno))
[/ kód]

Najskôr skontrolujeme, či server pošle príkaz REGISTRÁCIA čo naznačuje, že sa niekto pripojil k serveru. Potom extrahujeme nick, skontrolujeme, či nick nie je IRC url (ak nie, hneď ako spustíme robota, pozdraví url) a nakoniec pošleme pozdravnú správu.

Príkazy robota:

Teraz, ako si vyrobím robota reagovať na moje vlastné príkazy? Pozrime sa radšej na príklad:

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

V tomto príklade, ak niekto píše $ verzia robot zobrazí správu s uvedením jeho mena, verzie a autora. Celý kód príkladu je tento:

[code] import soketu
reťazec na import

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Domov»
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 ("PRIPOJENIE:% s \ r \ n"% ZMENA)

zatiaľ čo 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pre line in temp:
riadok tlače
riadok = string.rstrip (riadok)
line = line.split (CHAN + ':')

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

ak riadok [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] ak name! = NICK a name.find (HOST) == -1:
s.send ("PRIVMSG% s: Vitajte @% s ^^ \ n"% (CHAN, meno))

ak len (riadok) <1:
ak riadok [1] == '$ verzia':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kód]

Dúfam, že sa vám tento návod páčil, a samozrejme vám nechám odkaz na kód môjho robota, aby ste videli celý jeho kód a lepšie videli, ako funguje (aj keď som odstránil niektoré príkazy pre osobné použitie).

CalicoBot


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.

  1.   auroszx dijo

    Heh, nemohol som si nechať ujsť Bot of the bullshit you ride on IRC 😛 Veľmi zaujímavý článok.

  2.   Prestať dijo

    Veľmi jednoduché a jasné vysvetlenie.
    Čo ak, v kóde pythonu chýbajú všetky odsadenia.

  3.   Rafa dijo

    Vynikajúci článok a aké ľahké je pripojenie k IRC na programovanie robota:) ...

    Pripomína mi to časy, keď sme sa cítili ako programátori, ktorí písali skripty pre mIRC v rozhovoroch na serveroch MSN alebo MSNGroups.

  4.   truko22 dijo

    Zaujímavé nechávam si to 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    vynikajúce!

  6.   lynx dijo

    Veľmi užitočné, vďaka Son_Link!

    Zdravím!

  7.   dbillyx dijo

    Na zdravie ...

    sledovať vaše riadky a testovať jediné, čo funguje, je
    dovozná zásuvka
    reťazec na import

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Domov»
    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 ("PRIPOJTE SA:% srn"% CHAN)

    zmena kanálu a prezývky teraz nižšie mi hodí syntax chyby

    Spýtal som sa ďalších známych a hovoria mi, že to nevyzerá ako pytón

    Neviem, čo robím zle, alebo prečo všetko skopírujem a vložím do pythonu a dám tomu enter a pripojí sa ku kanálu, ale po 250 sekundách to kanál odstráni, pretože z pongu neprišla žiadna odpoveď ...

  8.   smažiť dijo

    Kompletný kód mi nefunguje, posledný odsek je to, čo zlyhá a nemôžem nájsť chybu. Ak túto časť odstránim, spája sa a funguje perfektne. Testované pomocou Pythonu 2.7.3 na Windows 7.

    PS: V mojom prípade sa pripájam k serveru pomocou hesla a pridávam tieto riadky:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   DoLpHiN dijo

    Ahoj Son Link, ďakujem pekne za článok, je veľmi zaujímavý, len nemôžem reagovať na zaslané príkazy. Program nejde do posledného, ​​ak a nemôžem prísť na to, prečo: „if len (line)> 1:“
    Čakám tvoju odpoveď.
    vďaka