[Python] Programmeer 'n bot vir IRC

Vandag gaan ek u leer hoe om a te programmeer bot para IRC. In die eerste plek, vir diegene wat nie weet nie, is 'n bot 'n program wat aan 'n IRC-kanaal koppel en daarmee saamwerk, sodat ons byvoorbeeld die kanaal kan modereer sonder dat ons verbind is en vermy dus strooipos, of dat dit 'n reeks bestellings herken en die ooreenstemmende kode uitvoer.
Alhoewel daar reeds bots gereed is, is ek eerlik een van diegene wat graag hul eie programme wil maak om te leer en die groot bevrediging wat dit ons bied nadat ons gesien het dit werk ^^

Met dit gesê, kom ons gaan oor na die tutoriaal.

Ons benodig 'n om die bot te programmeer gewone teksredakteur cualquiera (nano, gedit, meditasie, ens.) en luislangtolk (2.6 of 2.7 sal nodig wees, werk nie met python 3.x nie).

Eerstens voer ons die vereiste modules, in hierdie geval het ons net twee nodig:

[code] #! / usr / bin / env luislang
# - * - kodering: utf-8 - * -

invoer sok
invoer string
[/ kode]

Nou gaan ons voort na opgestel die bot:

[code] HOST = »irc.fromlinux.net»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Tuis»
readbuffer = »»
[/ kode]

Ek sal elke veranderlike verduidelik:

  • Host: Die URL van die bediener waarmee ons sal koppel
  • PORT: Die bedienerpoort. Dit is standaard 6667.
  • NICK, IDENT en REALNAAM: Dit stem ooreen met die bynaam van die bot, die identifikasie daarvan en die regte naam.
  • KAN: Die kanaal waarop die bot gaan
  • leesbuffer: In hierdie veranderlike word die data wat deur die bediener gestuur word, gestoor.

Sodra ons bot ingestel is, gaan ons voort na die konneksie

[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, GASTE, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)
[/ kode]

Die eerste reël het nie veel geheim nie, die tweede skep die bedienerverbinding en die laaste drie stuur die bot se data na die bediener om voort te gaan met die aanmelding.

Sodra ons verbind is, sal ons 'n Oneindige lus waarin ons sal gaan ontvangs en stuur van data vanaf / na die bediener:

[kode] terwyl 1:
leesbuffer = leesbuffer + s.recv (1024)
temp = string.split (leesbuffer, "\ n")
leesbuffer = temp.pop ()
vir lyn in temp:
lyn = string.rstrip (lyn)
line = line.split (CHAN + ':')

as reël [0] .find ("PING")! = -1:
pingid = reël [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ kode]

Van al die bogenoemde lyne, sal ek slegs kommentaar lewer op die belangrikste.
met line = line.split (CHAN + ':') wat ons doen, is om te deel wat die bediener wanneer ons stuur kom ons haal iets uit die kanaal.
Die volgende reël dui byvoorbeeld aan dat iemand iets op die kanaal geskryf het:

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

Die eerste is die gebruiker se bynaam en verbindingsdata (geskei deur!), Die opdrag (in hierdie geval dui dit aan dat hy geskryf het), die kanaal en uiteindelik, na die dubbelpunt, die boodskap wat gestuur is. Ek sal nie veel meer opdragte verduidelik nie, aangesien dit nie binne hierdie handleiding val nie.

Die ander belangrike lyne is die is na die if. Die bediener stuur kort-kort die PING-opdrag om te kyk of die gebruiker nog gekoppel is. In hierdie geval stuur die bot die PONG-opdrag met 'n ID wat PING gestuur het om aan die bediener aan te dui dat dit nog steeds verbind is.

Hiermee het ons reeds die basis van die bot. Nou sal ek verder gaan om te verduidelik hoe om die bot te laat reageer volgens wat ons op sekere opdragte wil hê, of dit nou van IRC of van gebruikers is.

Reageer op IRC-opdragte:

PING en PRIVMSG is voorbeelde van IRC-opdragte. Daar is baie opdragte, maar soos ek al vantevore gesê het, is dit iets waaroor ek nie in detail sal ingaan nie.
Ons kan die bot byvoorbeeld hallo laat sê vir gebruikers wat verbind:

[code] as reël [0] .find ('JOIN')! = -1:
naam = reël [0] .split ('!') [0] .split (':') [1] as naam! = NICK en name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welkom @% s ^^ \ n"% (CHAN, naam))
[/ kode]

Eerstens kyk ons ​​of die bediener die opdrag stuur SLUIT wat aandui dat iemand aan die bediener gekoppel is. Dan haal ons die nick uit, kyk ons ​​of die nick nie die IRC url is nie (indien nie sodra ons die bot uitvoer nie, sal dit die url begroet) en uiteindelik stuur ons die groeteboodskap.

Botopdragte:

Nou hoe maak ek my bot reageer op my eie opdragte? Kom ons kyk beter na 'n voorbeeld:

[code] as reël [1] == '$ weergawe':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kode]

In hierdie voorbeeld as iemand skryf $ weergawe die bot sal die boodskap wys wat sy naam, weergawe en outeur aandui. Die volledige kode van die voorbeeld is die volgende:

[kode] invoerbus
invoer string

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Tuis»
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, GASTE, REALNAME))
s.send ("JOIN:% s \ r \ n"% CHAN)

terwyl 1:

leesbuffer = leesbuffer + s.recv (1024)
temp = string.split (leesbuffer, "\ n")
leesbuffer = temp.pop ()
vir lyn in temp:
druklyn
lyn = string.rstrip (lyn)
line = line.split (CHAN + ':')

as reël [0] .find ("PING")! = -1:
pingid = reël [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

as lyn [0] .find ('JOIN')! = -1:
naam = reël [0] .split ('!') [0] .split (':') [1] as naam! = NICK en name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welkom @% s ^^ \ n"% (CHAN, naam))

as len (reël) <1:
as reël [1] == '$ weergawe':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ kode]

Ek hoop dat u van hierdie handleiding gehou het, en ek laat u natuurlik die skakel na die kode van my bot sodat u die kode volledig kan sien en u beter kan sien hoe dit werk (alhoewel ek sommige opdragte vir persoonlike gebruik verwyder het).

CalicoBot


Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

12 kommentaar, los joune

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

  1.   auroszx dijo

    Heh, ek kon nie die Bot van die snert wat jy ry op IRC mis nie 😛 Baie interessante artikel.

  2.   Cesar dijo

    Baie eenvoudige en duidelike verduideliking.
    Wat as die pypteken-kode al die inspringings ontbreek.

  3.   afstammelinge dijo

    Uitstekende artikel en hoe maklik dit is om verbinding te maak met 'n IRC om 'n bot te programmeer:) ...

    Dit herinner my aan die tye toe ons soos programmeerders gevoel het toe ons skrifte vir mIRC in chats op MSN of MSNGroups geskryf het.

  4.   truko22 dijo

    Interessant ek hou dit 😀

  5.   Genesis Vargas J. (@elprincipiodeto) dijo

    uitstekende !!

  6.   elynx dijo

    Baie nuttig, dankie Son_Link!

    Groete!

  7.   dbillyx dijo

    Cheers ...

    om u lyne te volg en te toets is die enigste ding wat werk
    invoer sok
    invoer string

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

    die verandering van die kanaal en nick nou die volgende gooi my fout sintaksis

    Ek het ander kennisse gevra en hulle vertel dat dit nie soos luislang lyk nie

    Ek weet nie wat ek verkeerd doen nie en waarom ek alles kopieër en in python plak en dit enter gee, en dit kan met die kanaal verbind word, maar na 250 sekondes verwyder die kanaal dit omdat daar geen reaksie van pong was nie ...

  8.   pynappel dijo

    Die volledige kode werk nie vir my nie, die laaste paragraaf is wat misluk en ek kan die fout nie vind nie. As ek die deel uitvee, kan dit perfek verbind word. Getoets met Python 2.7.3 op Windows 7.

    PS: In my geval maak ek verbinding met 'n bediener met 'n wagwoord en voeg die volgende lyne by:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   DoLPHiN dijo

    Hallo Son Link, baie dankie vir die artikel, dit is baie interessant, ek kan net nie reageer op die gestuurde opdragte nie. Die program gaan nie in die laaste as en ek kan nie agterkom waarom: "as len (reël)> 1:"
    Ek wag op u antwoord.
    Dankie