[Python] Programma un bot per IRC

Oggi ti insegnerò come programmare un file museruola per IRC. Prima di tutto, per chi non lo sapesse, un bot è un programma che si collega a un canale IRC e interagisce con esso, il che ci permette, ad esempio, di moderare il canale senza che siamo collegati e quindi evitare lo spam, o che riconosce una serie di ordini ed esegue il codice corrispondente.
Nonostante ci siano già dei bot pronti, sono sinceramente uno di quelli a cui piace fare i propri programmi per imparare e la grande soddisfazione che ci dà dopo aver visto che funziona ^^

Detto questo, passiamo al tutorial.

Per programmare il bot avremo bisogno di un file editor di testo semplice qualsiasi (nano, gedit, medit, ecc.) e il interprete Python (2.6 o 2.7 saranno necessari, non funziona con python 3.x).

Per prima cosa importiamo il file moduli richiesti, in questo caso ci serviranno solo due:

[codice] #! / usr / bin / env python
# - * - codifica: utf-8 - * -

socket di importazione
stringa di importazione
[/ Code]

Ora procediamo a configurare il bot:

[codice] HOST=»irc.desdelinux.netto"
PORT = 6667
NICK = »CalicoBot»
IDENT = »CalicoBot»
REALNAME = »CalicoBot»
CHAN = »# Home»
readbuffer = »»
[/ Code]

Spiegherò ogni variabile:

  • HOST: L'URL del server a cui ci collegheremo
  • PORTA: La porta del server. Per impostazione predefinita è 6667.
  • NICK, IDENT e REALNAME: Corrispondono al nickname del bot, alla sua identificazione e al vero nome.
  • CANALE: Il canale in cui entrerà il bot
  • buffer di lettura: In questa variabile verranno salvati i dati inviati dal server.

Una volta configurato il nostro bot, procediamo con la connessione

[codice] 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]

La prima riga non ha molto mistero, la seconda crea il file connessione al server e gli ultimi tre inviano i dati del bot al server per procedere con il login.

Una volta connesso creeremo un file Ciclo infinito in cui andremo ricezione e invio di dati da / al server:

[code] mentre 1:
readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
per linea in temp:
riga = stringa.rstrip (riga)
line = line.split (CHAN + ':')

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

Di tutte le righe scritte sopra, mi limiterò a commentare quelle importanti.
Con line = line.split (CHAN + ':') quello che facciamo è dividere ciò che il server ci invia quando prendiamo qualcosa dal canale.
Ad esempio, la riga seguente indica che qualcuno ha scritto qualcosa sul canale:

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

Il primo è il nickname dell'utente e dei suoi dati di connessione (separati da!), Il comando (in questo caso indica che ha scritto), il canale e infine, dopo i due punti, il messaggio inviato. Non spiegherò molti altri comandi poiché non rientrano in questo tutorial.

Le altre linee importanti sono quelle sono dopo il se. Il server ogni tanto invia il comando PING per verificare se l'utente è ancora connesso. In questo caso, il bot invia il comando PONG con un ID che PING ha inviato per indicare al server che è ancora connesso.

Con questo abbiamo già la base del bot. Ora procederò a spiegare come far rispondere il bot in base a ciò che vogliamo a determinati comandi, sia che provengano dallo stesso IRC o dagli utenti.

Risposta ai comandi IRC:

PING e PRIVMSG sono esempi di comandi IRC. Ci sono molti comandi, ma come ho detto prima, è qualcosa di cui non entrerò nei dettagli.
Ad esempio, possiamo fare in modo che il bot saluti gli utenti che si connettono:

[codice] se riga [0] .find ('JOIN')! = -1:
nome = riga [0] .split ('!') [0] .split (':') [1] se nome! = NICK e nome.find (HOST) == -1:
s.send ("PRIVMSG% s: Welcome @% s ^^ \ n"% (CHAN, name))
[/ Code]

Per prima cosa controlliamo se il server invia il comando ISCRIVITI che indica che qualcuno si è connesso al server. Quindi estraiamo il nick, controlliamo che il nick non sia l'url dell'IRC (se non appena eseguiamo il bot saluterà l'url) e infine inviamo il messaggio di saluto.

Comandi del bot:

Ora come creo il mio bot rispondere ai miei comandi? Vediamo meglio un esempio:

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

In questo esempio se qualcuno scrive $ versione il bot mostrerà il messaggio indicandone il nome, la versione e l'autore. Il codice completo dell'esempio è questo:

[codice] import socket
stringa di importazione

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)

mentre 1:

readbuffer = readbuffer + s.recv (1024)
temp = string.split (readbuffer, "\ n")
readbuffer = temp.pop ()
per linea in temp:
linea di stampa
riga = stringa.rstrip (riga)
line = line.split (CHAN + ':')

se riga [0] .find ("PING")! = -1:
pingid = riga [0] .split () [1] s.send ("PONG% s \ r \ n"% pingid)

se riga [0] .find ('JOIN')! = -1:
nome = riga [0] .split ('!') [0] .split (':') [1] se nome! = NICK e nome.find (HOST) == -1:
s.send ("PRIVMSG% s: Welcome @% s ^^ \ n"% (CHAN, name))

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

Spero che questo tutorial ti sia piaciuto e, naturalmente, ti lascio il link al codice del mio bot in modo che tu possa vedere il suo codice per intero e puoi vedere meglio come funziona (anche se ho rimosso alcuni comandi per uso personale).

Calicobot


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   auroszx suddetto

    Eh, non potevo perdermi il Bot delle stronzate che cavalchi su IRC 😛 Articolo molto interessante.

  2.   Cessare suddetto

    Spiegazione molto semplice e chiara.
    E se al codice Python mancasse tutto il rientro.

  3.   rafa suddetto

    Ottimo articolo e com'è facile connettersi a un IRC per programmare un bot :) ...

    Mi ricorda quelle volte in cui ci sentivamo come programmatori che scrivevano script per mIRC nelle chat su MSN o MSNGroups.

  4.   camion22 suddetto

    Interessante lo tengo 😀

  5.   Genesi Vargas J. (@elprincipiodeto) suddetto

    eccellente!

  6.   elynx suddetto

    Molto utile, grazie Son_Link!

    Saluti!

  7.   dbillyx suddetto

    Saluti…

    seguendo le tue linee e testando l'unica cosa che funziona è
    socket di importazione
    stringa di importazione

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

    cambiando il canale e il nick ora il seguente mi genera la sintassi di errore

    Ho chiesto ad altri conoscenti e mi hanno detto che non sembra pitone

    Non so cosa sto sbagliando o perché copio tutto e lo incollo in python e gli do invio e si connette al canale ma dopo 250 secondi il canale lo rimuove perché non c'è stata risposta da pong ...

  8.   fritto suddetto

    Il codice completo non funziona per me, l'ultimo paragrafo è ciò che non funziona e non riesco a trovare l'errore. Se elimino quella parte, si connette e funziona perfettamente. Testato con Python 2.7.3 su Windows 7.

    PS: Nel mio caso mi collego a un server con una password e aggiungo queste righe:
    PASS = »Passdelbot»
    s.send ("PASS% s \ r \ n"% PASS)

  9.   Delfino suddetto

    Ciao Figlio Link, grazie mille per l'articolo, è molto interessante, non riesco proprio a rispondere ai comandi inviati. Il programma non va nell'ultimo se e non riesco a capire perché: "if len (line)> 1:"
    Attendo la tua risposta.
    grazie