New question

Question:

Date: 09-10-2018 17:38:27 (In Spanish)

Obtener datos del visitante [Unresolved]

Hola amigos una consulta me gustaría saber como puedo obtener los datos del visitante por medio de php

Ando en busca de recolectar estos datos.
ip
país
dispositivo
navegador

Les agradezco mucho la ayuda
Tags: PHP - Question - Web Browser Votes: 0 - Answers: 4 - Views: 18 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 10-10-2018 13:27:14 Yo utilizo varios metodos para ello, para la IP utilizo esta funcion:

    
    function IPreal() {
    		$ip =  "";
    		
    		if (!empty($_SERVER['HTTP_CLIENT_IP'])){
    	        $ip = $_SERVER['HTTP_CLIENT_IP'];
    		}else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
    			$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    		}else{
    			$ip = $_SERVER['REMOTE_ADDR'];
    		}
    
    		$e = ($ip !="") ? explode(".",$ip) : ['0'];
    
    		$valid = ['0','10','172','192','169','127'];
    
    		return (!in_array($e[0],$valid)) ? $ip : '186.185.186.227';
    	}
    
    


    alli cargo una ip por defecto si detecto el acceso de modo local, esto es mientras desarrollo

    Para obtener los datos de dicha IP utilizo la base de datos de GeoLite con la siguiente funcion:

    
    function city($X=null){
    		$ip = ($X==null) ? $this->IPreal() : $X;
    		$reader = new Reader($_SERVER['DOCUMENT_ROOT'].'/application/libraries/GeoLite2-City.mmdb');
    		
    		try{
    			$data = $reader->city($ip);
    			
    			$out = (object) array(
    				'isoCode'   => $data->country->isoCode,
    				'nombre'    => $data->country->name,
    				'estado'    => $data->mostSpecificSubdivision->name,
    				'isoEstado' => $data->mostSpecificSubdivision->isoCode,
    				'ciudad'    => $data->city->name,
    				'postal'    => $data->postal->code,
    				'latitud'   => $data->location->latitude,
    				'longitud'  => $data->location->longitude,
    				'timezone'  => $data->location->timeZone,
    			);
    			return $out;
    		}catch(Exception $e){
    			return $e->getMessage();
    		}
        }
    
    


    Esa función retorna la información asociada a dicha IP aqui mas info sobre ellos: GeoLIte

    Y para los dispositivos utilizo esta funcion:

    function dispositivo(){
    
    			$tablet_browser = 0;
    			$mobile_browser = 0;
    			$body_class     = 'desktop';
    
    			if (preg_match('/(tablet|ipad|playbook)|(android(?!.*(mobi|opera mini)))/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
    			    $tablet_browser++;
    			    $body_class = "tablet";
    			}
    
    			if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android|iemobile)/i', strtolower($_SERVER['HTTP_USER_AGENT']))) {
    			    $mobile_browser++;
    			    $body_class = "mobile";
    			}
    
    			if ((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') > 0) or ((isset($_SERVER['HTTP_X_WAP_PROFILE']) or isset($_SERVER['HTTP_PROFILE'])))) {
    			    $mobile_browser++;
    			    $body_class = "mobile";
    			}
    
    			$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'], 0, 4));
    			$mobile_agents = array(
    			    'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
    			    'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
    			    'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
    			    'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
    			    'newt','noki','palm','pana','pant','phil','play','port','prox',
    			    'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
    			    'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
    			    'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
    			    'wapr','webc','winw','winw','xda ','xda-');
    
    			if (in_array($mobile_ua,$mobile_agents)) {
    			    $mobile_browser++;
    			}
    
    			if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'opera mini') > 0) {
    			    $mobile_browser++;
    			    //Check for tablets on opera mini alternative headers
    			    $stock_ua = strtolower(isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA'])?$_SERVER['HTTP_X_OPERAMINI_PHONE_UA']:(isset($_SERVER['HTTP_DEVICE_STOCK_UA'])?$_SERVER['HTTP_DEVICE_STOCK_UA']:''));
    			    if (preg_match('/(tablet|ipad|playbook)|(android(?!.*mobile))/i', $stock_ua)) {
    			      $tablet_browser++;
    			    }
    			}
    			if ($tablet_browser > 0) {
    			// Si es tablet has lo que necesites
    			   //print 'es tablet';
    			   return 'Tablet';
    			}
    			else if ($mobile_browser > 0) {
    			// Si es dispositivo mobil has lo que necesites
    			   //print 'es un mobil';
    			   return 'Smartphone';
    			}
    			else {
    			// Si es ordenador de escritorio has lo que necesites
    			   //print 'es un ordenador de escritorio'
    			   return 'Ordenador';
    			}
    	}//END
    


    debe haber algo más optimizado pero eso tengo por el momento.

    Saludos
      Votes: 3 - Link answer
     
  • Date: 10-10-2018 19:07:21 Oh madre santa jajaja tengo que ver bien ese codigo de momento creo que distes justo en el blanco :)   Votes: 0 - Link answer
     
  • Date: 14-10-2018 04:15:18 Yo utilizo esto para obtener la IP:
    <?php
    
    // Obtiene la IP del usuario
    // Uso: $ip = getip();
    
    function validip($ip) {
    
        if (!empty($ip) && ip2long($ip) != -1) {
    
            $reserved_ips = array(
                array('0.0.0.0', '2.255.255.255'),
                array('10.0.0.0', '10.255.255.255'),
                array('127.0.0.0', '127.255.255.255'),
                array('169.254.0.0', '169.254.255.255'),
                array('172.16.0.0', '172.31.255.255'),
                array('192.0.2.0', '192.0.2.255'),
                array('192.168.0.0', '192.168.255.255'),
                array('255.255.255.0', '255.255.255.255')
            );
    
    
            foreach ($reserved_ips as $r) {
                $min = ip2long($r[0]);
                $max = ip2long($r[1]);
                if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) {
                    return false;
                }
            }
    
            return true;
        } else {
            return false;
        }
    }
    
    function getip() {
    
        if (validip($_SERVER["HTTP_CLIENT_IP"])) {
            return $_SERVER["HTTP_CLIENT_IP"];
        }
    
        foreach (explode(",", $_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
            if (validip(trim($ip))) {
                return $ip;
            }
        }
    
        if (validip($_SERVER["HTTP_X_FORWARDED"])) {
            return $_SERVER["HTTP_X_FORWARDED"];
        } elseif (validip($_SERVER["HTTP_FORWARDED_FOR"])) {
            return $_SERVER["HTTP_FORWARDED_FOR"];
        } elseif (validip($_SERVER["HTTP_FORWARDED"])) {
            return $_SERVER["HTTP_FORWARDED"];
        } elseif (validip($_SERVER["HTTP_X_FORWARDED"])) {
            return $_SERVER["HTTP_X_FORWARDED"];
        } else {
            return $_SERVER["REMOTE_ADDR"];
        }
    }
    ?>
    


    Y en tu código, de esta manera:

    $ip = getip();
    
      Votes: 0 - Link answer
     
  • Date: 14-10-2018 21:59:13 te recomendaria utilizar alguna libreria de geo localizacion, en packagist encontraras muchas gratuitas
    la implementacion en tu proyecto dependera del framework o metodo de dersarrollo que utilices en tu aplicacion, saludos.
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In