Crea tu bot para IRC usando PHP
Crea tu bot para IRC usando PHP sockets. NO IRCG
Primero que nada aprenderemos para que sirve cada función clave que vamos a estar usando para poder hacer el bot para IRC.
Función | Pequeña descripción |
»1 fsockopen: | Función que conecta el script php a un lugar. Formato: $conexion = fsockopen(“SERVIDOR”, PUERTO); |
»2 fclose: | Función que desconecta el script php a un lugar ya conectado mediante un socket. Formato: fclose($conexion); |
»3 fputs: | Función que enviara un texto al servidor conectado. Formato: fputs($conexion,”TEXTO”); |
»4 feof: | Función que me dira si estoy conectado al servidor o no. Formato: feof($conexion); |
»5 fgets: | Función que permitira que el bot se entere de los msgs que me envia el IRC. Formato: fgets($conexion,2048); |
»6 set_time_limit: | Función que permitira que no se caiga la conexion por timelimit. Formato: set_time_limit(0); |
Proximamente le presento el ejemplo utilizando las funciones de arriba.
Hay algunas funciones que no puse… ¿ Por que ? para hacer un bot php
debes tener algun tipo de conocimiento minimo en PHP.
Codigo de ircbot.php:
<?php// Configuramos el script.
$conexion = fsockopen("servidor.com", 6667);
$bnick="PHPHispanoTuT";
$autojoin=""; // Si son varios canales puedes poner Canal1,Canal2 fputs($conexion, "USER ".$bnick." - - :-\n");
fputs($conexion, "NICK ".$bnick." -\r\n");// Aremos un loop infinito mientras este conectado al servidor.
while (!feof($conexion)) {
// Resiviremos los mensajes del servidor.
$bmsg = str_replace("\n", "", str_replace("\r", "", fgets ($conexion,2048)));
$partmsg = explode(" ",$bmsg);// quita los // del siguiente commando si quieres saber un debug en la consola.
// echo $bmsg;
�
// Con este code de abajo sacamos el nick de quien nos envia el msg.
$n = explode("!",$partmsg[0]);
$nick = str_replace(":","",$n[0]);// Al enviarnos el PING responderemos con PONG.. (Dudas, aprende protocolo IRC)
if ($partmsg[0] == 'PING') {
fputs($conexion,'PONG '.str_replace(':','',$partmsg[1])."\n");
// Si el el primer ping entraremos a los canales. (Este ping lo hace cuando se conecto.)
if(!$bconnect) {
// El script no se acabara nunca omenos que se caiga.
set_time_limit(0);
fputs($conexion,"JOIN ".$autojoin."\n");
$bconnect=1;
}
}
}// Al no estar conectado al servidor ejecutara este commando que desconectara el socket y terminara el script.
fclose($conexion); exit();?>
Este bot no tiene ninguna funcion… Solo conecta y se mantiene conectado.
Para iniciar el bot tendras que poner en la consola php ircbot.php (Shell Unix RECOMENDADA)
// Me identifico.
Espero que les halla servido de mucho, Atentamente OmaRPR (Omar Soto)
Creado el 29/Septiembre/2003 Para #PHP_Para_Torpes (PHP-Hispano.net)
Otro codigo similar:
<?�
$servidor = “irc.infogroup.cl”;�
$puerto = “6667″;�
$canal = “#canal”; //Canal que conectara�
$nick = “Berna_Bot”; //Nick del Bot�
$nickmaster = “Berna”; //Al User que obedesera xD ._. $connect = fsockopen($servidor, $puerto, $errno, $errstr, 30); //hacemos la conexion fputs($connect, “USER $nick - - :-\n”); //Nos identificamos en el servidor�
fputs($connect, “NICK $nick -\r\n”); //Nos identificamos en el servidor $open = fopen(“log.txt”,“w+”); //siempre es bueno tener un log de las conversaciones :)�
while (!feof($connect)) { $conectado==0){�
set_time_limit(0);�
fputs($connect,“JOIN $canal\n”);�
fputs($connect,“privmsg $canal Bot Conectado en $canal\n”);�
fputs($connect,“privmsg $canal www.neosecurityteam.net\n”);�
$conectado = 1;�
} //Hacemos esto, porke si no esta dentro del bucle y si conectaria infinitamente ._. $log = fgets ($connect,2048);�
fwrite($open, “$log”); //Aca escribimos en el archivo del texto $len = strlen($nickmaster) + 1;�
$sep = substr(fgets($connect,2048),0,$len);�
$nick = explode(“:”,$sep);�
//Ahi haremos que identifique el nick del master del bot if ($nick[1]==$nickmaster){ //Si es el master el que habla if (eregi(“!say”,fgets($connect,2048))){�
$ms = explode(“!say ”,fgets($connect,2048));�
fputs($connect,“privmsg $canal $ms[1]\n”); //Con poner !say y el texto lo enviara al publico�
} eregi(“!nick”, fgets($connect,2048))){�
$ms = explode(“!nick ”,fgets($connect,2048));�
fputs($connect,“NICK $ms[1]\n”); //!nick Nick nuevo del Bot - cambia de nick�
} //esas son unas peke?as funciones que le puse…�
}�
}�
fclose($connect); //cerramos el soket�
?>
if (
if(
OTRO:
<?
// Datos del Bot
$nickname = “KesBot”;
$powered = “Kesthers”;
$nombre = “KesBot”;
$version = “v1.0″;$ircserver[address] = “irc.quakenet.org”;
$ircserver[port] = “6667″;$red = “quakenet”;$directorio[stats] = “/var/log/kesbot/quakenet/”;// Conexion a Base de Datos
mysql_connect(“localhost”, “xxxxx”, “xxxxx”); mysql_select_db(“xxxxx”);## Funciones de Logs & Stats ##
function WriteLogs($canal, $mensaje) {
global $directorio;
$fp = @fopen($directorio[stats].str_replace(“#”, “”, str_replace(“:”, “”, $canal)).“.log”, “a”);
fputs($fp, $mensaje.“\r\n”);
fclose($fp);
}// Conectamos
set_time_limit(0);
for($conn=0; 1<=2; $conn++) {
echo“Conectando…\n”;
$conexion = fsockopen($ircserver[address], $ircserver[port]);
socket_set_timeout($conexion, 31536000);
if($conexion) {
echo“Esperando respuesta…\n”;
$bucle=0; $conectado=0; $limit=0;
set_time_limit(0);
while ($read = fgets($conexion,512)) {
set_time_limit(0);
$read = str_replace(“\n”,“”,$read);
$read = str_replace(“\r”,“”,$read);
$array = explode(“ ”,$read);
$address = explode(“!”,$array[0]);
$nick = str_replace(“:”,“”,$address[0]);
$quit = substr($read, strlen($array[0])+strlen($array[1])+3, 512);
$modo = substr($read, strlen($array[0])+strlen($array[1])+strlen($array[2])+3, 512);
$mensaje = substr($read, strlen($array[0])+strlen($array[1])+strlen($array[2])+4, 512);
$kick = substr($read, strlen($array[0])+strlen($array[1])+strlen($array[2])+strlen($array[3])+5, 512);$conectado!==0) {
switch ($array[1]) {
case PRIVMSG:
if($array[2]!==$nickname) {
if(substr($mensaje, 0, 7)==“ACTION”) {
$count = strlen($mensaje)-9;
WriteLogs($array[2], “[".date("H:i")."] * ”.$nick.“ ”.substr($mensaje, 8, $count));
} else {
WriteLogs($array[2], “[".date("H:i")."] <”.$nick.“> ”.$mensaje);
}
} else {
$orden = explode(“ ”, strtolower($mensaje));
switch ($orden[0]) {
case “ping”:
fputs($conexion, “NOTICE ”.$nick.“ :PING ”.$orden[1].“\n”);
break;
�
case “version”:
fputs($conexion, “NOTICE ”.$nick.“ :VERSION ”.$version.“\n”);
break;
�
case “time”:
fputs($conexion, “NOTICE ”.$nick.“ :TIME ”.date(“D M d H:i:s Y”).“\n”);
break;
�
case “finger”:
fputs($conexion, “NOTICE ”.$nick.“ :FINGER ”.$nombre.“\n”);
break;admin:
if(mysql_num_rows(mysql_query(“SELECT * FROM admins WHERE nick=’”.strtolower($nick).“‘”))==1) {
$accion = substr($mensaje, 6, 512);
fputs($conexion, $accion.“\n”);
if($orden[1]==“nick”) {
$nuevo = explode(“:”, $orden[2]);
$nickname = $nuevo[0];
}
} else {
fputs($conexion, “PRIVMSG ”.$nick.“ :\002\0032No estas autorizado/da a usar este comando.\n”);
}
break;info:
fputs($conexion, “PRIVMSG ”.$nick.“ :\002\0032Bot de Logs & Stats [Creado por: ".$powered."]\n”);
fputs($conexion, “PRIVMSG ”.$nick.“ :\002\0032Website: http://www.kesthers.com\n”);
fputs($conexion, “PRIVMSG ”.$nick.“ :\002\0032E-Mail: [email]info@kesthers.com[/email]\n”);
break;op:
if(mysql_num_rows(mysql_query(“SELECT * FROM opers WHERE nick=’”.$orden[1].“‘ AND password=’”.$orden[2].“‘ AND red=’”.$red.“‘ AND canal=’”.$orden[3].“‘”))==“1″) {
fputs($conexion, “MODE ”.$orden[3].“ +o ”.$nick.“\n”);
} else {
fputs($conexion, “PRIVMSG ”.$nick.“ :\002\0032No te puedo dar op porque los datos no son correctos\n”);
}
break;
}
}
break;
�
case NOTICE:
if($array[2]!==$nickname) {
WriteLogs($array[2], “[".date("H:i")."] *** ”.$mensaje.“ (“.$nick.“)”);
}
break;
�
case NICK:
$query = mysql_query(“SELECT * FROM online WHERE nick=’”.$nick.“‘ AND red=’”.$red.“‘”);
while($sql = mysql_fetch_array($query)) {
WriteLogs($sql[canal], “[".date("H:i")."] *** ”.$nick.“ is now known as ”.str_replace(“:”, “”, $array[2]));
}
mysql_query(“UPDATE online SET nick=’”.str_replace(“:”, “”, $array[2]).“‘ WHERE nick=’”.$nick.“‘ AND red=’”.$red.“‘”);
break;MODE:
if($array[2]!==$nickname) {
WriteLogs($array[2], “[".date("H:i")."] *** ”.$nick.“ sets mode: ”.$modo);
}
break;JOIN:
WriteLogs($array[2], “[".date("H:i")."] *** ”.$nick.“ (“.$address[1].“) has joined ”.str_replace(“:”, “”, $array[2]));
mysql_query(“INSERT INTO online (time, nick, canal, red) VALUES (‘”.time().“‘, ’”.$nick.“‘, ’”.str_replace(“:”, “”, $array[2]).“‘, ’”.$red.“‘);”);
break;PART:
WriteLogs($array[2], “[".date("H:i")."] *** ”.$nick.“ (“.$address[1].“) has left ”.$array[2]);
mysql_query(“DELETE FROM online WHERE nick=’”.$nick.“‘ AND canal=’”.$array[2].“‘ AND red=’”.$red.“‘”);
break;KICK:
if($array[3]==$nickname) {
fputs($conexion, “JOIN ”.$array[2].“\n”);
}
WriteLogs($array[2], “[".date("H:i")."] *** ”.$array[3].“ was kicked by ”.$nick.“ (“.$kick.“)”);
mysql_query(“DELETE FROM online WHERE nick=’”.$array[3].“‘ AND canal=’”.$array[2].“‘ AND red=’”.$red.“‘”);
break;QUIT:
$query = mysql_query(“SELECT * FROM online WHERE nick=’”.$nick.“‘ AND red=’”.$red.“‘”);
while($sql = mysql_fetch_array($query)) {
WriteLogs($sql[canal], “[".date("H:i")."] *** ”.$nick.“ (“.$address[1].“) Quit (“.$quit.“)”);
}
mysql_query(“DELETE FROM online WHERE nick=’”.$nick.“‘ AND red=’”.$red.“‘”);
break;TOPIC:
WriteLogs($array[2], “[".date("H:i")."] *** ”.$nick.“ changes topic to ’”.$mensaje.“‘”);
mysql_query(“UPDATE canales SET topic=’”.$mensaje.“‘ WHERE canal=’”.$array[2].“‘ AND red=’”.$red.“‘”);
break;
}
}$bucle==0) {
fputs($conexion, “NICK $nickname\n\n”);
fputs($conexion, “USER $nickname $powered $powered :$nombre $version\n\n”);
echo“Identificado.\n”;
}$array[0]==“PING”) {
fputs($conexion, “PONG ”.str_replace(“:”,“”,$array[1]).“\n”);
}$array[1]==251) {
$query = mysql_query(“SELECT * FROM canales WHERE red=’”.$red.“‘”);
while($sql = mysql_fetch_array($query)) {
$canales .= $sql[canal].“,”;
}
fputs($conexion, “JOIN ”.$canales.“\n\n”);
echo“Entrada en canales. ($canales)\n”;
$conectado++;
}$bucle++;
}
} else {
echo“Error al Conectar.\n”;
}
echo“Desconectado.\n”;
}
?>
Tuitear 5.898 Veces leído 0 comentarios |
6 agosto 2010 en Informática | tags: Informática |