Creacion de un IRC Bot

Anuncio
[Titulo] : Creacion de un IRC Bot
[Lenguaje] : Delphi
[Autor] : Doddy Hackman
[Temario]
-- =================-------0x01 : Introduccion
0x02 : Conectando con el servidor
0x03 : Listando usuarios
0x04 : Mandar mensajes
0x05 : Recibir privados
0x06 : Reconocer comandos
0x07 : Testeando
0x08 : Bibliografia
-- =================--------
0x01 : Introduccion
Bueno , voy a empezar este manual sobre como hacer un bot irc.
Para este manual necesitan tener instalado TIdIRC y TPerlRegEx en Delphi , el primero me vino
por defecto en Delphi 2010 y el segundo lo pueden bajar e instalar aca
Nota : Proximamente presentare mi irc bot llamado Claptrap en honor al robot de bordelands xDD.
¿ Que es IRC ?
Segun wikipedia , IRC (Internet Relay Chat) es un protocolo de comunicación en tiempo real
basado en texto, que permite debates entre dos o más personas. Se diferencia de la mensajería
instantánea en que los usuarios no deben acceder a establecer la comunicación de antemano, de
tal forma que todos los usuarios que se encuentran en un canal pueden comunicarse entre sí,
aunque no hayan tenido ningún contacto anterior. Las conversaciones se desarrollan en los
llamados canales de IRC, designados por nombres que habitualmente comienzan con el carácter #
o & (este último sólo es utilizado en canales locales del servidor). Es un sistema de charlas
ampliamente utilizado por personas de todo el mundo.
0x02 : Conectando con el servidor
Lo de siempre , creamos un proyecto nuevo de la siguiente forma : File->New->VCL Forms
Application , como en la siguiente imagen.
Una vez hecho esto vamos a crear la interfaz para todo el manual.
Lo que vamos a necesitar es usar :
6 Labels
3 Edit
3 Botones
1 ListBox (para los usuarios conectados)
2 Memo
Y los componentes TPerlRegEx y IdIRC
Una imagen de como deberia quedar :
Una vez hecho esto llego la hora de realizar la conexion , entonces hacemos doble click en el boton
de "conectar" o el nombre que le pusieron ustedes para poner el siguiente codigo :
procedure TForm1.Button1Click(Sender: TObject);
begin
IdIRC1.Host := Edit1.Text; // Usamos el contenido de Edit1 para
reconocer el host a conectarse
IdIRC1.Port := 6667; // Usamos 6667 para el puerto del host
IdIRC1.Nickname := Edit3.Text; // Usamos el contenido de Edit3.Text
como nickname
IdIRC1.Username := Edit3.Text + ' 1 1 1 1';
// Declaramos el username para entrar
IdIRC1.AltNickname := Edit3.Text + '-123'; // Declaramos el nick
alternativo
try // Intentamos hacer esto ....
begin
IdIRC1.Connect; // Iniciamos la conexion
IdIRC1.Join(Edit2.Text); // Usamos Edit2 como el nombre del canal
a entrar
end;
except // Si algo sale mal ...
begin
ShowMessage('Error'); // Mostramos error con ShowMessage()
end;
end;
end;
Una imagen de como quedo :
Con esto ya tenemos la conexion entonces usamos el segundo boton llamado "desconectar" o el
nombre que ustedes le pusieron , hacemos doble click y agregamos este codigo :
procedure TForm1.Button2Click(Sender: TObject);
begin
IdIRC1.Disconnect; // Nos desconectamos del canal en el que
estamos
end;
Se podria decir que con esto ya tenemos para conectarnos y desconectarmos del canal sin ningun
problema.
Pero para variar las cosas vamos a usar el memo1 como consola de las cosas que pasan durante la
conexion , entonces vamos al diseño del formulario , buscamos el IdIRC1 , le hacemos un solo click
y nos fijamos en object inspector para despues ir
a la parte de eventos , buscamos el evento OnRaw , le hacemos doble click y agregamos este codigo
:
procedure TForm1.IdIRC1Raw(ASender: TIdContext; AIn: Boolean;
const AMessage: string);
begin
Memo1.Lines.Add(AMessage); // Agregamos al memo1 lo que AMessage
recibe
end;
Una imagen de donde esta la parte del evento y de paso muestro como quedo el codigo :
Eso seria la parte de como conectarnos y desconectarnos de un canal irc.
0x03 : Listando usuarios
Esta es la parte en la que usamos PerlRegEx , que es un componente que nos permite usar las
expresiones regualares de Perl en Delphi.
Entonces buscamos el evento "NicknamesListReceived" en el componente IdIRC1 que esta en el
formulario para hacer doble click en el evento y poner el siguiente codigo.
procedure TForm1.IdIRC1NicknamesListReceived
(ASender: TIdContext; const AChannel: string; ANicknameList:
TStrings);
var
i: integer; // Declaramos i como entero
i2: integer; // Declaramos i2 como entero
renicks: string; // Declaramos renicks como string
listanow: TStringList; // Declaramos listanow como StringList
arraynow: array of String; // Declaramos arraynow como array of
string
begin
ListBox1.Clear; // Limpiamos el contenido de ListBox1
for i := 0 to ANicknameList.Count - 1 do // Listamos con for los nicks
que se encuentran
// en ANicknameList
begin
PerlRegEx1.Regex := '(.*) = ' + Edit2.Text + ' :(.*)';
// Establecemos la expresion regular
// a usar
PerlRegEx1.Subject := ANicknameList[i]; // Buscamos el nick en
ANicknameList
if PerlRegEx1.Match then // Si perlregex encuentra algo ...
begin
renicks := PerlRegEx1.SubExpressions[2]; // Declaramos como
renicks el segundo resultado de
// la expresion regular
renicks := StringReplace(renicks, Edit3.Text, '', []);
// Borramos de renicks el nombre
// de nuestro bot
listanow := TStringList.Create; // Declaramos como TStringList a
listanow
listanow.Delimiter := ' '; // Establecemos que se busque los nicks
entre espacios en blanco
listanow.DelimitedText := renicks; // Realizamos la busqueda
for i2 := 0 to listanow.Count - 1 do // Listamos la lista 'listanow'
que contiene los nicks
begin
ListBox1.Items.Add(listanow[i2]); // Agregamos a ListBox1 los
nicks encontrados
end;
end;
end;
end;
Les dejo una imagen de como nos deberia quedar el codigo y de donde esta el evento que usamos.
0x04 : Mandar mensajes
Mandar mensajes usando el componente de indy es muy facil , solo tenemos que hacer doble click
en el tercer boton , en mi caso le puse de texto "spam now" , ustedes pueden
ponerle el que quieran , cuando este en el codigo del formulario en la parte del tercer boton pongan
el siguiente codigo.
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer; // Declaramos i como entero
begin
IdIRC1.Say(Edit2.Text, 'hola publico'); // Mandamos un mensaje
publico al canal en el que
// estamos
for i := 0 to ListBox1.Count - 1 do // Abrimos los items de listbox
usando un for
begin
IdIRC1.Say(ListBox1.Items[i], 'hola privado');
// Mandamos un privado al nick de la lista
end;
end;
Una imagen de como les deberia quedar el codigo :
0x05 : Recibir privados
Otra cosa facil de hacer gracias a el componente de indy es que se pueden recibir y leer los
mensajes privados que nos mandan , para hacer esto vamos al evento OnPrivateMessage de IdIRC y
ponemos
el siguiente codigo.
procedure TForm1.IdIRC1PrivateMessage(ASender: TIdContext; const
ANicknameFrom,
AHost, ANicknameTo, AMessage: string);
begin
Memo3.Lines.Add(ANicknameFrom + ' : ' + AMessage); // Mostramos en el
memo3 el nickname
// de quien nos esta mandando el mensaje y ':' que separa el nick
del mensaje que nos
// enviaron
end;
Una imagen de donde esta el evento y como quedo el codigo.
0x06 : Reconocer comandos
Esta es la parte mas importante en un irc bot , que es para poder mandar comandos al bot o hacer
cierta cosa como un SQLiScanner o AdminFinder u otra cosa para dichoso
Defacing.
Para hacer esto nos vamos a basar en mensajes privados , de esa forma no estamos delatando al bot
en el canal publico , entonces volvemos al evento OnPrivateMessage del punto
anterior para actualizarlo con este codigo nuevo :
procedure TForm1.IdIRC1PrivateMessage(ASender: TIdContext; const
ANicknameFrom,
AHost, ANicknameTo, AMessage: string);
begin
Memo3.Lines.Add(ANicknameFrom + ' : ' + AMessage);
// Mostramos en el memo3 el nickname
// de quien nos esta mandando el mensaje y tambien ':' que separa
el nick del mensaje que nos
// enviaron
PerlRegEx1.Regex := '!help'; // Usamos esta linea para comprobar si
AMessage contiene !help
PerlRegEx1.Subject := AMessage; // Buscamos en AMessage
if PerlRegEx1.Match then // Si se encontro ....
begin
IdIRC1.Say(ANicknameFrom,
'el comando disponible es : !scanear <cmd1> <cmd2>');
// Respondemos
// con el unico comando disponible
end;
PerlRegEx1.Regex := '!scanear (.*) (.*)'; // Capturamos lo que se
encuentre a la derecha de
// !scanear y hacemos un espacio para capturar lo que
// esta al lado de lo que encontramos
// en realidad son dos comandos
PerlRegEx1.Subject := AMessage; // Buscamos los dos comandos en
AMessage que
// contiene el mensaje que nos estan enviando
if PerlRegEx1.Match then // Si se encontro algo ...
begin
IdIRC1.Say(ANicknameFrom, 'comando 1 : ' +
PerlRegEx1.SubExpressions[1]);
// Le respondemos
// al que nos envio el mensaje privado con el valor del primer
comando que nos envio
IdIRC1.Say(ANicknameFrom, 'comando 2 : ' +
PerlRegEx1.SubExpressions[2]);
// Le respondemos
// al que nos envio el mensaje privado con el valor del segundo
comando que nos envio
end;
end;
Una imagen de donde esta el evento y de como quedo el codigo.
0x07 : Testeando
Una vez hecho todo esto podemos probar como quedo todo , les dejo unas imagenes que de como
funciona.
Eso seria todo
0x08 : Bibliografia
http://es.wikipedia.org/wiki/Internet_Relay_Chat
http://delphiallimite.blogspot.com.ar/2007/09/creando-un-cliente-de-chat-irc-con-indy_18.html
http://delphiallimite.blogspot.com.ar/2007/09/creando-un-cliente-de-chat-irc-con-indy.html
--========-The End ?
--========--
Descargar