entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

-1voto

Detectar con precision el sistema y navegador del usuario

hola muchachos como de costumbre estoy explorando nuevas posibilidades en esta ocasion como dice mi pregunta estoy probando a detectar el sistema y el browser del cliente pero al hacerlo solo me devuelve una lista con todos los navegadores y con algunos sistemas por eso he estado investigando y he encontrado algunos codigos ya resueltos pero sin ninguna explicacion del funcionamento ni nada y como ami no me gusta copiar y pegar sin entender bien como funciona no lo tome porque me gustaria entender como funciona
entonces se que la superglobal request admite algunos parametros relacionados al servidor entre los cuales se encuentran el agente del usuario que seria el sistema y el navegador mi intencion es que me no me bote un resultado preciso o almenos cercano

$host = $_SERVER['REMOTE_HOST'];
$plataforma = $_SERVER['HTTP_USER_AGENT'];

echo $plataforma."<br>".$host."<br>";

output

Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

sin embargo mi sistema es windows 8 y mi navegador es chrome

ademas entre los parametros hay uno que me da curiosidad es el parametro host, lo he probado en local y me bota un error tambien lo he probado en un hosting pero no me devuelve nada ningun mensaje, me gustaria saber que dato devuelve este parametro

1voto

Peter comentado

Esta web tiene un montón de ejemplos que seguramente te ayudan.

Saludos.

0voto

steven comentado

despues de este cometario quien hace el troll ... no te cuesta nada brindar una respuesta breve o almenos decir no crees que antes de venir aqui a hice un monton de busquedas mi intencion es profundizar el tema

1 Respuesta

1voto

magarzon Puntos30650

Manual oficial de PHP sobre las entradas de $_SERVER, en español. No es tan difícil encontrar información: http://php.net/manual/es/reserved.variables.server.php

Si vas al apartado de REMOTE_HOST, te indica que necesitas hacer ajustes en la configuración de Apache (seguramente en nginx también) para obtener ese valor. Por eso te da error (seguramente porque no exista y no compruebas primero su existencia) o te devuelve vacío en el hosting

En cuanto al user agent, es el correcto para Chrome en Windows 8:
Mozilla 5.0 => Esto es porque es compatible con Mozilla 5.0. Realmente tenía sentido antiguamente, ahora ya no.
Windows NT 6.3 => Esto es lo que indica que es Windows 8
WOW64 => Que tienes una versión de Chrome de 32 bits ejecutándose en un SO de 64
AppleWebKit/537.36 (KHTML like Gecko) => Que está basado en el motor webkit para navegadores, la misma base que Safari, y que a su vez se basa en KHTML (aunque esto ya no es cierto del todo, porque Chrome utiliza un fork de Webkit llamado Blink)
Chrome/56.0.2924.87 => Evidente, que es Chrome y la versión
Safari/537.36 => Que está basado en Safari, como antes lo de Webkit

0voto

steven comentado

eso de la config no lo tenia presente la pregunta es que informacion puedo obtener a travez del host.. respecto a lo demas como puedo saber con exactitud que navegador esta usando el usuario si me bota todos los navegadores es decir que si el user usa opera o safari siempre me botara el mismo resultado
aparte eso tampoco es claro con los sistemas desde cuando existe el sistema nt nunca escuche hablar de el como puedo saber si se trata de un windows mas viejo

1voto

magarzon comentado

No te está devolviendo todos los navegadores.El navegador en concreto es la penúltima parte de la cadena, tal y como te he mostrado en mi respuesta.

De todos modos, con la función get_browser de PHP puedes obtener información a partir del user agent, aunque esta función requiere un poco de configuración (viene en la documentación de la función que he enlazado)

En cuanto a lo de Windows NT... se ve que eres joven. NT era un SO de Microsoft principalmente orientado a serviores, que luego fue la base para Windows XP y todos los SO posteriores de Microsoft, por eso internamente debe ser que utilizan todavía NT para nombrar a sus SO (la verdad es que no uso Windows desde el XP, así que ahí estoy un poco obsoleto)

Y en cuanto al comentario de @Peter, miles de veces he estado tentado de responderte lo mismo, porque el 99% de las veces tus problemas se resuelven con una búsqueda en Google, y normalmente la respuesta está en el primer enlace, con lo que o no te molestas en buscar, o tampoco lo de buscar se te da bien.

0voto

steven comentado

entonces significa que debo fijarme siempre en la penultima linea para saber que navegador usa el cliente pero acaso no hay manera de filtrar solo eso porque no sirve de nada el resto de info. respecto a la funcion get browser he visto que se debe descargar el archivo y hacer funciones con regex.
respecto a las busquedas la mayor parte de los articulos son copiados y mal explicados con malos ejemplos hechos con el estilo opp por lo que prefiero un ejemplo breve y bien explicado que un con mucho codigo y mucho reboloteo

0voto

magarzon comentado

No debes hacer nada con regex, solo configurar PHP para que tome ese archivo, viene explicado en el enlace.

Y respecto a las búsquedas, a lo mejor el problema no es que esté mal explicado, si no que no lo entiendes. Quieres aprender a programar por la vía rápida, y eso es imposible.

0voto

steven comentado

si en el codigo se usa regex si no me crees te lo muestro y te lo señalo

<?php
function getBrowser() 
{ 
    $u_agent = $_SERVER['HTTP_USER_AGENT']; 
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version= "";

    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
        $platform = 'linux';
    }
    elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
        $platform = 'mac';
    }
    elseif (preg_match('/windows|win32/i', $u_agent)) {
        $platform = 'windows';
    }

    // Next get the name of the useragent yes seperately and for good reason
    if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent)) 
    { 
        $bname = 'Internet Explorer'; 
        $ub = "MSIE"; 
    } 
    elseif(preg_match('/Firefox/i',$u_agent)) 
    { 
        $bname = 'Mozilla Firefox'; 
        $ub = "Firefox"; 
    } 
    elseif(preg_match('/Chrome/i',$u_agent)) 
    { 
        $bname = 'Google Chrome'; 
        $ub = "Chrome"; 
    } 
    elseif(preg_match('/Safari/i',$u_agent)) 
    { 
        $bname = 'Apple Safari'; 
        $ub = "Safari"; 
    } 
    elseif(preg_match('/Opera/i',$u_agent)) 
    { 
        $bname = 'Opera'; 
        $ub = "Opera"; 
    } 
    elseif(preg_match('/Netscape/i',$u_agent)) 
    { 
        $bname = 'Netscape'; 
        $ub = "Netscape"; 
    } 

    // finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
        // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
        //we will have two since we are not using 'other' argument yet
        //see if version is before or after the name
        if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
            $version= $matches['version'][0];
        }
        else {
            $version= $matches['version'][1];
        }
    }
    else {
        $version= $matches['version'][0];
    }

    // check if we have a number
    if ($version==null || $version=="") {$version="?";}

    return array(
        'userAgent' => $u_agent,
        'name'      => $bname,
        'version'   => $version,
        'platform'  => $platform,
        'pattern'    => $pattern
    );
} 

// now try it
$ua=getBrowser();
$yourbrowser= "Your browser: " . $ua['name'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>

* // finally get the correct version number
$known = array('Version', $ub, 'other');
$pattern = '#(?<browser>' . join('|', $known) .
')[/ ]+(?<version>[0-9.|a-zA-Z.]
)#';
if (!preg_match_all($pattern, $u_agent, $matches)) {
// we have no matching number just continue
}**

respecto a los tutoriales todos estas se basan con la suposicicion que el lector sepa la opp si no me crees puedes buscar mi pregunta y encontraras que todos se basan en lo mismo y son muy parecidos y casi ninguno pone explicacion ni nada.

0voto

magarzon comentado

Pero vamos a ver... que tú solo tienes que llamar a la función get_browser, que lo que haga ella por debajo a ti te da igual.

Por cierto, no entiendo qué es opp. Y dime un ejemplo de búsqueda que has hecho para resolver esta pregunta.

Edito: acabo de ver que el ejemplo que me has puesto es de alguien que se ha hecho su propia función get_browser, porque necesitaba algo más. También puedes copiar ese código, pero sigue dándote igual lo que haga la función, mientras te dé el resultado que buscas.

0voto

steven comentado

opp son las iniciales de programacion orientada a objetos. estoy pensando hacerlo con javascript pero no estoy seguro si esto funcionara si no es asi creo que no tengo opcion que mirar siempre en la penultima linea y filtrarlo manualmente

0voto

magarzon comentado

Es OOP (Oriented Object Programming) y hoy en día es fundamental tener un conocimiento básico de OOP para dedicarte a la programación.

No sé por qué no utilizas get_browser, si es por tu cabezonería de hacer las cosas a tu manera, pues nada que hacer, no sé para qué preguntas

0voto

steven comentado

si hago como tu dices me devuelve un array con mucha info desordenada

$navegador = get_browser(null, true);
print_r($navegador);

Array ( [browser_name_regex] => ~^.$~ [browser_name_pattern] => [browser] => Default Browser [version] => 0 [majorver] => 0 [minorver] => 0 [platform] => unknown [alpha] => [beta] => [win16] => [win32] => [win64] => [frames] => 1 [iframes] => [tables] => 1 [cookies] => [backgroundsounds] => [cdf] => [vbscript] => [javaapplets] => [javascript] => [activexcontrols] => [isbanned] => [ismobiledevice] => [issyndicationreader] => [crawler] => [cssversion] => 0 [supportscss] => [aol] => [aolversion] => 0 )

0voto

magarzon comentado

¿Desordenada? ¿Un array map que te dice en cada entrada el navegador, la versión etc. es información desordenada? ¿Pero qué es lo que quieres?

0voto

steven comentado

ok fue error mio, pero de todos modos no hay ninguna referencia a mi navegador ni al sistema.

0voto

magarzon comentado

Porque como siempre no has leído bien, o no has entendido bien, o qué se yo ya, pero en el primer parámetro no tienes que poner null, tienes que poner lo que obtienes del $_SERVER['HTTP_USER_AGENT']

0voto

steven comentado

pasa lo mismo

<?php

$plataforma = $_SERVER['HTTP_USER_AGENT'];

$navegador = get_browser($plataforma, true);
print_r($navegador);

?>

output

Array ( [browser_name_regex] => ~^.$~ [browser_name_pattern] => [browser] => Default Browser [version] => 0 [majorver] => 0 [minorver] => 0 [platform] => unknown [alpha] => [beta] => [win16] => [win32] => [win64] => [frames] => 1 [iframes] => [tables] => 1 [cookies] => [backgroundsounds] => [cdf] => [vbscript] => [javaapplets] => [javascript] => [activexcontrols] => [isbanned] => [ismobiledevice] => [issyndicationreader] => [crawler] => [cssversion] => 0 [supportscss] => [aol] => [aolversion] => 0 )

0voto

magarzon comentado

Pues lo de siempre, configuración de tu servidor, porque a mí sí me funciona.

De todas formas, ¿para qué quieres saber el navegador?

0voto

steven comentado

nada funciona como debe ser, la documentacion te informa que para funcione la funcion es necesario un archivo el browscap_ini porque no lo trae incluido
entonces he verificado en la carpeta extrar y el archivo si existe pero en la misma nota dice que te descarges otro archivo el php_browscap.ini acabo de bajarmelo y lo he movido a la carpeta extras de php y despues de reiniciar el servidor lo he probado y tampoco funcione a este punto ya no se que mas hacer.
respecto a tu pregunta quiero conocer el navegador para poder optimizar la pagina en base al navegador porque cada uno usa motores distintos y renderizan a su manera. de paso tambien por curiosidad a ver si me detecta con precision
te dejo la nota de la documentacion

Nota:
Para que esto funcione, la configuración de browscap en php.ini debe apuntar a la ubicación correcta del archivo browscap.ini en su sistema.
browscap.ini no está incluido con PHP, pero se pude encontrar un archivo actualizado aquí » php_browscap.ini.
Mientras que browscap.ini contiene información sobre muchos navegadores, recae en el usuario la actualización para mantener la bases de datos vigente. El formato del archivo se explica por sí solo

0voto

magarzon comentado

Si tienes problemas con la configuración, utiliza la función getBrowser que pegaste antes. Básicamente hace lo mismo pero simplificado

0voto

steven comentado

no te preocupes creo que seguira la funcion de antes y tratare de adivinar tanto al dia de hoy se usa mas chrome por lo que si me sale mas voces del motor webkit sabre que se trata de chrome pero si aparece la voz del otro motor entender que es firefox si se tratara de edge aparecerea tambien una voz por lo el problema lo tengo solucionado. lo que no sabria precisar seria solo el sistema ya que si se tratara de windows siempre apareceria el windonws nt con versiones distitnas depende del sistema por lo que si setrata de un numero menor por logica se tratara de versiones de windows viejas.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta