Vandaag ga ik je leren hoe je een snuit voor IRC. Allereerst, voor degenen die het niet weten, is een bot een programma dat verbinding maakt met een IRC-kanaal en ermee communiceert, waardoor we bijvoorbeeld het kanaal kunnen modereren zonder dat we verbonden zijn en dus spam vermijden, of dat het een reeks bestellingen herkent en de bijbehorende code uitvoert.
Hoewel er al bots klaar zijn, ben ik eerlijk gezegd een van degenen die graag hun eigen programma's maken om te leren en de grote voldoening die het ons geeft nadat we hebben gezien dat het werkt ^^
Met dat gezegd, gaan we verder met de tutorial.
Om de bot te programmeren hebben we een platte teksteditor elk (nano, gedit, medit, enz.) en python-tolk (2.6 of 2.7 is nodig, werkt niet met python 3.x).
Eerst importeren we het vereiste modules, in dit geval hebben we er maar twee nodig:
[code] #! / usr / bin / env python# - * - codering: utf-8 - * -
import stopcontact
tekenreeks importeren
[/ Code]
Nu gaan we verder configureren de bot:
[code] HOST=»irc.desdelinux.netto"PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
[/ Code]
Ik zal elke variabele uitleggen:
- HOST: De URL van de server waarmee we verbinding zullen maken
- HAVEN: De serverpoort. Standaard is dit 6667.
- NICK, IDENT en REALNAME: Ze komen overeen met de bijnaam van de bot, zijn identificatie en de echte naam.
- KANAAL: Het kanaal dat de bot zal betreden
- leesbuffer: In deze variabele worden de gegevens die door de server zijn verzonden, opgeslagen.
Zodra onze bot is geconfigureerd, gaan we verder met de connectie
[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 ("JOIN:% s \ r \ n"% CHAN)
[/ Code]
De eerste regel heeft niet veel mysterie, de tweede creëert de server verbinding en de laatste drie sturen de gegevens van de bot naar de server om door te gaan met inloggen.
Eenmaal verbonden zullen we een Oneindige lus waarin we zullen gaan ontvangen en verzenden van gegevens van / naar de server:
[code] while 1:readbuffer = readbuffer + s.recv (1024)
temp = string.split (leesbuffer, "\ n")
readbuffer = temp.pop ()
voor lijn in temp:
line = string.rstrip (lijn)
line = line.split (CHAN + ':')
if regel [0] .find ("PING")! = -1:
pingid = regel [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/ Code]
Van alle regels die hierboven zijn geschreven, zal ik alleen ingaan op de belangrijkste.
met line = line.split (CHAN + ':') wat we doen is verdelen wat de server ons wanneer stuurt laten we iets van het kanaal halen.
De volgende regel geeft bijvoorbeeld aan dat iemand iets op het kanaal heeft geschreven:
:[email protected] PRIVMSG #Home :Hola ^^
De eerste is de bijnaam van de gebruiker en zijn verbindingsgegevens (gescheiden door!), Het commando (in dit geval geeft het aan dat hij schreef), het kanaal en tenslotte, na de dubbele punt, het verzonden bericht. Ik zal niet veel meer commando's uitleggen aangezien dat niet binnen deze tutorial valt.
De andere belangrijke regels zijn die ze zijn na de if. De server stuurt af en toe het PING-commando om te controleren of de gebruiker nog steeds verbonden is. In dat geval stuurt de bot het PONG-commando met een ID die PING heeft verzonden om aan de server aan te geven dat hij nog steeds verbonden is.
Hiermee hebben we al de basis van de bot. Nu zal ik verder gaan met uitleggen hoe we de bot kunnen laten reageren zoals we willen op bepaalde commando's, zowel van IRC zelf als van gebruikers.
Reageren op IRC-opdrachten:
PING en PRIVMSG zijn voorbeelden van IRC-opdrachten. Er zijn veel commando's, maar zoals ik al eerder zei, het is iets waar ik niet in detail op zal ingaan.
We kunnen de bot bijvoorbeeld hallo laten zeggen tegen gebruikers die verbinding maken:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK en name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welkom @% s ^^ \ n"% (CHAN, naam))
[/ Code]
Eerst kijken we of de server het commando verstuurt AANMELDEN wat aangeeft dat iemand verbinding heeft gemaakt met de server. Vervolgens extraheren we de nickname, we controleren of de nick niet de IRC-url is (zo niet zodra we de bot starten, zal het de url begroeten) en als laatste sturen we de begroeting.
Bot-opdrachten:
Hoe maak ik nu mijn bot reageer op mijn eigen bevelen? Laten we beter naar een voorbeeld kijken:
[code] if line [1] == '$ version':s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]
In dit voorbeeld als iemand schrijft $ versie de bot zal het bericht tonen met zijn naam, versie en auteur. De volledige code van het voorbeeld is deze:
[code] socket importerentekenreeks importeren
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 ("JOIN:% s \ r \ n"% CHAN)
terwijl 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (leesbuffer, "\ n")
readbuffer = temp.pop ()
voor lijn in temp:
print lijn
line = string.rstrip (lijn)
line = line.split (CHAN + ':')
if regel [0] .find ("PING")! = -1:
pingid = regel [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
if regel [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK en name.find (HOST) == -1:
s.send ("PRIVMSG% s: Welkom @% s ^^ \ n"% (CHAN, naam))
if len (lijn) <1:
if regel [1] == '$ versie':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/ Code]
Ik hoop dat je deze tutorial leuk vond, en natuurlijk laat ik je de link naar de code van mijn bot, zodat je de code volledig kunt zien en je beter kunt zien hoe het werkt (hoewel ik enkele commando's heb verwijderd voor persoonlijk gebruik).