Creando un irc bot en perl
Autor:Doddy
Indice:
0x01:Introduccion
0x02:Pensando el programa
0x03:Empezando el trabajo
0x04:Agregandole comandos
0x05:Testeando el programa
0x06:Despedida
0x01:Introduccion
Hola a todos.
El otro dia vi el bot de alphanix , ese tio si que era bueno en perl , pero luego me di cuenta de que a muchas personas les pasaba que no entendian como crear un bot en perl con sockets. Pues eso me dio la idea de hacer este manual.
Asi que adelante.
0x02:Pensando el programa
La idea de crear un bot irc a veces es complicada , hay que tener en cuenta los datos necesarios para
realizar la conexion al servidor irc en el puerto 6667 , ademas de conocer el salon especifico en el que bot nacera xD, tambien si el bot es baneado o el nick que el bot posee no esta permitido todo el programa se iria al carajo , tambien hay que tener en cuenta de que el bot registre todo lo que pase y que detecte los comandos que le enviariamos.
Entonces como hay que realizar muchas confirmaciones o devolver el odioso ping pong usando los modulos io::socket asi que vamos a ir de a poco.
Pasemos al siguiente paso.........
0x03:Empezando el trabajo
Antes que nada lo que tenemos que hacer es llamar al modulo necesario para esto:
Código:
Código:
use IO::Socket;
Despues de esto lo que necesitamos es crear las variables necesarias con los datos necesarios
Código:
Código:
my $servidor = "127.0.0.1"; #Servidor IRC
my $canal = "#locos"; #Canal IRC del servidor especificado
my $nick = "Lepuke-Slave"; # Apodo del bot
my $port = "6667"; # Puerto del servidor IRC
Terminando esto , ya tendriamos las variables necesarias para acceder al servidor IRC , obviamente modifican los datos por los de su servidor IRC.
Ahora empezamos a usar el modulo IO::Socket
Código:
my $soquete = new IO::Socket::INET( PeerAddr =>$servidor,
PeerPort => $port,
Proto => 'tcp' );
Verificamos si la conexion da error
Código:
if (!$soquete) {
print "\nNo se puedo conectar en $servidor $port\n";
exit 1;
}
Ahora mandamos los datos necesarios al servidor para la conexion
Código:
print $soquete "NICK $nick\r\n";
print $soquete "USER $nick 1 1 1 1\r\n";
print $soquete "JOIN $canal\r\n";
Ahora usamos while para capturar todo lo que pasa en el servidor conectado. Entonces como capturamos todo lo que hay en el servidor podemos realizar el maldito ping pong para terminar con la conexion y entrar al servidor
Código:
while ( my $log = <$soquete> ) {
chomp($log);
if ($log =~ /^PING(.*)$/i){
print $soquete "PONG $1\r\n";
}
} # Fin de while
Con esto ya estariamos en el servidor IRC conectados exitosamente.
0x04:Agregandole comandos
OK , ahora pasamos a lo mejor, ¿entonces que queremos que haga nuestro bot ?
Como no quiero irme demasiado del tema este bot solo hara las siguientes funciones:
*Codificaciones md5
*Codificador ascii
*Codificador hex
Bueno solo codificaciones por ahora xD.
Entonces en el while anterior le vamos a agregar los comandos de la siguiente manera
Código:
while ( my $log = <$soquete> ) {
chomp($log);
if ($log =~ /^PING(.*)$/i){
print $soquete "PONG $1\r\n";
}
if($log =~ m/:!md5 (.*)$/g) {
my $palabra = $1;
use Digest::MD5;
$re = Digest::MD5->md5_hex($palabra);
print $soquete "PRIVMSG $canal : Hash codificada => 6 $re\r\n";
}
if($log =~ m/:!ascii (.*)$/) {
my $string = $1;
$re = join ',', unpack "U*", $string; # o A* para ASCII
print $soquete "PRIVMSG $canal :Palabra codificada a ascii => 6 $re\r\n";
}
if($log =~ m/:!hex (.*)$/) {
my $x = $1;
$hex = '0x';
for (split //, $x) {
$hex .= sprintf "%x", ord;
}
print $soquete "PRIVMSG $canal : Palabra codificada a hex => 6 $hex\r\n";
}
Como ven ya creamos los comandos necesarios para que el bot responda a los comandos
!hex
!md5
!ascii
Como ven para que el bot cumpla con el comando solo hacen escriben esto en el chat con el comando que quieran
!hex hola
!md5 hola
!ascii hola
Y cada uno de esos comandos nos devolvera la codificacion especificada.
Para entender la parte de deteccion de comandos habria que aclarar que con el if buscamos con una expresion regular que , si se encuentra el comando existente lograra sacar lo que seria el argumento que seguira el comando
0x05:Testeando el programa
Ok , como yo tengo IRC Plus (servidor IRC local) , voy a probar con mi servidor irc "127.0.0.1" , ustedes deben modificar por los datos del servidor irc que quieran crear el bot.
El codigo terminado seria este
Código:
#Programa = Simple Bot IRC
#Autor = Lepuke
use IO::Socket;
my $servidor = "127.0.0.1"; #Servidor IRC
my $canal = "#locos"; #Canal IRC del servidor especificado
my $nick = "Lepuke-Slave"; # Apodo del bot
my $port = "6667"; # Puerto del servidor IRC
my $soquete = new IO::Socket::INET( PeerAddr =>$servidor,
PeerPort => $port,
Proto => 'tcp' );
if (!$soquete) {
print "\nNo se puedo conectar en $servidor $port\n";
exit 1;
}
print $soquete "NICK $nick\r\n";
print $soquete "USER $nick 1 1 1 1\r\n";
print $soquete "JOIN $canal\r\n";
while ( my $log = <$soquete> ) {
chomp($log);
if ($log =~ /^PING(.*)$/i){
print $soquete "PONG $1\r\n";
}
if($log =~ m/:!md5 (.*)$/g) {
my $palabra = $1;
use Digest::MD5;
$re = Digest::MD5->md5_hex($palabra);
print $soquete "PRIVMSG $canal : Hash codificada => 6 $re\r\n";
}
if($log =~ m/:!ascii (.*)$/) {
my $string = $1;
$re = join ',', unpack "U*", $string; # o A* para ASCII
print $soquete "PRIVMSG $canal :Palabra codificada a ascii => 6 $re\r\n";
}
if($log =~ m/:!hex (.*)$/) {
my $x = $1;
$hex = '0x';
for (split //, $x) {
$hex .= sprintf "%x", ord;
}
print $soquete "PRIVMSG $canal : Palabra codificada a hex => 6 $hex\r\n";
}
} # Fin de while
Solo lo ejecutan y listo.
Tiene un bot funcionando en la computadora que ustedes lo ejecutaron. Eso si , podrian mejorarlo y hacer que se ejecute sin ventana para poder hacer que funcione en la maquina de un idiota que este todo el dia conectado y asi ustedes pueden hacer sus maldades
0x06:Despedida
Eso seria todo. Espero que les haya gustado.
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario