[Python] Ohjelmoi botti IRC: tä varten

Tänään aion opettaa sinulle kuinka ohjelmoida a bot ja IRC. Ensinnäkin niille, jotka eivät tiedä, botti on ohjelma, joka muodostaa yhteyden IRC-kanavaan ja on vuorovaikutuksessa sen kanssa, mikä antaa meille mahdollisuuden esimerkiksi valvoa kanavaa ilman että olemme yhteydessä toisiinsa ja siten välttää roskapostia tai että se tunnistaa sarjan tilauksia ja suorittaa vastaavan koodin.
Vaikka botteja on jo valmiina, olen rehellisesti yksi niistä, jotka haluavat tehdä omia ohjelmiaan oppiakseen, ja siitä suuresta tyydytyksestä, jonka se antaa meille nähtyämme sen toimivan ^^

Sanottuamme, siirrymme opetusohjelmaan.

Botin ohjelmointiin tarvitsemme a pelkkätekstieditori cualquiera (nano, gedit, meditaatio jne.) ja python-tulkki (2.6 tai 2.7 tarvitaan, ei toimi python 3.x: n kanssa).

Ensin tuomme tarvittavat moduulit, tässä tapauksessa tarvitsemme vain kaksi:

[koodi] #! / usr / bin / env python
# - * - koodaus: utf-8 - * -

tuontipistoke
tuo merkkijono
[/ Code]

Nyt jatkamme perustaa botti:

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

Selitän kukin muuttuja:

  • HOST: Palvelimen URL-osoite, johon yhdistämme
  • PORTTI: Palvelinportti. Oletusarvoisesti se on 6667.
  • NICK, IDENT ja REALNAME: Ne vastaavat botin lempinimeä, sen tunnistetta ja oikeaa nimeä.
  • MUUTA: Kanava, johon botti tulee
  • lukija: Tähän muuttujaan palvelimen lähettämät tiedot tallennetaan.

Kun botti on määritetty, jatkamme yhteys

[koodi] s = socket.socket ()
s.connect ((HOST, PORTTI))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("LIITY:% s \ r \ n"% CHAN)
[/ Code]

Ensimmäisellä rivillä ei ole paljon mysteeriä, toisella luodaan palvelinyhteys ja viimeiset kolme lähettävät botin tiedot palvelimelle jatkaakseen sisäänkirjautumista.

Kun yhteys on muodostettu, luomme Ääretön silmukka johon me menemme tietojen vastaanottaminen ja lähettäminen palvelimelta:

[koodi] kun taas 1:
readbuffer = lukupuskuri + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
linjalle lämpötilassa:
rivi = string.rstrip (rivi)
rivi = line.split (CHAN + ':')

jos rivi [0]. etsi ("PING")! = -1:
pingid = rivi [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]

Kaikista yllä kirjoitetuista riveistä kommentoin vain tärkeitä.
kanssa rivi = line.split (CHAN + ':') mitä teemme, on jakaa mitä palvelin lähettää meille milloin haetaan jotain kanavalta.
Esimerkiksi seuraava rivi osoittaa, että joku kirjoitti jotain kanavalle:

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

Ensimmäinen on käyttäjän lempinimi ja yhteysdata (erotettu!), Komento (tässä tapauksessa se tarkoittaa, että hän kirjoitti), kanava ja lopuksi kaksoispisteen jälkeen lähetetty viesti. En selitä paljon muita komentoja, koska se ei kuulu tähän opetusohjelmaan.

Muut tärkeät linjat ovat ne ovat jälkeen if. Palvelin lähettää niin usein PING-komennon tarkistamaan, onko käyttäjä edelleen yhteydessä. Tässä tapauksessa botti lähettää PONG-komennon tunnuksella, jonka PING lähetti osoittamaan palvelimelle, että se on edelleen yhteydessä.

Tämän avulla meillä on jo botin perusta. Seuraavassa selitän, kuinka botti saadaan vastaamaan haluamallemme komennolle, olivatpa ne itse IRC: n vai käyttäjien.

IRC-komentoihin vastaaminen:

PING ja PRIVMSG ovat esimerkkejä IRC-komennoista. Komentoja on monia, mutta kuten sanoin aiemmin, se on asia, josta en aio mennä yksityiskohtiin.
Esimerkiksi voimme saada botin tervehtimään käyttäjiä, jotka muodostavat yhteyden:

[koodi] jos rivi [0]. etsi ('LIITY')! = -1:
nimi = rivi [0] .split ('!') [0] .split (':') [1] jos nimi! = NICK ja name.find (HOST) == -1:
s.send ("PRIVMSG% s: Tervetuloa @% s ^^ \ n"% (CHAN, nimi))
[/ Code]

Ensin tarkistamme, lähettääkö palvelin komennon LIITY mikä osoittaa, että joku on yhteydessä palvelimeen. Sitten puramme lempinimen, tarkistamme, että lempinimi ei ole IRC-URL-osoite (ellei heti, kun suoritamme botin, se tervehtii URL-osoitetta) ja lopuksi lähetämme tervehdysviestin.

Bot-komennot:

Nyt miten teen botini vastata omiin komentoihini? Katsotaanpa paremmin esimerkkiä:

[koodi] jos rivi [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Tässä esimerkissä jos joku kirjoittaa $ -versio botti näyttää viestin, jossa ilmoitetaan sen nimi, versio ja kirjoittaja. Esimerkin täydellinen koodi on seuraava:

[code] tuontipistoke
tuo merkkijono

HOST = »paikallinen isäntä»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Etusivu»
readbuffer = »»
s = pistorasia. pistorasia ()
s.connect ((HOST, PORTTI))
s.send ("NICK% s \ r \ n"% NICK)
s.send ("USER% s% s bla:% s \ r \ n"% (IDENT, HOST, REALNAME))
s.send ("LIITY:% s \ r \ n"% CHAN)

kun taas 1:

readbuffer = lukupuskuri + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
linjalle lämpötilassa:
painolinja
rivi = string.rstrip (rivi)
rivi = line.split (CHAN + ':')

jos rivi [0]. etsi ("PING")! = -1:
pingid = rivi [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

jos rivi [0]. etsi ('LIITY')! = -1:
nimi = rivi [0] .split ('!') [0] .split (':') [1] jos nimi! = NICK ja name.find (HOST) == -1:
s.send ("PRIVMSG% s: Tervetuloa @% s ^^ \ n"% (CHAN, nimi))

jos len (viiva) <1:
jos rivi [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]

Toivottavasti pidit tästä opetusohjelmasta, ja tietysti jätän sinulle linkin botini koodiin, jotta näet sen koodin kokonaisuudessaan ja näet paremmin, miten se toimii (vaikka olen poistanut joitain komentoja henkilökohtaiseen käyttöön).

CalicoBot


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   auroszx dijo

    Heh, en voinut unohtaa Botin härkätaistelua, jolla ratsastat IRC: llä 😛 Erittäin mielenkiintoinen artikkeli.

  2.   Lopettaa dijo

    Hyvin yksinkertainen ja selkeä selitys.
    Entä jos, python-koodista puuttuu kaikki sisennys.

  3.   rafa dijo

    Erinomainen artikkeli ja kuinka helppoa on muodostaa yhteys IRC: hen botin ohjelmoimiseksi:)…

    Se muistuttaa minua niistä hetkistä, jolloin tunsimme, että ohjelmoijat kirjoittavat skriptejä mIRC: lle chatissa MSN: ssä tai MSNGroupsissa.

  4.   truko22 dijo

    Mielenkiintoista, pidän sen 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    hyvä!

  6.   elynx dijo

    Erittäin hyödyllinen, kiitos Son_Link!

    Tervehdys!

  7.   dbillyx dijo

    Kippis…

    seuraamalla linjojasi ja testaamalla ainoa toimiva asia on
    tuontipistoke
    tuo merkkijono

    HOST = »paikallinen isäntä»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Etusivu»
    readbuffer = »»
    s = pistorasia. pistorasia ()
    s.connect ((HOST, PORTTI))
    s.send ("NICK% srn"% NICK)
    s.send ("USER% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("LIITY:% srn"% CHAN)

    kanavan ja nickin vaihtaminen nyt alla heittää virheilmoituksen

    Kysyin muilta tuttavilta ja he kertoivat minulle, että se ei näytä pythonilta

    En tiedä mitä teen väärin tai miksi kopioin kaiken ja liitän sen pythoniin ja annan sille syötteen ja se muodostaa yhteyden kanavaan, mutta 250 sekunnin kuluttua kanava poistaa sen, koska pongista ei ollut vastausta ...

  8.   pinfry dijo

    Koko koodi ei toimi minulle, viimeinen kappale epäonnistuu enkä löydä virhettä. Jos poistan kyseisen osan, se yhdistyy ja toimii täydellisesti. Testattu Python 2.7.3: lla Windows 7: ssä.

    PS: Minun tapauksessani muodostan yhteyden palvelimeen salasanalla ja lisäät nämä rivit:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Delfiini dijo

    Hei Son Link, kiitos paljon artikkelista, se on erittäin mielenkiintoinen, en vain voi vastata lähetettyihin komentoihin. Ohjelma ei mene viimeiseen kohtaan if enkä voi selvittää miksi: "if len (line)> 1:"
    Odotan vastaustasi.
    kiitos