[Python] Programējiet robotu IRC

Š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:

[kods] 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))
[/ 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 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% 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).

CalicoBot


12 komentāri, atstājiet savus

Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.

  1.   auroszx teica

    Heh, es nevarēju palaist garām to blēžu botu, ar kuru tu brauc IRC 😛 Ļoti interesants raksts.

  2.   Cēzars teica

    Ļoti vienkāršs un skaidrs paskaidrojums.
    Ko darīt, ja pitona kodā trūkst visas atkāpes.

  3.   Rafa teica

    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.

  4.   truko22 teica

    Interesanti es to saglabāju keep

  5.   Genesis Vargas J. (@elprincipiodeto) teica

    lielisks!

  6.   Elīna teica

    Ļoti noderīgi, paldies Son_Link!

    Sveicieni!

  7.   dbillyx teica

    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 ...

  8.   pinfry teica

    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)

  9.   DARĪT teica

    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