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:
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] invoerbusinvoer 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).
12 kommentaar, los joune
Heh, ek kon nie die Bot van die snert wat jy ry op IRC mis nie 😛 Baie interessante artikel.
Baie eenvoudige en duidelike verduideliking.
Wat as die pypteken-kode al die inspringings ontbreek.
Dit is reeds opgelos ^^
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.
Interessant ek hou dit 😀
uitstekende !!
Baie nuttig, dankie Son_Link!
Groete!
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 ...
Watter weergawe van Python gebruik u?
Dit werk slegs met python 2.6 en 2.7, nie met 3.x nie
Ek sal die inskrywing verander om dit duideliker te maak.
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)
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
Ek het net die skakel by die volledige kode van die bot gevoeg, aangesien dit sommige simbole omskakel en die kode die html-kode toon.
In elk geval, ek sal probeer om alles reg te wys