[Python] Programează un bot pentru IRC

Astăzi am să vă învăț cum să programați un bot alin IRC. În primul rând, pentru cei care nu știu, un bot este un program care se conectează la un canal IRC și interacționează cu acesta, ceea ce ne permite, de exemplu, să moderăm canalul fără că suntem conectați și astfel evitați spamul, sau că acesta recunoaște o serie de comenzi și execută codul corespunzător.
Deși există deja roboții gata, sincer sunt unul dintre cei cărora le place să-și facă propriile programe de învățat și marea satisfacție pe care ne-o oferă după ce am văzut că funcționează ^^

Cu toate acestea, să trecem la tutorial.

Pentru a programa botul vom avea nevoie de un editor de text simplu orice (nano, gedit, medit etc.) și interpret python (2.6 sau 2.7 vor fi necesare, nu funcționează cu python 3.x).

Mai întâi importăm module necesare, în acest caz vom avea nevoie doar de două:

[cod] #! / usr / bin / env python
# - * - codare: utf-8 - * -

soclu de import
șir de import
[/cod]

Acum trecem la înființat robotul:

[cod] HOST=»irc.desdelinux.net"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Acasă»
readbuffer = »»
[/cod]

Voi explica fiecare variabilă:

  • GAZDĂ: Adresa URL a serverului la care ne vom conecta
  • PORT: Portul serverului. În mod implicit, este 6667.
  • NICK, IDENT și REALNAME: Acestea corespund poreclei botului, identificarea acestuia și numele real.
  • CHAN: Canalul în care va intra botul
  • readbuffer: În această variabilă datele trimise de server vor fi salvate.

Odată ce botul nostru este configurat, trecem la conexiunea

[cod] 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 ("ÎNSCRIEȚI:% s \ r \ n"% CHAN)
[/cod]

Prima linie nu are mult mister, a doua creează conexiune server iar ultimii trei trimit datele botului către server pentru a continua cu autentificarea.

Odată conectat, vom crea un Buclă infinită în care vom merge primirea și trimiterea datelor de la / către server:

[cod] în timp ce 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pentru linie în temp:
line = string.rstrip (line)
line = line.split (CHAN + ':')

dacă linia [0] .find ("PING")! = -1:
pingid = line [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)
[/cod]

Dintre toate rândurile scrise mai sus, voi comenta doar cele importante.
cu line = line.split (CHAN + ':') ceea ce facem este să împărțim ce ne trimite serverul când hai să luăm ceva de la canal.
De exemplu, următorul rând indică faptul că cineva a scris ceva pe canal:

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

Primul este porecla utilizatorului și datele sale de conexiune (separate prin!), Comanda (în acest caz indică faptul că a scris), canalul și în final, după două puncte, mesajul trimis. Nu voi explica multe alte comenzi, deoarece aceasta nu se încadrează în acest tutorial.

Celelalte linii importante sunt cele sunt după if. Serverul trimite din când în când comanda PING pentru a verifica dacă utilizatorul este încă conectat. În acest caz, botul trimite comanda PONG cu un ID pe care PING l-a trimis pentru a indica serverului că este încă conectat.

Cu aceasta avem deja baza botului. Acum voi continua să explic cum să facem robotul să răspundă în funcție de ceea ce dorim la anumite comenzi, indiferent dacă sunt de la IRC în sine sau de la utilizatori.

Răspuns la comenzile IRC:

PING și PRIVMSG sunt exemple de comenzi IRC. Există multe comenzi, dar așa cum am spus mai devreme, este ceva despre care nu voi intra în detaliu.
De exemplu, putem face ca botul să spună salut utilizatorilor care se conectează:

[cod] dacă linia [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK și name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bun venit @% s ^^ \ n"% (CHAN, nume))
[/cod]

Mai întâi verificăm dacă serverul trimite comanda JOIN ceea ce indică faptul că cineva este conectat la server. Apoi extragem nick-ul, verificăm dacă nick-ul nu este URL-ul IRC (dacă nu de îndată ce executăm botul, acesta va saluta adresa URL) și în cele din urmă trimitem mesajul de salut.

Comenzi bot:

Acum, cum îmi fac bot răspunde la propriile mele comenzi? Să vedem mai bine un exemplu:

[cod] dacă linia [1] == '$ versiune':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/cod]

În acest exemplu dacă scrie cineva $ versiune robotul va afișa mesajul indicând numele, versiunea și autorul acestuia. Codul complet al exemplului este următorul:

[cod] socket de import
șir de import

HOST = »localhost»
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Acasă»
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 ("ÎNSCRIEȚI:% s \ r \ n"% CHAN)

în timp ce 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
pentru linie în temp:
linie de imprimare
line = string.rstrip (line)
line = line.split (CHAN + ':')

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

dacă linia [0] .find ('JOIN')! = -1:
name = line [0] .split ('!') [0] .split (':') [1] if name! = NICK și name.find (HOST) == -1:
s.send ("PRIVMSG% s: Bun venit @% s ^^ \ n"% (CHAN, nume))

dacă len (linie) <1:
dacă linia [1] == '$ version':
s.send («PRIVMSG% s: CalicoBot 0.1.2 (c) 2012 Son Link \ n»% CHAN)
[/cod]

Sper că ți-a plăcut acest tutorial și, desigur, îți las linkul către codul botului meu, astfel încât să îi poți vedea codul integral și să vezi mai bine cum funcționează (deși am eliminat câteva comenzi pentru uz personal).

CalicoBot


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   auroszx el a spus

    Heh, nu puteam să ratez Botul de prostii pe care îi călătorești pe IRC article Articol foarte interesant.

  2.   Înceta el a spus

    Explicație foarte simplă și clară.
    Ce se întâmplă dacă, codului python îi lipsește toată indentarea.

  3.   Rafa el a spus

    Articol excelent și cât de ușor este să vă conectați la un IRC pentru a programa un bot :)) ...

    Îmi amintește de acele vremuri când ne-am simțit ca programatorii care scriu scripturi pentru mIRC în chat-uri pe MSN sau MSNGroups.

  4.   truko22 el a spus

    Interesant îl păstrez 😀

  5.   Genesis Vargas J. (@elprincipiodeto) el a spus

    excelent !!

  6.   elynx el a spus

    Foarte util, mulțumesc Son_Link!

    Salutări!

  7.   dbillyx el a spus

    Noroc…

    urmându-vă liniile și testând singurul lucru care funcționează este
    soclu de import
    șir de import

    HOST = »localhost»
    PORT = 6667
    NICK = »CalicoBot»
    IDENT = »CalicoBot»
    REALNAME = »CalicoBot»
    CHAN = »# Acasă»
    readbuffer = »»
    s = socket.socket ()
    s.connect ((HOST, PORT))
    s.send ("NICK% srn"% NICK)
    s.send ("UTILIZATOR% s% s bla:% srn"% (IDENT, HOST, REALNAME))
    s.send ("ÎNSCRIEȚI:% srn"% CHAN)

    schimbând canalul și nick acum de mai jos îmi aruncă sintaxa erorii

    Am întrebat alți cunoscuți și mi-au spus că asta nu seamănă cu python

    Nu știu ce greșesc sau de ce copiez totul și îl lipesc în python și îi dau intrare și se conectează la canal, dar după 250 de secunde canalul îl elimină pentru că nu a existat niciun răspuns de la pong ...

  8.   pinfry el a spus

    Codul complet nu funcționează pentru mine, ultimul paragraf e ceea ce eșuează și nu pot găsi eroarea. Dacă șterg acea parte, se conectează și funcționează perfect. Testat cu Python 2.7.3 pe Windows 7.

    PS: În cazul meu, mă conectez la un server cu o parolă și adaug următoarele linii:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Delfin el a spus

    Salut, fiule Link, mulțumesc foarte mult pentru articol, este foarte interesant, pur și simplu nu pot răspunde la comenzile trimise. Programul nu intră în ultimul caz și nu-mi pot da seama de ce: "if len (line)> 1:"
    Eu aștept răspunsul tău.
    Mulţumiri