Foros del Web » Programando para Internet » PHP »

Comprobar existencia de una página web

Estas en el tema de Comprobar existencia de una página web en el foro de PHP en Foros del Web. Hola Estoy haciendo un programita para que la gente pueda sugerir una página web. Antes de grabar esa dirección en un archivo de texto me ...
  #1 (permalink)  
Antiguo 22/10/2003, 12:21
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Comprobar existencia de una página web

Hola

Estoy haciendo un programita para que la gente pueda sugerir una página web.

Antes de grabar esa dirección en un archivo de texto me gustaría comprobar si la página realmente existe.

Se puede hacer esto con PHP?

He mirado funciones como gethostbyname(), pero no me sirve para direcciones del tipo www.zaraempleo.net/sallende

Gracias
  #2 (permalink)  
Antiguo 22/10/2003, 13:21
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
Un sistema es con la funcion fsockopen(), aqui te dejo unas funciones que te serviran para vaidadar enlaces

Código PHP:
function parametros($entrada)
{       
        
$ArrayUrl parse_url($entrada);
        
$port=$ArrayUrl['port'];
        
$host=$ArrayUrl['host'];
        
$path=$ArrayUrl['path'];
        if (!
$port$port "80";
        if (
$port != "80")   $port $port;
        
        
$return['port']=$port;
        
$return['host']=$host;
        
$return['path']=$path;

        return 
$return;
}
 function 
ValidarVinculos($vinculo)
{
       
         
$request="";
         
$urlArrayparametros($vinculo);
          
$sock = @fsockopen($urlArray['host'], $urlArray['port']);
         if (!
$sock$contesta['code'] = "No responde";
         else {
            
$request .= "HEAD $urlArray[path] HTTP/1.1\r\n";
            
$request .= "User-Agent: Valid link ([url]http://centropromoweb.com[/url])\r\n";
            
$request .= "Host: $urlArray[host]\r\nConnection: close\r\n";
            
$request .= "Connection: close\r\n\r\n";
            
fputs($sock$request);
            while(
$str fgets($sock128)) {               
              if (
eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*"$str)) $contesta['code']  = trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*""\\1"$str));
              
               if (
eregi("^Content-Type: "$str)) $contesta['contentType'] = trim(eregi_replace("^Content-Type: """$str));
               if (
eregi("text/html"$str))  $contesta['contentType'] = "text/html";
               
               if (
eregi("^Content-Length: "$str)) $contesta['peso'] = trim(eregi_replace("^Content-Length: """$str));
               
$contesta[]=$str;
               
            }
        }      
         return 
$contesta;

Espero que te sirvan

un salduo
  #3 (permalink)  
Antiguo 22/10/2003, 14:36
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Gracias por el código

Tiene muy buena pinta pero llevo un buen rato probándolo y no consigo que contesta me escriba ningún valor, ni otros echos me funcionan de tal forma que no sé si chuta o no?
  #4 (permalink)  
Antiguo 22/10/2003, 14:38
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
ya me contesto

es la @ delante que no me deja ver el error lo que me pasa es que supero el tiempo máximo de espera, probaré a ver si puedo aumentarlo
  #5 (permalink)  
Antiguo 22/10/2003, 14:43
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
La arroba delante del fosockopen es para que si hay errores no los muestre por pantalla

en cuanto al tiempo de ejecucion puedes poner
set_time_limit(0), para aumentar el tiempo

y tb puedes poner en la funcion fsockopen()

Código PHP:
$sock fsockopen($urlArray[host], $urlArray[port], &$errnum, &$errstr10); 
donde 10 es los segundos que espera en conectar con el servidor

un saludo
  #6 (permalink)  
Antiguo 22/10/2003, 14:47
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Vale ya funciona, pero no funciona.

Se traga todas las direcciones que le paso cuyo DNS existe.

Alguna idea?
  #7 (permalink)  
Antiguo 22/10/2003, 14:49
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
estaba mirando el codigo que te di, y veo que el foro a cambiado una linea

esta linea esta asi:
$request .= "User-Agent: Valid link (<a href="/out.php?http%3A%2F%2Fcentropromoweb.com" target="_blank">http://centropromoweb.com</a>)\r\n";

debe de estar

$request .= "User-Agent: Valid link (http://centropromoweb.com)\r\n";

o bien pones tu url o nada tampoco es importante
  #8 (permalink)  
Antiguo 22/10/2003, 14:52
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Espera no te vayas.

Eso ya lo había cambiado, pero es normal que se trague todas las direcciones aunque el nombre del archivo sea inventado?

La variable $request, dónde se escribiría?
  #9 (permalink)  
Antiguo 22/10/2003, 14:59
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
joo, tambien ha cambiado esta linea .. ha quitado una barra inclinada delante del uno

esta:
if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str)) $contesta['code'] = trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", "\1", $str));

y debe estar

if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str)) $contesta['code'] = trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", "\\1", $str));

El codigo funciona porque lo uso para eso ,validar vinclulos en un script que tengo

un saludo
  #10 (permalink)  
Antiguo 22/10/2003, 15:03
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
la variable $request es parte del protocolo HTTP que envia al servidor, es mas o mnos lo que hace un navegador al pedir una pagina,

El se traga todos los archivos aunque no esten, lo que el servidor le manda el codigo de error, si no esta le manda el famoso 404 not found, aunque puede mandar como 20 0 30 codigos diferentes segun sea el caso,

si lo necesitas te mandare una parte de codigos que manda el servidor traducido al español

si te da eerrores dime cuales , pues ya te digo, esl foro ha cambiado parte del codigo

Código PHP:
 
echo "<pre>";
print_r($var);
echo 
"</pre>"
con esto puedes ver lo que manda el servidor y en funcion adaptas la logica de tu escript para que reconozca los codiogos

un saludo

Última edición por Jordi1; 22/10/2003 a las 15:05
  #11 (permalink)  
Antiguo 22/10/2003, 15:09
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Esto es lo que le pongo

function parametros($entrada)
{
//Analiza una URL y devuelve sus componentes en un array
$ArrayUrl = parse_url($entrada);
$port=$ArrayUrl['port'];
$host=$ArrayUrl['host'];
$path=$ArrayUrl['path'];
if (!$port) $port = "80";
if ($port != "80") $port = $port;

$return['port']=$port;
$return['host']=$host;
$return['path']=$path;

return $return;
}
function ValidarVinculos($vinculo)
{

$request="";
//llamada a la función anterior
$urlArray= parametros($vinculo);
//Abre una conexión de dominio Internet o Unix via sockets. Si falla devuelve falso

$sock = fsockopen($urlArray['host'], $urlArray['port'], &$errno, &$errstr, 60);
if (!$sock)
echo "No responde";
// $contesta['code'] = "No responde";
else
{
$request .= "HEAD $urlArray[path] HTTP/1.1\r\n";
$request .= "User-Agent: Valid link (<a href=\"out.php?http%3A%2F%2Fcentropromoweb.com\" target=\"_blank\">http://centropromoweb.com</a>)\r\n";
$request .= "Host: $urlArray[host]\r\nConnection: close\r\n";
$request .= "Connection: close\r\n\r\n";

//escribe en el fichero la petición anterior
fputs($sock, $request);
//leer hasta la posición 128
//trim: Elimina espacios del principio y final de una cadena del tipo \n

while($str = fgets($sock, 128))
{
if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str)) $contesta['code'] = trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", "\1", $str));

if (eregi("^Content-Type: ", $str)) $contesta['contentType'] = trim(eregi_replace("^Content-Type: ", "", $str));
if (eregi("text/html", $str)) $contesta['contentType'] = "text/html";

if (eregi("^Content-Length: ", $str)) $contesta['peso'] = trim(eregi_replace("^Content-Length: ", "", $str));

}
echo "Sí responde";
}


}
//le paso uno que no existe
ValidarVinculos("http://www.zaraempleo.net/PEPIN");

?>
  #12 (permalink)  
Antiguo 22/10/2003, 15:23
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
tal como lo haces siempre te respondera , pues el servidor siempre responde a menos que no se abra el socket,

La logica del script es la siguiente:

envia una pregunta al servidor, sobre un archivo.

el servidor le responde con una serie de codigos , las cabeceras
estas cabeceras se analizan con los eregis y se guardan en el arrray $contesta, luego tu tienes de sacar estas respuestas y procesarlas con mas codigo por ejemplo con if()

por eso te mostraba el ejemplo

te dejo todo otra vez a ve si no se fastidia con el foro


<?

function parametros($entrada)
{
$ArrayUrl = parse_url($entrada);
$port=$ArrayUrl['port'];
$host=$ArrayUrl['host'];
$path=$ArrayUrl['path'];
if (!$port) $port = "80";
if ($port != "80") $port = $port;

$return['port']=$port;
$return['host']=$host;
$return['path']=$path;

return $return;
}
function ValidarVinculos($vinculo)
{

$request="";
$urlArray= parametros($vinculo);
$sock = @fsockopen($urlArray['host'], $urlArray['port']);
if (!$sock) $contesta['code'] = "No responde";
else {
$request .= "HEAD $urlArray[path] HTTP/1.1\r\n";
$request .= "User-Agent: Valid link (http://centropromoweb.com)\r\n";
$request .= "Host: $urlArray[host]\r\nConnection: close\r\n";
$request .= "Connection: close\r\n\r\n";
fputs($sock, $request);
while($str = fgets($sock, 128)) {

if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str)) $contesta['code'] = trim(eregi_replace("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", "\\1", $str));


if (eregi("^Content-Type: ", $str)) $contesta['contentType'] = trim(eregi_replace("^Content-Type: ", "", $str));
if (eregi("text/html", $str)) $contesta['contentType'] = "text/html";

if (eregi("^Content-Length: ", $str)) $contesta['peso'] = trim(eregi_replace("^Content-Length: ", "", $str));
$contesta[]=$str;

}
}
return $contesta;
}

$vinculo="http://centropromoweb.com/index.php";

$var=ValidarVinculos($vinculo);

if($var['code'] != 200) echo "<li> este ".$vinculo." arroja el siguiente codigo de problema ".$var['code'] ;

else echo "este vinculo es correcto ".$vinculo;


echo "<pre>";
print_r($var);
echo "</pre>";

?>


si lo ejecutas tal cual , veras las cabeceras que manda el servidor

en el caso de que el archivo no este , pues te manda un 404 not found

prueba a ver,
  #13 (permalink)  
Antiguo 23/10/2003, 01:43
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Por fin

Ala pues.

Ya está aplicado. Lo he copiado tal cual y me funciona.

Ahora trataré de adaptarlo.

Gracias por tu tiempo y tu ayuda, espero no ser tan torpe con la siguiente función que aplique.
  #14 (permalink)  
Antiguo 23/10/2003, 12:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
vuelvo a la carga

Ya he digerido el código que me enviaste, y salvo algunos atragantamientos, lo he modificado a mi gusto.

Pero hay un pequeño problema con los dominios de tipo:

www.picore.tk, el servidor da un error.

¿Se os ocurre alguna forma de paliarlo?
  #15 (permalink)  
Antiguo 23/10/2003, 12:46
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
que tipo de error da?
ponos la cabecera que te envia para ver

un saludo
  #16 (permalink)  
Antiguo 23/10/2003, 13:14
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Ésta es la información que devuelve el servidor:

Línea 1:
Línea 2:
Línea 3:
Línea 4:
Línea 5:
Bad Request

Línea 6:
Your browser sent a request that this server could not understand.

Línea 7:


Línea 8:
--------------------------------------------------------------------------------

Línea 9:
Apache/2.0.47 (Unix) Server at hakea.taloha.tk Port 80

Línea 10:
  #17 (permalink)  
Antiguo 23/10/2003, 13:38
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
no se, prueba a editar esta linea
HEAD $urlArray[path] HTTP/1.1
y le pones la version del protocolo HTTP/1.0

y lo que no estoy seguro si este protocolo acepta la cabecera HEAD, si no puedes poner como cabecera GET osea que quedaria asi:

GET $urlArray[path] HTTP/1.0

y a ver que pasa
si no te devuelve nada prueba con el protocolo 0.9
GET $urlArray[path] HTTP/0.9

y si tampoco pues no sabria que decirte

a ver prueba y nos dices

un saludo
  #18 (permalink)  
Antiguo 24/10/2003, 03:06
 
Fecha de Ingreso: octubre-2003
Mensajes: 109
Antigüedad: 14 años, 2 meses
Puntos: 1
Si cambio la línea
HEAD $urlArray[path] HTTP/1.1
por
GET $urlArray[path] HTTP/1.0
o por
GET $urlArray[path] HTTP/0.9
devuelve
Línea 1: The URL has moved here

"here" es un link a http://www.dot.tk/error.html.

La respuesta es la misma si existe o no.

Si accedes por medio del navegador y escribes un nombre de dominio www.jsssskkk.tk el servidor te lleva a una página para que lo des de alta. Si ya está dado de alta te redirecciona al servidor que le hayas indicado.

Supongo que el servidor está configurado con una condición para que haga una cosa u otra. Lo que ya no sé si con php se puede acceder a ese tipo de datos.
  #19 (permalink)  
Antiguo 24/10/2003, 04:15
 
Fecha de Ingreso: abril-2003
Mensajes: 656
Antigüedad: 14 años, 8 meses
Puntos: 1
supongo que si , seguro, sera utilizando otro tipo de cabeceras o bien, con otro sistema de sokets

lo que podrias hacer es abrir otro tema, y quizas los mas expertos que andan algunos por aqui, sabran responderte

un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:58.