Šodien es iemācīšu jums programmēt a cērme par IRC. Pirmkārt, tiem, kas nezina, robots ir programma, kas izveido savienojumu ar IRC kanālu un mijiedarbojas ar to, kas ļauj mums, piemēram, moderēt kanālu bez ka mēs esam saistīti tādējādi izvairoties no surogātpasta vai ka tas atpazīst pasūtījumu sēriju un izpilda atbilstošo kodu.
Lai gan jau ir gatavi roboti, es patiesi esmu viens no tiem, kuriem patīk pašiem veidot savas programmas, un lielais gandarījums, ko tas mums dod, redzot, ka tas darbojas
Pateicoties tam, pārejam uz apmācību.
Lai programmētu robotu, mums būs nepieciešams teksta redaktors cualquiera (nano, gedit, meditēt utt.) un pitona tulks (Būs nepieciešama 2.6 vai 2.7, nedarbojas ar Python 3.x).
Vispirms mēs importējam nepieciešamie moduļi, šajā gadījumā mums būs nepieciešami tikai divi:
[kods] #! / usr / bin / env python# - * - kodēšana: utf-8 - * -
importa ligzda
importa virkne
[/ kods]
Tagad mēs turpinām configurar robots:
[code] HOST=»irc.desdelinux.net»OSTA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Sākums»
lasītāju buferis = »»
[/ kods]
Es paskaidrošu katru mainīgo:
- HOST: Servera URL, ar kuru mēs izveidosim savienojumu
- OSTA: Servera ports. Pēc noklusējuma tas ir 6667.
- NICK, IDENT un REALNAME: Tie atbilst robota segvārdam, tā identifikācijai un īstajam vārdam.
- ČAN: Kanāls, kurā robots ieies
- lasītājs: Šajā mainīgajā tiks saglabāti servera nosūtītie dati.
Kad mūsu bots ir konfigurēts, mēs ejam uz savienojums
[kods] s = ligzda.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 ("PIEVIENOTIES:% s \ r \ n"% CHAN)
[/ kods]
Pirmajā rindā nav daudz noslēpumu, otrā rada servera savienojums un pēdējie trīs nosūta robota datus uz serveri, lai turpinātu pieteikšanos.
Kad būs izveidots savienojums, mēs izveidosim Bezgalīga cilpa kurā mēs iesim datu saņemšana un nosūtīšana no / uz serveri:
[kods], kamēr 1:readbuffer = readbuffer + s.recv (1024)
temp = string.split (lasīšanas buferis, "\ n")
readbuffer = temp.pop ()
līnijai temp:
līnija = string.rstrip (līnija)
line = line.split (CHAN + ':')
ja rinda [0] .find ("PING")! = -1:
pingid = līnija [0] .split () [1] s.sūtīt ("PONG% s \ r \ n"% pingid)
[/ kods]
No visām iepriekš rakstītajām rindām es komentēšu tikai svarīgākās.
ar line = line.split (CHAN + ':') tas, ko mēs darām, ir sadalīt to, ko serveris mums sūta paņemsim kaut ko no kanāla.
Piemēram, šī rinda norāda, ka kāds kanālā kaut ko uzrakstīja:
:son_link!sonlink@127.0.0.1 PRIVMSG #Home :Hola ^^
Pirmais ir lietotāja segvārds un viņa savienojuma dati (atdalīti ar!), Komanda (šajā gadījumā tas norāda, ka viņš rakstīja), kanāls un visbeidzot, pēc resnās zarnas, nosūtītais ziņojums. Es nepaskaidrošu daudz vairāk komandu, jo tas neietilpst šajā apmācībā.
Pārējās svarīgās līnijas ir tās viņi ir pēc if. Serveris tik bieži nosūta komandu PING, lai pārbaudītu, vai lietotājs joprojām ir savienots. Tādā gadījumā robots nosūta komandu PONG ar ID, kuru PING nosūtīja, lai norādītu serverim, ka tas joprojām ir savienots.
Līdz ar to mums jau ir bota pamats. Tagad es turpināšu paskaidrot, kā panākt, lai robots reaģētu atbilstoši tam, ko mēs vēlamies noteiktām komandām, neatkarīgi no tā, vai tās ir no pašas IRC vai no lietotājiem.
Atbildēšana uz IRC komandām:
PING un PRIVMSG ir IRC komandu piemēri. Ir daudz komandu, taču, kā jau teicu iepriekš, tas ir kaut kas, par kuru es detalizēti neiedziļināšos.
Piemēram, mēs varam likt robotam sasveicināties lietotājiem, kuri izveido savienojumu:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Laipni lūdzam @% s ^^ \ n"% (CHAN, nosaukums))
[/ kods]
Vispirms mēs pārbaudām, vai serveris nosūta komandu PIEVIENOJIES kas norāda, ka kāds ir izveidojis savienojumu ar serveri. Tad mēs iegūstam segvārdu, pārbaudām, vai segvārds nav IRC URL (ja ne tiklīdz mēs palaižam robotu, tas sveicinās URL) un visbeidzot mēs nosūtām apsveikuma ziņojumu.
Bot komandas:
Tagad kā es varu izveidot savu bot atbildu uz savām komandām? Labāk apskatīsim piemēru:
[kods] ja rinda [1] == '$ version':s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kods]
Šajā piemērā, ja kāds raksta $ versija robots parādīs ziņojumu, norādot tā vārdu, versiju un autoru. Pilns piemēra kods ir šāds:
[kods] importa ligzdaimporta virkne
HOST = »vietējais saimnieks»
OSTA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Sākums»
lasītāju buferis = »»
s = kontaktligzda. kontaktligzda ()
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 ("PIEVIENOTIES:% s \ r \ n"% CHAN)
kamēr 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (lasīšanas buferis, "\ n")
readbuffer = temp.pop ()
līnijai temp:
drukas līnija
līnija = string.rstrip (līnija)
line = line.split (CHAN + ':')
ja rinda [0] .find ("PING")! = -1:
pingid = līnija [0] .split () [1] s.sūtīt ("PONG% s \ r \ n"% pingid)
ja rinda [0] .find ('PIEVIENOTIES')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK and name.find (HOST) == -1:
s.send ("PRIVMSG% s: Laipni lūdzam @% s ^^ \ n"% (CHAN, nosaukums))
ja len (līnija) <1:
ja rindiņa [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kods]
Es ceru, ka šī apmācība jums patika, un, protams, es jums atstāju saiti uz sava robota kodu, lai jūs varētu pilnībā redzēt tā kodu un labāk redzēt, kā tas darbojas (lai gan dažas komandas personīgai lietošanai esmu noņēmis).
Heh, es nevarēju palaist garām to blēžu botu, ar kuru tu brauc IRC 😛 Ļoti interesants raksts.
Ļoti vienkāršs un skaidrs paskaidrojums.
Ko darīt, ja pitona kodā trūkst visas atkāpes.
Tas jau ir atrisināts ^^
Izcils raksts un tas, cik viegli ir izveidot savienojumu ar IRC, lai programmētu robotu:)…
Tas man atgādina tos laikus, kad mēs jutāmies kā programmētāji, kuri MSN vai MSNGroups tērzēšanā raksta skriptus mIRC.
Interesanti es to saglabāju keep
lielisks!
Ļoti noderīgi, paldies Son_Link!
Sveicieni!
Priekā…
sekojot savām līnijām un pārbaudot vienīgo, kas darbojas, ir
importa ligzda
importa virkne
HOST = »vietējais saimnieks»
OSTA = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Sākums»
lasītāju buferis = »»
s = kontaktligzda. kontaktligzda ()
s.connect ((HOST, PORT))
s.send ("NICK% srn"% NICK)
s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
s.send ("PIEVIENOTIES:% srn"% CHAN)
mainot kanālu un niku, tagad zemāk man ir kļūdu sintakse
Es pajautāju citiem paziņām, un viņi man saka, ka tas neizskatās pēc pitona
Es nezinu, ko es daru nepareizi, vai kāpēc es visu nokopēju un ielīmēju pitonā un dodu ievadi, un tas savienojas ar kanālu, bet pēc 250 sekundēm kanāls to noņem, jo no tenisa nebija atbildes ...
Kādu Python versiju jūs izmantojat?
Tas darbojas tikai ar pitonu 2.6 un 2.7, nevis ar 3.x
Es modificēšu ierakstu, lai tas būtu skaidrāks.
Pilns kods man nedarbojas, pēdējā daļa ir tā, kas neizdodas, un es nevaru atrast kļūdu. Ja es izdzēšu šo daļu, tā savienojas un darbojas nevainojami. Pārbaudīts ar Python 2.7.3 operētājsistēmā Windows 7.
PS: Manā gadījumā es izveidoju savienojumu ar serveri ar paroli un pievienoju šādas rindas:
PASS = »Passdelbot»
s.send ("PASS% s \ r \ n"% PASS)
Sveiks, dēls Link, liels paldies par rakstu, tas ir ļoti interesants, es vienkārši nevaru atbildēt uz nosūtītajām komandām. Programma neietilpst pēdējā ja un es nevaru saprast, kāpēc: "ja len (line)> 1:"
Es gaidu jūsu atbildi.
Gracias
Es tikko pievienoju saiti uz pilnu robota kodu, jo tas pārveido dažus simbolus, un kods parāda tā html kodu.
Jebkurā gadījumā es centīšos mēģināt visu parādīt pareizi