[Python] Užprogramuokite robotą IRC

Šiandien aš išmokysiu jus programuoti a snukis punktas IRC. Visų pirma tiems, kurie nežino, robotas yra programa, jungianti IRC kanalą ir sąveikaujanti su juo, leidžianti mums, pavyzdžiui, moderuoti kanalą be kad mes esame susiję ir taip išvengti šlamšto arba kad jis atpažįsta užsakymų seriją ir vykdo atitinkamą kodą.
Nors jau yra paruoštų robotų, nuoširdžiai esu iš tų, kurie mėgsta kurti savo programas, kad išmoktų, ir didžiulį pasitenkinimą, kurį mums teikia pamatę, kad tai veikia ^ ^

Tai pasakę, pereikime prie mokymo programos.

Norėdami užprogramuoti robotą, mums reikės paprasto teksto redaktorius cualquiera (nano, geditas, meditacija ir kt.) ir pitono vertėjas (Reikės 2.6 arba 2.7, neveikia su Python 3.x).

Pirmiausia mes importuojame reikalingi moduliai, šiuo atveju mums reikės tik dviejų:

[kodas] #! / usr / bin / env python
# - * - kodavimas: utf-8 - * -

importo lizdas
importuoti eilutę
[/ kodas]

Dabar mes einame į configure botas:

[kodas] HOST = »irc.fromlinux.net»
Uostas = 6667
NICK = »CalicoBot»
IDENT = »„ CalicoBot “»
REALNAME = »CalicoBot»
CHAN = »# Pagrindinis»
skaitytojas = »»
[/ kodas]

Aš paaiškinsiu kiekvieną kintamąjį:

  • Host: Serverio, prie kurio prisijungsime, URL adresas
  • Uostas: Serverio prievadas. Pagal numatytuosius nustatymus tai yra 6667.
  • NICK, IDENT ir REALNAME: Jie atitinka roboto slapyvardį, jo identifikavimą ir tikrąjį vardą.
  • PAKEISTI: Kanalas, į kurį įeis robotas
  • skaitytojas: Šiame kintamajame serverio siunčiami duomenys bus išsaugoti.

Kai mūsų botas yra sukonfigūruotas, mes einame ryšys

[kodas] 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 ("PRISIJUNGTI:% s \ r \ n"% CHAN)
[/ kodas]

Pirmoji eilutė neturi daug paslapties, antroji sukuria serverio ryšys o paskutiniai trys siunčia roboto duomenis į serverį, kad tęstų prisijungimą.

Prisijungę sukursime Begalinis ciklas kuriame eisime gauti ir siųsti duomenis iš / į serverį:

[kodas] o 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
linijai temp:
eilutė = string.rstrip (eilutė)
eilutė = line.split (CHAN + ':')

jei eilutė [0] .find ("PING")! = -1:
pingid = eilutė [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kodas]

Iš visų aukščiau parašytų eilučių pakomentuosiu tik svarbias.
su eilutė = line.split (CHAN + ':') tai, ką mes darome, yra padalinti tai, ką serveris mums siunčia paimkime ką nors iš kanalo.
Pavyzdžiui, šioje eilutėje nurodoma, kad kažkas ką nors parašė kanale:

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

Pirmasis yra vartotojo slapyvardis ir ryšio duomenys (atskirti!), Komanda (šiuo atveju tai rodo, kad jis parašė), kanalas ir galiausiai, po dvitaškio, išsiųstas pranešimas. Aš nepaaiškinsiu daug daugiau komandų, nes tai nepatenka į šią mokymo programą.

Kitos svarbios linijos yra tos yra po if. Serveris taip dažnai siunčia komandą PING, kad patikrintų, ar vartotojas vis dar yra prisijungęs. Tokiu atveju robotas siunčia komandą PONG su ID, kurį PING atsiuntė, norėdamas parodyti serveriui, kad jis vis dar prijungtas.

Tai mes jau turime roboto pagrindą. Dabar aš paaiškinsiu, kaip priversti robotą reaguoti pagal tai, ko mes norime tam tikroms komandoms, nesvarbu, ar jos yra iš pačios IRC, ar iš vartotojų.

Atsakymas į IRC komandas:

PING ir PRIVMSG yra IRC komandų pavyzdžiai. Yra daugybė komandų, tačiau, kaip jau sakiau anksčiau, aš to nedetalizuosiu.
Pavyzdžiui, galime priversti robotą pasisveikinti prisijungusiems vartotojams:

[kodas] jei eilutė [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Sveiki atvykę @% s ^^ \ n"% (CHAN, vardas))
[/ kodas]

Pirmiausia patikriname, ar serveris siunčia komandą PRISIJUNK kuris rodo, kad kažkas prisijungė prie serverio. Tada išskleidžiame slapyvardį, patikriname, ar slapyvardis nėra IRC URL (jei ne iš karto, kai paleisime robotą, jis pasveikins URL) galiausiai išsiunčiame sveikinimo žinutę.

Bot komandos:

Dabar kaip padaryti savo botą atsakyti į mano pačios komandas? Geriau pažvelkime į pavyzdį:

[kodas] jei eilutė [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kodas]

Šiame pavyzdyje, jei kas nors rašo $ versija robotas parodys pranešimą, nurodydamas jo vardą, versiją ir autorių. Pilnas pavyzdžio kodas yra toks:

[kodas] importo lizdas
importuoti eilutę

HOST = »vietinis šeimininkas»
Uostas = 6667
NICK = »CalicoBot»
IDENT = »„ CalicoBot “»
REALNAME = »CalicoBot»
CHAN = »# Pagrindinis»
skaitytojas = »»
s = lizdas. lizdas ()
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 ("PRISIJUNGTI:% s \ r \ n"% CHAN)

o 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
linijai temp:
spausdinimo linija
eilutė = string.rstrip (eilutė)
eilutė = line.split (CHAN + ':')

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

jei eilutė [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Sveiki atvykę @% s ^^ \ n"% (CHAN, vardas))

jei len (eilutė) <1:
jei eilutė [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kodas]

Tikiuosi, kad ši pamoka jums patiko, ir, žinoma, palieku jums nuorodą į mano roboto kodą, kad galėtumėte pamatyti jo kodą pilnai ir geriau pamatyti, kaip jis veikia (nors aš pašalinau kai kurias komandas asmeniniam naudojimui).

„CalicoBot“


Straipsnio turinys atitinka mūsų principus redakcijos etika. Norėdami pranešti apie klaidą, spustelėkite čia.

12 komentarai, palikite savo

Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.

  1.   „AurosZx“ sakė

    Heh, aš negalėjau praleisti buožės, kuria jūs važiuojate per IRC, roboto 😛 Labai įdomus straipsnis.

  2.   Nustoti sakė

    Labai paprastas ir aiškus paaiškinimas.
    Ką daryti, jei pitono kode trūksta visos įtraukos.

  3.   Rafa sakė

    Puikus straipsnis ir kaip lengva prisijungti prie IRC, norint užprogramuoti robotą:)…

    Tai man primena tuos laikus, kai jautėmės lyg programuotojai rašydami „mIRC“ scenarijus pokalbiuose MSN ar „MSNGroups“.

  4.   truko22 sakė

    Įdomu aš jį laikau 😀

  5.   Genesis Vargas J. (@elprincipiodeto) sakė

    puikus!

  6.   elynx sakė

    Labai naudinga, ačiū Son_Link!

    Sveiki atvykę!

  7.   silpnumas sakė

    Cheers ...

    laikytis savo eilučių ir išbandyti vienintelį dalyką, kuris veikia
    importo lizdas
    importuoti eilutę

    HOST = »vietinis šeimininkas»
    Uostas = 6667
    NICK = »CalicoBot»
    IDENT = »„ CalicoBot “»
    REALNAME = »CalicoBot»
    CHAN = »# Pagrindinis»
    skaitytojas = »»
    s = lizdas. lizdas ()
    s.connect ((HOST, PORT))
    s.send („NICK% srn“% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send („PRISIJUNGTI:% srn“% CHAN)

    keičiant kanalą ir slapyvardį dabar žemiau pateikiama klaidų sintaksė

    Aš paklausiau kitų pažįstamų, ir jie man sako, kad tai neatrodo kaip pitonas

    Aš nežinau, ką darau neteisingai, arba kodėl viską nukopijuoju ir įklijuoju į pitoną, duodu įeiti ir jis prisijungia prie kanalo, bet po 250 sekundžių kanalas jį pašalina, nes ten nebuvo atsakymo iš teniso ...

  8.   pinfry sakė

    Visas kodas man neveikia, paskutinė pastraipa yra tai, kas nepavyksta, ir negaliu rasti klaidos. Jei ištrinu tą dalį, ji sujungiama ir veikia puikiai. Išbandyta naudojant „Python 2.7.3“ sistemoje „Windows 7“.

    PS: Mano atveju prisijungiu prie serverio naudodamas slaptažodį ir pridedu šias eilutes:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   DALYTI sakė

    Sveiki, Sonai Linkai, labai ačiū už straipsnį, jis labai įdomus, tiesiog negaliu atsakyti į išsiųstas komandas. Programa nėra paskutinė, jei ir aš negaliu suprasti, kodėl: "jei len (eilutė)> 1:"
    Aš laukiu tavo atsakymo.
    Ačiū