[Python] Magprogram ng isang bot para sa IRC

Ngayon ay magtuturo ako sa iyo kung paano mag-program a bot para IRC. Una sa lahat, para sa mga hindi nakakaalam, ang bot ay isang programa na kumokonekta sa isang IRC channel at nakikipag-ugnay dito, na nagbibigay-daan sa amin, halimbawa, na i-moderate ang channel nang walang na kami ay konektado at sa gayon iwasan ang spam, o kinikilala nito ang isang serye ng mga order at isinasagawa ang kaukulang code.
Bagaman may mga handa nang bot, totoo lang ako ang isa sa mga nais na gumawa ng kanilang sariling mga programa upang malaman at ang labis na kasiyahan na ibinibigay sa amin pagkatapos makita na gumagana ito ^^

Sa nasabing iyon, magpatuloy tayo sa tutorial.

Upang maprograma ang bot kakailanganin natin ang isang payak na text editor kahit sino (nano, gedit, medit, atbp) at tagasalin ng sawa (2.6 o 2.7 ay kinakailangan, ay hindi gumagana sa sawa 3.x).

Una naming ini-import ang kinakailangang mga module, sa kasong ito kakailanganin lamang namin ang dalawa:

[code] #! / usr / bin / env python
# - * - coding: utf-8 - * -

mag-import ng socket
mag-import ng string
[/ code]

Ngayon nagpapatuloy kami sa set up ang bot:

[code] HOST=»irc.desdelinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
[/ code]

Ipapaliwanag ko ang bawat variable:

  • HOST: Ang URL ng server kung saan kami makakonekta
  • PORT: Ang port ng server. Bilang default ito ay 6667.
  • NICK, IDENT at REALNAME: Ang mga ito ay tumutugma sa palayaw ng bot, ang pagkakakilanlan nito at ang totoong pangalan.
  • CHAN: Ang channel na bot ay papasok
  • readbuffer: Sa variable na ito ang data na ipinadala ng server ay nai-save.

Kapag na-configure ang aming bot nagpapatuloy kami sa ang koneksyon

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

Ang unang linya ay walang maraming misteryo, ang pangalawa ay lumilikha ng koneksyon ng server at ang huling tatlong ipadala ang data ng bot sa server upang magpatuloy sa pag-login.

Kapag nakakonekta lilikha kami ng a Walang katapusang loop kung saan pupunta kami pagtanggap at pagpapadala ng data mula sa / sa server:

[code] habang 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
para sa linya sa temp:
linya = string.rstrip (linya)
linya = linya.split (CHAN + ':')

kung linya [0] .find ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ code]

Sa lahat ng mga linyang nakasulat sa itaas, magkokomento lamang ako sa mga mahahalaga.
may linya = linya.split (CHAN + ':') kung ano ang ginagawa namin ay hatiin kung ano ang ipinapadala sa amin ng server kung kailan kumuha tayo ng isang bagay mula sa channel.
Halimbawa ang sumusunod na linya ay nagpapahiwatig na may nagsulat ng isang bagay sa channel:

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

Ang una ay ang palayaw ng gumagamit at ang kanyang data ng koneksyon (pinaghiwalay ng!), Ang utos (sa kasong ito ay ipinapahiwatig na sumulat siya), ang channel at sa wakas, pagkatapos ng colon, ipinadala ang mensahe. Hindi ko ipaliwanag ang marami pang mga utos dahil hindi ito kabilang sa tutorial na ito.

Ang iba pang mga mahahalagang linya ay ang mga ay pagkatapos ng kung. Ang server ay madalas na nagpapadala ng utos ng PING upang suriin kung ang gumagamit ay konektado pa rin. Sa kasong ito, ang bot ay nagpapadala ng utos ng PONG na may isang ID na ipinadala ng PING upang ipahiwatig sa server na ito ay konektado pa rin.

Sa pamamagitan nito mayroon na tayong baseng bot. Ngayon ay magpapatuloy ako upang ipaliwanag kung paano gawin ang bot na tumugon alinsunod sa gusto namin sa ilang mga utos, mula man sa IRC mismo o mula sa mga gumagamit.

Ang pagtugon sa mga utos ng IRC:

Ang PING at PRIVMSG ay mga halimbawa ng mga utos ng IRC. Maraming mga utos, ngunit tulad ng sinabi ko dati, ito ay isang bagay na hindi ko idedetalye.
Halimbawa, maaari naming batiin ang bot sa mga gumagamit na kumokonekta:

[code] kung linya [0] .find ('SUMALI')! = -1:
pangalan = linya [0] .split ('!') [0] .split (':') [1] kung pangalan! = NICK at name.find (HOST) == -1:
s.send ("PRIVMSG% s: Maligayang pagdating @% s ^^ \ n"% (CHAN, pangalan))
[/ code]

Sinusuri muna namin kung ang server ay nagpapadala ng utos SUMALI na nagpapahiwatig na may isang taong nakakonekta sa server. Pagkatapos ay kinukuha namin ang nick, sinuri namin na ang nick ay hindi ang IRC url (kung hindi kaagad sa pagpapatupad ng bot ay babatiin nito ang url) at sa wakas ay nagpapadala kami ng mensahe sa pagbati.

Nag-uutos ang bot:

Ngayon paano ko gagawin ang aking bot tumugon sa aking sariling mga utos? Mas mabuti nating tingnan ang isang halimbawa:

[code] kung linya [1] == '$ bersyon':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ code]

Sa halimbawang ito kung may sumusulat bersyon ng $ ipapakita ng bot ang mensahe na nagpapahiwatig ng pangalan, bersyon at may akda nito. Ang kumpletong code ng halimbawa ay ito:

[code] i-import ang socket
mag-import ng string

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
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 ("SUMALI:% s \ r \ n"% CHAN)

habang 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
para sa linya sa temp:
linya ng pag-print
linya = string.rstrip (linya)
linya = linya.split (CHAN + ':')

kung linya [0] .find ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

kung linya [0] .find ('SUMALI')! = -1:
pangalan = linya [0] .split ('!') [0] .split (':') [1] kung pangalan! = NICK at name.find (HOST) == -1:
s.send ("PRIVMSG% s: Maligayang pagdating @% s ^^ \ n"% (CHAN, pangalan))

kung len (linya) <1:
kung linya [1] == '$ bersyon':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ code]

Inaasahan kong nagustuhan mo ang tutorial na ito, at syempre, iniiwan ko sa iyo ang link sa code ng aking bot upang makita mo ang code nito nang buo at mas mahusay mong makita kung paano ito gumagana. (kahit na inalis ko ang ilang mga utos para sa personal na paggamit).

CalicoBot


12 na puna, iwan mo na ang iyo

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   auroszx dijo

    Heh, hindi ko napalampas ang Bot ng kalokohan na sinasakyan mo sa IRC 😛 Nakatutuwang artikulo

  2.   Maghinto dijo

    Napakasimple at malinaw na paliwanag.
    Paano kung, nawawala ang code ng sawa sa lahat ng pagkakabitin.

  3.   rafa dijo

    Mahusay na artikulo at kung gaano kadali kumonekta sa isang IRC upang mai-program ang isang bot:)…

    Ipinaaalala nito sa akin ang mga oras kung kailan naramdaman namin na tulad ng mga programmer na sumusulat ng mga script para sa mIRC sa MSN o MSNGroups chats

  4.   truko22 dijo

    Kagiliw-giliw na itinatago ko ito 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    mahusay na!

  6.   elynx dijo

    Napaka kapaki-pakinabang, salamat Son_Link!

    Pagbati!

  7.   dbillyx dijo

    Cheers…

    pagsunod sa iyong mga linya at pagsubok sa tanging bagay na gumagana ay
    mag-import ng socket
    mag-import ng string

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Home»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("SUMALI:% srn"% CHAN)

    ang pagbabago ng channel at nick ngayon sa ibaba ay itinapon sa akin ang error syntax

    Tinanong ko ang iba pang mga kakilala at sinabi nila sa akin na hindi iyon mukhang sawa

    Hindi ko alam kung ano ang mali kong ginagawa o kung bakit ko kinopya ang lahat at idikit ito sa sawa at ipasok ito at kumonekta ito sa channel ngunit pagkalipas ng 250 segundo tinanggal ito ng channel dahil walang tugon mula kay pong ...

  8.   pinfry dijo

    Ang kumpletong code ay hindi gagana para sa akin, ang huling talata ay kung ano ang nabigo at hindi ko makita ang error. Kung tatanggalin ko ang bahaging iyon, kumokonekta ito at gumagana nang perpekto. Nasubukan sa Python 2.7.3 sa Windows 7.

    PS: Sa aking kaso kumonekta ako sa isang server na may isang password at idaragdag ang mga linyang ito:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   DoLpHiN dijo

    Kumusta Anak Link, maraming salamat sa artikulo, ito ay napaka-kagiliw-giliw, hindi ko lamang tumugon sa ipinadala na mga utos. Ang programa ay hindi napunta sa huling kung at hindi ko malaman kung bakit: "kung len (linya)> 1:"
    Hinihintay ko ang sagot mo.
    Salamat