Busindre » Blog Archive » Listar Nicks de un canal de irc-hispano con PHP (Script)

Listar Nicks de un canal de irc-hispano con PHP (Script)

June 16th, 2007 by Busindre

Curioso y útil script de vlan7 y chanchi de vlan7.blogspot.com que permite listar los usuarios (Nicks) de un determinado canal, que pertenecen a una determinada red de chat. Todo esto realizado rápidamente y de forma simple mediante PHP. El script otorga una buena base para la creación de bots de irc en este lenguaje. De no funcionar dicho código suele ser problema del servidor usado para conectar a la red de chat, que puede estar caido, o bien, que al conectar nos asigne otro subdominio para ese mismo servidor como veremos luego en unos ejemplos. En estos casos el script no funcionará correctamente y no mostrará los nicks del canal indicado.

Predicando con el ejemplo veamos quien se encuentra en el canal #Mandriva en este momento, conectando al servidor "dune.irc-hispano.org", que es al subdominio al que nos pasa automáticamente el server atreides.irc-hispano.org (Mirar abajo del artículo).

• SinnerP
• capito
• J_Vicente
• FerranOWASP
• Slack_is_Hot
• delcoyote

<?php
// botbc 2.1 Original por vlan7, mejorado por chanchi y Busindre
// http://vlan7.blogspot.com
//http://www.busindre.com

$servidor = 'dune.irc-hispano.org';
$puerto = 6667;
$nick = 'chanchi_bot';
$host = 'vlan7.blogspot.com';
$canal = '#mandriva';

$con = fsockopen($servidor, $puerto);

if (!$con) {
print ("No se ha podido conectar con $servidor en el puerto $puerto");
}
else {
fputs($con,"NICK $nick\r\n");
fputs($con,"USER chanchi_bot chanchi_bot chanchi_bot :chanchi_bot\r\n");

$salir=0;

while (!$salir) {
$read = trim(fgets($con, 1024));

if(strstr($read,'End of /WHO list'))
{$salir=1;}

//NOTA: Si hay un cambio de nombres de subdominio esta condición fallara
if(substr($read, 0, strlen($servidor)+5) == ':'.$servidor.' 352') {
$nicks = explode(" ", $read);

if($nicks[7]!=$nick){//--> AÑADIDO
print "$nicks[7]
    "
;
}//--> AÑADIDO
}

if(substr($read, 0, 6) == 'PING :') {
fputs($con, "PONG :".substr($read,6)."\r\n");
fputs($con, "JOIN ". $canal ."\r\n");//--> AÑADIDO
fputs($con, "WHO ". $canal ."\r\n");
}
if(!salir) {
$eof=feof($con);}

}
}
fclose($con);
?>

NOTA: Si el canal que queremos que sea consultado requiere de Nick registrado, el bot no podrá entrar en el canal (fputs($con, "JOIN ". $canal ."\r\n");) y no podrá ejecutar la consulta de forma correcta. Si ya tenemos un bot o un usuario con ese mismo nombre tampoco se permitirá usar al script con dicho Nick, podemos usar una funciona aleatoria para que cada vez use un nick al azar e ir mejorando o cualquier otra cosa que se nos ocurra.

El que el bot necesite entrar al canal que quiere consultar, es debido a que si listamos los nicks de una determinada sala (/who #canal) sin estar dentro de la misma, no muestra el total de los nicks, por eso es necesario que dicho bot entre en la sala que quiere consultar, una vez consultado desconectara rápidamente del mismo.

Problema del cambio de nombres de subdominios:

El tema de que un servidor tenga varios nombres se debe al "CNAME" (Canonical Name = Nombre Canónico) Se usa para crear nombres de hosts adicionales, o alias, para determinados hosts de un dominio. Se usa cuando se corren múltiples servicios (Ftp, Web, IRC, etc,..) en un servidor con una sola dirección ip. Cada servicio tiene su propia entrada de DNS (Como ftp.ejemplo.com. y www.ejemplo.com.). También se usa cuando se quieren tener múltiples servidores irc, con diferente nombres, sobre el mismo host. Veamos en que casos puede darnos problemas el CNAME para nuestro script.

SÍ Mantiene el mismo nombre: NO DARA PROBLEMAS EL SCRIPT

* Conectando a luna.irc-hispano.org (194.149.73.80) puerto 6667...
* Connected. Now logging in...
* *** Looking up your hostname...
* *** Found your hostname.
* Welcome to the IRC-Hispano IRC Network, Busindre
* Your host is luna.irc-hispano.org, running version u2.10.H.10.42

NO Mantiene el mismo nombre (atreides.irc-hispano.org -> dune.irc-hispano.org) (NO FUNCIONARA EL SCRIPT)

* Conectando a atreides.irc-hispano.org (212.59.199.130) puerto 6667...
* Connected. Now logging in...
* Welcome to the IRC-Hispano IRC Network, Busindre
* Your host is dune.irc-hispano.org, running version u2.10.H.10.42

NO Mantiene el mismo nombre (supernova.irc-hispano.org -> neptuno.irc-hispano.org) (NO FUNCIONARA EL SCRIPT)

* Conectando a supernova.irc-hispano.org (195.85.200.11) puerto 6667...
* Welcome to the IRC-Hispano IRC Network, Busindre
* Your host is neptuno.irc-hispano.org, running version u2.10.H.10.41
* This server was created dv feb 15 2008 at 17:28:45 CET
* neptuno.irc-hispano.org u2.10.H.10.41 dioswkgxXrRhSB biklmnopstvrRMCNu

NOTA: Estas comprobaciones del nombre de subdominio de los servidores podemos hacerlas con cualquier cliente irc o con un telnet al servidor y puerto.

Comprobación de que es la misma máquina o conjunto de maquinas (supernova.irc-hispano.org / neptuno.irc-hispano.org):

$ nslookup supernova.irc-hispano.org
Non-authoritative answer:
Name: supernova.irc-hispano.org
Address: 195.82.200.12
Name: supernova.irc-hispano.org
Address: 195.85.200.10
Name: supernova.irc-hispano.org
Address: 195.85.200.11
Name: supernova.irc-hispano.org
Address: 195.85.200.13
Name: supernova.irc-hispano.org
Address: 195.85.200.14
Name: supernova.irc-hispano.org
Address: 195.85.200.15
Name: supernova.irc-hispano.org
Address: 195.85.200.16


$ nslookup neptuno.irc-hispano.org
Non-authoritative answer:
neptuno.irc-hispano.org canonical name = supernova.irc-hispano.org.
Name: supernova.irc-hispano.org
Address: 195.85.200.10
Name: supernova.irc-hispano.org
Address: 195.85.200.11
Name: supernova.irc-hispano.org
Address: 195.85.200.13
Name: supernova.irc-hispano.org
Address: 195.85.200.14
Name: supernova.irc-hispano.org
Address: 195.85.200.15
Name: supernova.irc-hispano.org
Address: 195.85.200.16
Name: supernova.irc-hispano.org
Address: 195.82.200.12

NOTA: Como vemos tienen los mismos subdominios asignados a los mismos servidores neptuno.irc-hispano.org canonical name = supernova.irc-hispano.org, el propio comando nslookup nos lo dice.

Posted in Curiosidades |

2 Responses

  1. vlan7 Says:

    Hola!

    Que sorpresa ver mi codigo PHP, mejorado por mi amigo chanchi...

    Solo un apunte. En el irc-hispano todos los servidores estan interconectados entre si. Es decir, da igual que entres con atreides, con dune o con el que sea. El servidor que definimos en el codigo PHP es el servidor que usara nuestro bot para conectarse al irc-hispano, pero podra ver a todo aquel que este en el irc-hispano, aunque esten en cualquier otro servidor de la red.

    Un saludo!

    vlan7

  2. Busindre/ Says:

    Gracias a tu comentario he podido darme cuenta de que el script realmente no saca a todos los usuarios del canal que consulta. Para poder mostrar todos los nicks de un canal no vale con preguntarle al servidor, es pertinente realizar la pregunta (/who #canal) estando previamente dentro del canal si queremos que se nos muestren todos los nicks. Te pongo un ejemplo real probado desde varios clientes de irc.

    Ejemplo: /who #mandriva (SIN entrar al canal)


    capito
    filem0n
    ea5awb
    SinnerBOFH

    Ejemplo: /who #mandriva (Entrando al canal)


    capito
    filem0n
    ea5awb
    GaToR
    delcoyote
    SinnerBOFH

    Como vemos para mostrar todos necesitamos estar dentro de ese canal, por lo que he modificado tu script y añadido la siguiente linea:

    fputs($con, "JOIN ". $canal ."\r\n");

    También añadí una comprobación para que el "bot" no se liste a si mismo una vez entre en el canal

    Quedando de esta forma:

    ////////////////////////

    if($nicks[7]!=$nick){ //<----- AÑADIDO
    print "$nicks[7]
    ";
    }//<----- AÑADIDO
    }

    if(substr($read, 0, 6) == 'PING :') {
    fputs($con, "PONG :".substr($read,6)."\r\n");
    fputs($con, "JOIN ". $canal ."\r\n");//<----- AÑADIDO
    fputs($con, "WHO ". $canal ."\r\n");
    }

    ////////////////////////

    Con esta pequeña modificación mostrara el resultado de una forma más óptima.

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.