Š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.desdelinux.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:
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 lizdasimportuoti 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).