Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » [IRC]Bot que responda Responder al tema
Nuevo tema


Página 1 de 2  [ 29 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2009-12-09 14:22 @640

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
[IRC]Bot que responda
Bueno, quisiera saber un módulo completo que me ayude a hacer lo siguiente:

* Entrar al irc, claro.
* Mandar un mensaje a un usuario que entre, p.ej.: Bienvenido usuario 'x'.

Quisiera poder crearle funciones al Bot, y que me responda, p.ej.:
* Una función que sume, que podría llamarla así: !suma 1+2 Y él me respondería y me daría el resultado; claro, estaré, pasándoles los comandos por el irc, en este caso fue !suma.

* También para modificarlo que me responda solo a mi los comandos y no a cualquiera.

PD: Los comandos los mandaré por el irc que ya estarían programados; y acepto sugerencias.


Última edición por explorer el 2009-12-09 14:39 @652, editado 1 vez en total
Ortografía


Nota 2009-12-09 15:23 @683
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
Bienvenido a los foros de Perl en Español, yoya5682.

No eres el único ni el primero que ha sacado el tema de los Bots para IRC.

De momento, echa un vistazo al último comentario sobre el asunto.

También puedes mirar un desarrollo completo de un IRC escrito en Perl, hecho por el usuario MidNight (y unos mensajes más abajo, el del usuario ubuntu).

También el usuario kamikaze mandó una cuestión referente a POE::Component::IRC, que es la forma moderna de controlar todo lo relacionado con IRC.

_________________
JF^D Perl programming


Nota 2009-12-09 16:57 @748

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Oka, vamos al paso creando el irc bot. Bueno, aquí ya tengo este pedazo
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use POE::Component::IRC;
  2.  
  3. #Escribimos el nombre del bot Y la direccion del irc
  4. $nick = 'Yoya-Bot';
  5. $serve = 'irc.perl.org';
  6. $ircname = 'ircnode.com';
  7.  
  8. #Canales
  9. my $irc = POE::Component::IRC->spawn(
  10.     nick => $nick,
  11.     ircname => $ircname,
  12.     server => $server,
  13.  ) || die "Coneccion fallida";


El problema es que no sé si se conecta y tampoco sé cómo le haría para conectarme a un canal luego.


Última edición por explorer el 2009-12-09 19:29 @854, editado 1 vez en total
Ortografía


Nota 2009-12-09 19:33 @856
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
¡Uuuyyyy!... así no se hacen las cosas, con POE... :)

Para programar en POE, hay que entender unos cuantos conceptos, y no son nada triviales. Y no se aprenden en una tarde (quizás en tres).

Solo tienes que mirar la sinopsis del módulo POE::Component::IRC para ver un ejemplo completo.

_________________
JF^D Perl programming


Nota 2009-12-10 16:00 @708

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Oka, he estado viendo algunos irc bot y encontre este, lo he modificado y cortado hasta la parte que entiendo.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $servidor = "irc.com";
  2. $puerto = "6667";
  3. $nick = "Lex";
  4. $admin = "Yoya";
  5. $lex = "Lex";
  6. $canales = ":#canal";
  7. $conectado = 0;
  8. $comandos = "No hay todavia";
  9. ###############
  10.  
  11. use IO::Socket;
  12.  
  13. $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
  14.  
  15. &IRCSend ("NICK $lex");
  16. &IRCSend ("USER Lex-Bot es tu amigo");
  17.  
  18. while($conexion=<$socket>)
  19. {
  20. print $conexion;
  21.  
  22. if ($conexion=~/PING :/)
  23. {
  24.         &IRCSend ("PONG $'");
  25.         $conectado = 1;
  26. }
  27.  
  28. if ($conectado == 1)
  29. {
  30.         ######### Entrar a canales #########
  31.         if ($conexion=~/001/)
  32.         {
  33.                 @canaless = split(/:/ , $canales);
  34.                 for($i=0;$i<@canaless;$i++)
  35.                 {
  36.                 &JOIN("$canaless[$i]");
  37.                 }
  38.         }
  39. }
  40. }
  41.  
  42.  
  43. sub IRCSend { print $socket "$_[0]\n"; }
  44. sub JOIN { IRCSend("JOIN $_[0]\n"); }


Oka, lo que quiero es tratar que me responda los comandos o parámetros que le envío. Espero que sepas lo que trato de decir, también al principio del post lo he dicho.


Última edición por yoya5682 el 2009-12-13 21:47 @949, editado 2 veces en total

Nota 2009-12-10 16:09 @714
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
¿Ese código lo has hecho tu?

Se parece mucho a este, que está más completo. Te faltan muchas cosas ahí.

También se comenta aquí.

_________________
JF^D Perl programming


Nota 2009-12-10 16:21 @723

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Solo miré para que pueda entrar al irc, luego lo demás quiero ir haciéndolo yo mismo.


Última edición por explorer el 2009-12-10 17:33 @772, editado 1 vez en total
Tildes


Nota 2009-12-10 16:45 @740

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Bueno, estoy tratando de hacer que me responda pero me da problemas al ejecutar el script.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'irc';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'Lex';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13.  
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexión fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal")
  35.        #Vamos a comensar a ejecutar comandos
  36.        if ($recividos =~ m/:(.+)!(.+)@(.+)\s(.+)\s(.+)\s:(.+)\s(.+)/ig)
  37.        {
  38.        $usuario = $2;
  39.        $tipo = $4;
  40.        $donde = $5;
  41.        $comando = $6;
  42.         }
  43.        
  44. }
  45. sub envia
  46. {print $sock "$_[0]\n";
  47. }


Nota 2009-12-10 18:07 @796
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
A ver... lo que no puedes es publicar todo el código que encuentras por Internet y probar a ver si funciona. Tampoco lo que debes hacer es ir variando de código, porque entonces no resolvemos ninguno. Y lo tercero: date cuenta que estás en el foro Intermedio, así que eso implica que no vas a recibir respuestas tan claras como quisieras.

Una respuesta típica de este foro sería: en el enlace que te he puesto antes está el código COMPLETO de un bot para IRC (mensaje del día 8 de julio de 2006, y otros dos más a continuación). Así que solo te queda bajarlo, cambiar los datos de conexión al IRC en que quieres probar y ejecutarlo y ver si se conecta. Y luego, modificar el sitio del programa donde responde a los comandos del administrador. Y si salen errores, los publicas y te ayudamos.

Yo acabo de hacer eso mismo: me lo he bajado y lo estoy arreglando (para actualizarlo al Perl del 2009) y luego lo pruebo, pero es casi seguro que no tenga que hacer ningún cambio.

Tu puedes hacer lo mismo.

_________________
JF^D Perl programming


Nota 2009-12-10 18:27 @810

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Este último código que he posteado, fui yo que lo hice a base del tutorial que me pasaste al principio del post, el bot se me conecta al IRC y todo y se queda, no hay ningún problema con esa parte, ahora el problema es que al parecer no me identifica los comandos y ese es mi problema.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'ir';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'Lex';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13. $comandos = 'En este momento estan disponible los comandos: %coment.';
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexión fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal");
  35.  
  36.         #Comensamos a crear las funciones
  37.      
  38.         if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  39.         {
  40.          #Damos valores ah algunas variables  
  41.          $usuario = $2; #Tengo el usuario registrado y solo reconocera el nick registrado
  42.          $tipo = $4;
  43.          $donde = $5;
  44.          $comando = $6;
  45.          $text = $7;
  46.          #Leiendo canal y reconociendo comandos del jefe
  47.          if ($jefe eq $usuario){
  48.          
  49.          if($comandos eq "#help"){&envia($comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia
  57. {print $sock "$_[0]\n";
  58. }


Este es el código que tengo ahora mismo hecho y redacto que se conecta al IRC y todo y se mantiene, el problema es que no me identifica el comando correctamente.


Nota 2009-12-10 18:41 @820
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
Bueno, pues ya está... lo he arreglado. No tiene en cuenta todos los casos de conexión, pero al menos me entra en un canal y puedo mandarle órdenes.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # Codeado por Firos - Staff
  3. use strict;
  4. use warnings;
  5.  
  6.  
  7. #####DATOS#####
  8. my $servidor = 'irc.freenode.net';
  9. my $puerto   = "6667";
  10. my $nick     = "robot";
  11. my $admin    = "jferrero";
  12. my $sn00py   = "robot";
  13. my $canales  = "#perlenespanol";
  14. my $comandos = "Los comandos actualmente disponibles son: !kick, !ban, !unban, !voice, !devoice, !quit, !part, !join, !commands, !op, !deop. Para poder utilizarlos has de tener privilegios sobre el bot.";
  15. ###############
  16.  
  17. use IO::Socket;
  18.  
  19. my $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
  20.  
  21. &IRCSend ("NICK $sn00py");
  22. &IRCSend ("USER la madre que lotrajo");
  23.  
  24. my $conectado = 1;
  25.  
  26. while(my $conexion = <$socket>)
  27. {
  28.     print $conexion;
  29.  
  30.     if ($conexion=~/PING :/)
  31.     {
  32.         &IRCSend ("PONG $'");
  33.         $conectado = 1;
  34.     }
  35.  
  36.     if ($conectado == 1)
  37.     {
  38.         ######### Entrar a canales #########
  39.         if ($conexion=~/001/)
  40.         {
  41.             sleep 2;
  42.             my @canales = split(/:/ , $canales);
  43.             for(my $i = 0; $i < @canales; $i++)
  44.             {
  45.                 print "Entrando en $canales[$i]\n";
  46.                 &JOIN("$canales[$i]");
  47.             }
  48.             $conectado = 2;
  49.         }
  50.     }
  51.  
  52.     if ($conectado == 2)
  53.     {
  54.         ######### Aqui empieza la identificacion/ejecución de comandos ###########
  55.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.*)/)
  56.         {
  57.             my $quien = $1; my $comandoserv = $4; my $donde = $5; my $comando = $6; my $patron = $7;
  58.  
  59.             ######### Comandos de canal ########
  60.             if ($quien eq $admin)
  61.             {
  62.                 if    ($comando eq "!commands") { PRIVMSG("$donde" , $comandos); }
  63.                 elsif ($comando eq "!op") { &IRCSend("MODE $donde +o $patron"); }
  64.                 elsif ($comando eq "!deop") { &IRCSend("MODE $donde -o $patron"); }
  65.                 elsif ($comando eq "!join") { &IRCSend("JOIN :$patron"); }
  66.                 elsif ($comando eq "!quit") { &IRCSend("QUIT :$patron"); }
  67.                 elsif ($comando eq "!kick") { &IRCSend("KICK $donde :$patron"); }
  68.                 elsif ($comando eq "!ban") { &IRCSend("MODE $donde +b :$patron"); }
  69.                 elsif ($comando eq "!unban") { &IRCSend("MODE $donde -b :$patron"); }
  70.                 elsif ($comando eq "!voice") { &IRCSend("MODE $donde +v :$patron"); }
  71.                 elsif ($comando eq "!devoice") { &IRCSend("MODE $donde -v :$patron"); }
  72.                 elsif ($comando eq "!part") { &IRCSend("PART $donde :$patron"); }
  73.             }
  74.         }
  75.  
  76.         ######## Lectura/ejecución por query #########
  77.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\sPRIVMSG\s$sn00py\s\:(\S*)\s(\S*)\s(.*)/)
  78.         {
  79.             my $quien = $1; my $comando = $4; my $canal = $5; my $patron = $6;
  80.  
  81.             if ($admin eq $quien)
  82.             {
  83.                 if ($comando eq "!MSG") {IRCSend("PRIVMSG $canal :$patron"); }
  84.             }
  85.         }
  86.  
  87.         ######## Rejoin #########
  88.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s(\S*)\s:(.*)/)
  89.         {
  90.             my $quien = $1; my $comandserv = $4; my $donde = $5; my $aquien = $6;
  91.             if ($comandserv eq "KICK") { &JOIN ("$donde"); }
  92.         }
  93.  
  94.     }
  95.  
  96.     ######## Random NICK #########
  97.     if ($conexion=~/^\:(\S*)\s433\s(.*)\s$sn00py(.*)/)
  98.     {
  99.         $sn00py .= int(rand(999));
  100.         &IRCSend ("NICK :$sn00py");
  101.         $conectado = 1;
  102.     }
  103. }
  104.  
  105. ####### Subrutinas ########
  106. sub IRCSend { print $socket "$_[0]\n"; }
  107. sub JOIN { IRCSend("JOIN $_[0]\n"); }
  108. sub PRIVMSG { IRCSend ("PRIVMSG $_[0] :$_[1]"); }

_________________
JF^D Perl programming


Nota 2009-12-10 18:59 @832

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
Tengo este ya, creo que he avanzado un poco, ahora el problema es que cuando escribo #help, el bot no me responde, y mi nick de usuario está bien.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'irc';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'LexeT';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13. $comandos = "En este momento estan disponible los comandos: %coment";
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexión fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal");
  35.        
  36.         #Comensamos a crear las funciones
  37.         #:Yoyahack!Yoyahack@11CAD795.7DE4D367.EBAEFD4.IP PRIVMSG #undersec :a
  38.         if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  39.         {
  40.          #Damos valores ah algunas variables  
  41.          $usuario = $1;
  42.          $tipo = $4;
  43.          $donde = $5;
  44.          $comando = $6;
  45.          $text = $7;
  46.          #Leiendo canal y reconociendo comandos del jefe
  47.          if ($jefe eq $usuario){
  48.          
  49.          if($comandos eq "#help"){&msg("$donde", $comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia {print $sock "$_[0]\n";}
  57. sub msg{ envia("PRIVMSG $_[0] :$_[1]");}


Última edición por explorer el 2009-12-10 19:07 @838, editado 1 vez en total
Ortografía


Nota 2009-12-10 19:08 @839
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
¿No has probado el bot que he mandado? Ya está completo.

_________________
JF^D Perl programming


Nota 2009-12-10 20:17 @886

Perlero Nuevo
Registrado: 2009-12-09 14:13 @634
Mensajes: 9
Re: [IRC]Bot que responda
¡Eh!, sí, el tuyo funciona, pero el tuyo es un poco raro, por eso quiero que el mio sea raro igual. Bueno, ahora lo que hice fue meter dentro del if() algo para que lo imprima; así sé si el if() se cumplió correctamente y al parecer no se cumplió correctamente. Aquí te dejo el code para que me digas cual es mi error.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'irc';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'LexeT';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13. $comandos = "En este momento estan disponible los comandos: %coment";
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexi√≥n fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal");
  35.        
  36.         #Comensamos a crear las funciones
  37.        
  38.         if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  39.         {
  40.          #Damos valores ah algunas variables  
  41.          $usuario = $1;
  42.          $tipo = $4;
  43.          $donde = $5;
  44.          $comando = $6;
  45.          $text = $7;
  46.          &msg("$donde", $comandos);         #Leiendo canal y reconociendo comandos del jefe
  47.          if ($jefe eq $usuario){
  48.          
  49.          if($comando eq "#help"){&msg("#undersec", $comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia {print $sock "$_[0]\n";}
  57. sub msg{ envia("PRIVMSG $_[0] :$_[1]");}


PD: lo agregué en la linea 46; si te fijas no imprime porque la condición if() no se cumple al parecer y ahí debe estar el problema...


Última edición por explorer el 2009-12-11 04:14 @218, editado 1 vez en total
Ortografía


Nota 2009-12-11 05:58 @290
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: [IRC]Bot que responda
El error está en la línea

&envia("join $canal");

Esa línea debería ir en la parte de conexión inicial. Tal como la tienes ahí fuera, la estás ejecutando a cada momento, por lo que algunos IRC se cansarán y te echarán fuera.

Para saber si el programa traduce bien las líneas que recibe, coloca un print() justo antes de &msg("$donde", $comandos);, con todas las variables, para ver qué valores almacenan. Así sabrás si entra ahí y qué valores son. Y de ahí, saber por qué no entra en el siguiente if().

Actualización: Lo que sí veo mal es que tenga un /g al final. Quítalo.

_________________
JF^D Perl programming


Responder al tema  [ 29 mensajes ]  Ir a página 1, 2  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO