miércoles, 26 de mayo de 2010

Creando un irc bot en perl

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.

No hay comentarios:

Publicar un comentario