Hodiaŭ mi instruos vin kiel programi a bot por IRC. Unue por tiuj, kiuj ne scias, robotprogramo estas programo, kiu konektas al IRC-kanalo kaj interagas kun ĝi, permesante al ni ekzemple moderigi la kanalon sen ke ni estas ligitaj kaj tiel eviti spamon, aŭ ke ĝi agnosku serion de ordonoj kaj plenumu la respondan kodon.
Kvankam jam estas robotoj pretaj, mi sincere estas unu el tiuj, kiuj ŝatas fari siajn proprajn programojn por lerni kaj la grandan kontenton, kiun ĝi donas al ni post kiam ĝi funkcias ^^
Dirite, ni iru al la lernilo.
Por programi la bot ni bezonos simpla tekstredaktilo qualquiera (nano, gedit, medit, ktp) kaj la interpretisto de pitono (2.6 aŭ 2.7 estos necesaj, ne funkcias kun python 3.x).
Unue ni importas la bezonataj moduloj, ĉi-kaze ni bezonos nur du:
[kodo] #! / usr / bin / env python# - * - kodigo: utf-8 - * -
importa ingo
importi ĉenon
[/ kodo]
Nun ni procedas al starigi la robotprogramo:
[kodo] HOST = »irc.fromlinux.net»PORT = 6667
NICK = »CalicoBot»
IDENTO = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Hejmo»
readbuffer = »»
[/ kodo]
Mi klarigos ĉiun variablon:
- HOST: La URL de la servilo al kiu ni konektos
- HAVENO: La servila haveno. Defaŭlte ĝi estas 6667.
- NICK, IDENT kaj REALNAME: Ili respondas al la alnomo de la bot, ĝia identigo kaj la vera nomo.
- CHAN: La kanalon eniros la roboton
- readbuffer: En ĉi tiu variablo la datumoj senditaj de la servilo estos konservitaj.
Post kiam nia robotprogramo estas agordita ni procedas al la rilato
[kodo] s = socket.socket ()s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("UZANTO% s% s bla:% s \ r \ n"% (IDENTO, HOSTO, REALNOMO))
s.send ("ALIĜI:% s \ r \ n"% CHAN)
[/ kodo]
La unua linio ne havas multe da mistero, la dua kreas la servila konekto kaj la lastaj tri sendas la datumojn de la robotprogramo al la servilo por daŭrigi la ensaluton.
Unufoje konektita ni kreos Senfina buklo en kiu ni iros ricevi kaj sendi datumojn de / al la servilo:
[kodo] dum 1:readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
por linio en temp:
linio = ĉeno.strio (linio)
linio = linio.split (CHAN + ':')
se linio [0] .find ("PING")! = -1:
pingid = linio [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kodo]
El ĉiuj supre skribitaj linioj mi nur komentos pri la gravaj.
con linio = linio.split (CHAN + ':') kion ni faras estas dividi tion, kion la servilo sendas al ni kiam ni ricevu ion de la kanalo.
Ekzemple la sekva linio indikas, ke iu skribis ion sur la kanalo:
:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^
La unua estas la kromnomo kaj konekto de la uzanto (apartigitaj per!), La komando (ĉi-kaze ĝi indikas, ke li skribis), la kanalo kaj fine, post la dupunkto, la sendita mesaĝo. Mi ne klarigos multajn pliajn ordonojn, ĉar tio ne eniras ĉi tiun lernilon.
La aliaj gravaj linioj estas tiuj estas post la se. La servilo ĉiufoje sendas la komandon PING por kontroli ĉu la uzanto ankoraŭ estas konektita. En tiu kazo la robotprogramo sendas la komandon PONG kun ID, kiun PING sendis por indiki al la servilo, ke ĝi ankoraŭ estas konektita.
Kun ĉi tio ni jam havas la bazon de la bot. Nun mi plu klarigos kiel respondigi la roboton laŭ tio, kion ni volas al iuj komandoj, ĉu ili estas de IRC mem aŭ de uzantoj.
Respondante al IRC-komandoj:
PING kaj PRIVMSG estas ekzemploj de IRC-komandoj. Estas multaj komandoj, sed kiel mi diris antaŭe, ĝi estas io pri kio mi ne detale esploros.
Ekzemple, ni povas igi la robotprogramon saluti uzantojn, kiuj konektas:
nomo = linio [0] .split ('!') [0] .split (':') [1] se nomo! = NICK kaj name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bonvenon @% s ^^ \ n"% (CHAN, nomo))
[/ kodo]
Unue ni kontrolas ĉu la servilo sendas la komandon JOIN kio indikas, ke iu konektita al la servilo. Poste ni ĉerpas la kromnomon, ni kontrolas, ke la kromnomo ne estas la IRC-URL (se ne tuj kiam ni ekzekutos la robotprogramon ĝi salutos la url) kaj fine ni sendas la salutmesaĝon.
Bot-komandoj:
Nun kiel mi kreu mian robotprogramon respondu al miaj propraj ordonoj? Ni pli bone rigardu ekzemplon:
[kodo] se linio [1] == '$ versio':s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kodo]
En ĉi tiu ekzemplo se iu skribas $ versio la robotprogramo montros la mesaĝon indikante ĝian nomon, version kaj aŭtoron. La kompleta kodo de la ekzemplo estas jena:
[kodo] importa ingoimporti ĉenon
HOST = "loka gastiganto"
PORT = 6667
NICK = »CalicoBot»
IDENTO = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Hejmo»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("UZANTO% s% s bla:% s \ r \ n"% (IDENTO, HOSTO, REALNOMO))
s.send ("ALIĜI:% s \ r \ n"% CHAN)
dum 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
por linio en temp:
presita linio
linio = ĉeno.strio (linio)
linio = linio.split (CHAN + ':')
se linio [0] .find ("PING")! = -1:
pingid = linio [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
se linio [0] .find ('ALiĝu')! = -1:
nomo = linio [0] .split ('!') [0] .split (':') [1] se nomo! = NICK kaj name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bonvenon @% s ^^ \ n"% (CHAN, nomo))
se len (linio) <1:
se linio [1] == '$ versio':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kodo]
Mi esperas, ke ĉi tiu lernilo plaĉis al vi, kaj kompreneble, mi lasas al vi la ligon al la kodo de mia robotprogramo, por ke vi povu vidi ĝian kodon komplete kaj pli bone vidi kiel ĝi funkcias. (kvankam mi forigis iujn komandojn por persona uzo).
12 komentoj, lasu la viajn
He, mi ne povus maltrafi la Bot de la aĉaĵoj, kiujn vi veturas per IRC 😛 Tre interesa artikolo.
Tre simpla kaj klara klarigo.
Kio se al la pitona kodo mankas la tuta indentaĵo.
Ĝi jam estas solvita ^^
Bonega artikolo kaj kiel facile estas konektiĝi al IRC por programi robotprogramon:) ...
Ĝi memorigas min pri tiuj tempoj, kiam ni sentis nin kiel programistoj skribantaj skriptojn por mIRC en babilejoj en MSN aŭ MSNGroups.
Interese mi konservas ĝin 😀
bonega!
Tre utila, dankon Son_Link!
Dankon!
Saluton ...
sekvante viajn liniojn kaj testante, la sola afero funkcias estas
importa ingo
importi ĉenon
HOST = "loka gastiganto"
PORT = 6667
NICK = »CalicoBot»
IDENTO = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Hejmo»
readbuffer = »»
s = socket.socket ()
s.connect ((HOST, PORT))
s.send ("NICK% srn"% NICK)
s.send ("UZANTO% s% s bla:% srn"% (IDENTO, GASTISTO, REA NOMO))
s.send ("ALIĜI:% srn"% CHAN)
ŝanĝante la kanalon kaj kromnomon nun la sube ĵetas al mi eraran sintakson
Mi demandis aliajn konatojn kaj ili diras al mi, ke tio ne aspektas kiel pitono
Mi ne scias, kion mi faras malbone aŭ kial mi kopias ĉion kaj gluas ĝin en python kaj donas al ĝi eniron kaj ĝi konektas al la kanalo sed post 250 sekundoj la kanalo forigas ĝin ĉar ne estis respondo de pong ...
Kiun version de Python vi uzas?
Ĝi funkcias nur kun python 2.6 kaj 2.7, ne kun 3.x
Mi modifos la eniron por fari ĝin pli klara.
La kompleta kodo ne funkcias por mi, la lasta paragrafo malsukcesas kaj mi ne povas trovi la eraron. Se mi forigas tiun parton, ĝi ligas kaj funkcias perfekte. Provita per Python 2.7.3 en Vindozo 7.
PS: En mia kazo mi konektas al servilo kun pasvorto kaj aldonas ĉi tiujn liniojn:
PASS = »Passdelbot»
s.send ("PASS% s \ r \ n"% PASS)
Saluton Filo Link, dankegon pro la artikolo, ĝi estas tre interesa, mi simple ne povas respondi al la senditaj ordonoj. La programo ne eniras la lastan se kaj mi ne povas kompreni kial: "se len (linio)> 1:"
Mi atendas vian respondon.
danke
Mi ĵus aldonis la ligon al la kompleta kodo de la bot ĉar ĝi konvertas iujn simbolojn kaj kodo montras sian html-kodon.
Ĉiuokaze mi provos provi montri ĉion ĝuste