Obter o país de visitantes do seu IP

Quero receber visitantes do país através do IP... Neste momento, estou a usar isto. http://api.hostip.info/country.php?ip=...... )

Aqui está o meu código:
<?php

if (isset($_SERVER['HTTP_CLIENT_IP']))
{
    $real_ip_adress = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $real_ip_adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
    $real_ip_adress = $_SERVER['REMOTE_ADDR'];
}

$cip = $real_ip_adress;
$iptolocation = 'http://api.hostip.info/country.php?ip=' . $cip;
$creatorlocation = file_get_contents($iptolocation);

?>
Bem, está a funcionar bem, mas o problema é que isto devolve o código do país como nós ou CA., e não o nome de todo o país como Estados Unidos ou Canadá.

Então, há alguma boa alternativa para hostip.info oferece isto?

Sei que posso escrever um código que acabará por virar isto. duas letras para o nome do país inteiro, mas sou preguiçoso demais para escrever um código que contém todos os países...

P. S: por alguma razão eu não quero usar nenhum arquivo CSV pronto ou qualquer código que irá pegar esta informação para mim, algo como ip2country ready made code e CSV.

Author: fedorqui, 2012-09-23

21 answers

Tente esta simples função PHP.

<?php

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

?>

Como utilizar:

Example1: obter detalhes do endereço IP do visitante

<?php

echo ip_info("Visitor", "Country"); // India
echo ip_info("Visitor", "Country Code"); // IN
echo ip_info("Visitor", "State"); // Andhra Pradesh
echo ip_info("Visitor", "City"); // Proddatur
echo ip_info("Visitor", "Address"); // Proddatur, Andhra Pradesh, India

print_r(ip_info("Visitor", "Location")); // Array ( [city] => Proddatur [state] => Andhra Pradesh [country] => India [country_code] => IN [continent] => Asia [continent_code] => AS )

?>

Exemplo 2: Obter detalhes de qualquer endereço IP. [Suporte IPV4 & IPV6]

<?php

echo ip_info("173.252.110.27", "Country"); // United States
echo ip_info("173.252.110.27", "Country Code"); // US
echo ip_info("173.252.110.27", "State"); // California
echo ip_info("173.252.110.27", "City"); // Menlo Park
echo ip_info("173.252.110.27", "Address"); // Menlo Park, California, United States

print_r(ip_info("173.252.110.27", "Location")); // Array ( [city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA )

?>
 424
Author: Chandra Nakka, 2014-10-04 14:02:07

Pode usar uma API simples de http://www.geoplugin.net/

$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".getRealIpAddr());
echo $xml->geoplugin_countryName ;


echo "<pre>";
foreach ($xml as $key => $value)
{
    echo $key , "= " , $value ,  " \n" ;
}
echo "</pre>";

Função Utilizada

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

Saída

United States
geoplugin_city= San Antonio
geoplugin_region= TX
geoplugin_areaCode= 210
geoplugin_dmaCode= 641
geoplugin_countryCode= US
geoplugin_countryName= United States
geoplugin_continentCode= NA
geoplugin_latitude= 29.488899230957
geoplugin_longitude= -98.398696899414
geoplugin_regionCode= TX
geoplugin_regionName= Texas
geoplugin_currencyCode= USD
geoplugin_currencySymbol= $
geoplugin_currencyConverter= 1

Faz-te ter tantas opções que podes brincar com

Obrigado.

:)

 44
Author: Baba, 2014-11-13 18:56:52

Tentei a resposta de Chandra, mas a configuração do meu servidor não permite ficheiros _contentes()

PHP Warning: file_get_contents() URL file-access is disabled in the server configuration

Eu modifiquei o código de Chandra para que ele também funcione para servidores como aquele usando cURL:
function ip_visitor_country()
{

    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    $country  = "Unknown";

    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $ip_data_in = curl_exec($ch); // string
    curl_close($ch);

    $ip_data = json_decode($ip_data_in,true);
    $ip_data = str_replace('&quot;', '"', $ip_data); // for PHP 5.2 see stackoverflow.com/questions/3110487/

    if($ip_data && $ip_data['geoplugin_countryName'] != null) {
        $country = $ip_data['geoplugin_countryName'];
    }

    return 'IP: '.$ip.' # Country: '.$country;
}

echo ip_visitor_country(); // output Coutry name

?>

Espero que isso ajude; -)

 20
Author: Kai Noack, 2014-02-19 12:46:30
Na verdade, podes ligar. http://api.hostip.info/?ip=123.125.114.144 para obter a informação, que é apresentada em XML.
 12
Author: Marcus, 2012-09-23 14:38:54

Utilize MaxMind GeoIP (ou GeoIPLite se não estiver pronto para pagar).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
 10
Author: Joyce Babu, 2012-09-23 14:39:47

Utilizar os seguintes serviços

1) http://api.hostip.info/get_html.php?ip=12.215.42.19

2)

$json = file_get_contents('http://freegeoip.appspot.com/json/66.102.13.106');
$expression = json_decode($json);
print_r($expression);

3) http://ipinfodb.com/ip_location_api.php

 10
Author: GBD, 2012-09-23 14:40:27

Confira php-ip-2-country a partir do Código.o. O banco de dados que eles fornecem é atualizado diariamente, por isso não é necessário se conectar a um servidor externo para a verificação se você hospedar o seu próprio servidor SQL. Então usando o código você só teria que digitar:

<?php
$ip = $_SERVER['REMOTE_ADDR'];

if(!empty($ip)){
        require('./phpip2country.class.php');

        /**
         * Newest data (SQL) avaliable on project website
         * @link http://code.google.com/p/php-ip-2-country/
         */
        $dbConfigArray = array(
                'host' => 'localhost', //example host name
                'port' => 3306, //3306 -default mysql port number
                'dbName' => 'ip_to_country', //example db name
                'dbUserName' => 'ip_to_country', //example user name
                'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
                'tableName' => 'ip_to_country', //example table name
        );

        $phpIp2Country = new phpIp2Country($ip,$dbConfigArray);
        $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
        echo $country;
?>

Código do exemplo (a partir do recurso)

<?
require('phpip2country.class.php');

$dbConfigArray = array(
        'host' => 'localhost', //example host name
        'port' => 3306, //3306 -default mysql port number
        'dbName' => 'ip_to_country', //example db name
        'dbUserName' => 'ip_to_country', //example user name
        'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
        'tableName' => 'ip_to_country', //example table name
);

$phpIp2Country = new phpIp2Country('213.180.138.148',$dbConfigArray);

print_r($phpIp2Country->getInfo(IP_INFO));
?>

Resultado

Array
(
    [IP_FROM] => 3585376256
    [IP_TO] => 3585384447
    [REGISTRY] => RIPE
    [ASSIGNED] => 948758400
    [CTRY] => PL
    [CNTRY] => POL
    [COUNTRY] => POLAND
    [IP_STR] => 213.180.138.148
    [IP_VALUE] => 3585378964
    [IP_FROM_STR] => 127.255.255.255
    [IP_TO_STR] => 127.255.255.255
)
 10
Author: AbsoluteƵERØ, 2013-11-13 04:22:12

Podemos usar geobytes.com para obter a localização usando o endereço IP do utilizador

$user_ip = getIP();
$meta_tags = get_meta_tags('http://www.geobytes.com/IPLocator.htm?GetLocation&template=php3.txt&IPAddress=' . $user_ip);
echo '<pre>';
print_r($meta_tags);

Irá devolver dados como este

Array(
    [known] => true
    [locationcode] => USCALANG
    [fips104] => US
    [iso2] => US
    [iso3] => USA
    [ison] => 840
    [internet] => US
    [countryid] => 254
    [country] => United States
    [regionid] => 126
    [region] => California
    [regioncode] => CA
    [adm1code] =>     
    [cityid] => 7275
    [city] => Los Angeles
    [latitude] => 34.0452
    [longitude] => -118.2840
    [timezone] => -08:00
    [certainty] => 53
    [mapbytesremaining] => Free
)
Função

Para obter o utilizador IP

function getIP(){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $pattern = "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/";
    if(preg_match($pattern, $_SERVER["HTTP_X_FORWARDED_FOR"])){
            $userIP = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }else{
            $userIP = $_SERVER["REMOTE_ADDR"];
    }
}
else{
  $userIP = $_SERVER["REMOTE_ADDR"];
}
return $userIP;
}
 10
Author: Ram Sharma, 2014-09-01 10:06:14

Tente este simples código de uma linha, você vai obter país e cidade de visitantes de seu endereço IP remoto.

$tags = get_meta_tags('http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=' . $_SERVER['REMOTE_ADDR']);
echo $tags['country'];
echo $tags['city'];
 9
Author: Sankar Jay, 2014-07-22 09:24:40

Existe uma versão bem conservada da base de dados ip->country, mantida pela comunidade Perl em CPAN.

O acesso a esses ficheiros não requer um servidor de dados, e os dados em si são aproximadamente 515k

Higemaru escreveu um invólucro de PHP para falar com esses dados: php-ip-country-fast

 8
Author: djsadinoff, 2014-07-25 13:03:45

Pode utilizar um serviço web a partir de http://ip-api.com
no seu código php, faça o seguinte :

<?php
$ip = $_REQUEST['REMOTE_ADDR']; // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
  echo 'Hello visitor from '.$query['country'].', '.$query['city'].'!';
} else {
  echo 'Unable to get location';
}
?>

A consulta tem muitas outras informações:

array (
  'status'      => 'success',
  'country'     => 'COUNTRY',
  'countryCode' => 'COUNTRY CODE',
  'region'      => 'REGION CODE',
  'regionName'  => 'REGION NAME',
  'city'        => 'CITY',
  'zip'         => ZIP CODE,
  'lat'         => LATITUDE,
  'lon'         => LONGITUDE,
  'timezone'    => 'TIME ZONE',
  'isp'         => 'ISP NAME',
  'org'         => 'ORGANIZATION NAME',
  'as'          => 'AS NUMBER / NAME',
  'query'       => 'IP ADDRESS USED FOR QUERY',
)
 7
Author: Halayem Anis, 2014-10-05 13:40:01

Muitas maneiras diferentes de o fazer...

Solução #1:

Um serviço de terceiros que você poderia usar é http://ipinfodb.com . Eles fornecem o nome da máquina, a geolocalização e informações adicionais.

Registe-se para uma chave de API aqui: http://ipinfodb.com/register.php . isto permitir-lhe-á obter os resultados do seu servidor, sem isso não irá funcionar.

Copiar e passar o seguinte PHP código:

$ipaddress = $_SERVER['REMOTE_ADDR'];
$api_key = 'YOUR_API_KEY_HERE';

$data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ipaddress&format=json");
$data = json_decode($data);
$country = $data['Country'];

Depressão:

Citando no seu sítio web:

A nossa API livre está a usar a versão lite do IP2Location, que oferece uma versão mais baixa precisao.

Solução #2:

Esta função devolverá o nome do país usando o http://www.netip.de / serviço.

$ipaddress = $_SERVER['REMOTE_ADDR'];
function geoCheckIP($ip)
{
    $response=@file_get_contents('http://www.netip.de/search?query='.$ip);

    $patterns=array();
    $patterns["country"] = '#Country: (.*?)&nbsp;#i';

    $ipInfo=array();

    foreach ($patterns as $key => $pattern)
    {
        $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
    }

        return $ipInfo;
}

print_r(geoCheckIP($ipaddress));

Resultado:

Array ( [country] => DE - Germany )  // Full Country Name
 6
Author: imbondbaby, 2014-07-10 13:24:01

O meu serviço ipdata.co fornece o nome do país em 5 línguas! Assim como a organização, moeda, Fuso horário, código de chamada, bandeira, dados de portadora Móvel, dados de Proxy e dados de status do nó de saída Tor de qualquer endereço IPv4 ou IPv6.

Esta resposta usa uma chave API de' teste ' que é muito limitada e apenas destinada a testar algumas chamadas. Inscreva-se para a sua própria chave API gratuita e chegar a 1500 pedidos diários para o desenvolvimento.

Também é extremamente escalável com 10 regiões ao redor do mundo, cada uma capaz de lidar com >10.000 pedidos por segundo!

As opções incluem: Inglês (en), Alemão (de), Japonês (ja), Francês (fr) e Chinês simplificado (za-CH)

$ip = '74.125.230.195';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
echo $details->country_name;
//United States
echo $details->city;
//Mountain View
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test/zh-CN"));
echo $details->country_name;
//美国
 5
Author: Jonathan, 2018-08-29 16:00:07

Não sei se este é um novo serviço, mas agora (2016) a maneira mais fácil de php é usar o serviço web php do geoplugin: http://www.geoplugin.net/php.gp:

Utilização básica:

// GET IP ADDRESS
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 if (!empty($_SERVER['REMOTE_ADDR'])) {
    $ip = $_SERVER['REMOTE_ADDR'];
} else {
    $ip = false;
}

// CALL THE WEBSERVICE
$ip_info = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip));

Eles também fornecem uma classe pronta construída: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache

 4
Author: billynoah, 2016-10-27 13:39:26
Tenho uma resposta curta para esta pergunta que usei num projecto. Na minha resposta, considero que tem o endereço IP do visitante
$ip = "202.142.178.220";
$ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
//get ISO2 country code
if(property_exists($ipdat, 'geoplugin_countryCode')) {
    echo $ipdat->geoplugin_countryCode;
}
//get country full name
if(property_exists($ipdat, 'geoplugin_countryName')) {
    echo $ipdat->geoplugin_countryName;
}
Se isso o ajudar a votar na minha resposta.
 3
Author: Shahbaz, 2016-01-06 13:23:52

Estou a usar a api ipinfodb.com e a conseguir exactamente o que procuras.

É completamente grátis, só precisa de se registar com eles para obter a sua chave de api. Você pode incluir a classe php deles baixando de seu site ou você pode usar o formato url para recuperar informações. Eis o que estou a fazer:

Incluí a classe php deles no meu guião e usei o código abaixo:

$ipLite = new ip2location_lite;
$ipLite->setKey('your_api_key');
if(!$_COOKIE["visitorCity"]){ //I am using cookie to store information
  $visitorCity = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
  if ($visitorCity['statusCode'] == 'OK') {
    $data = base64_encode(serialize($visitorCity));
    setcookie("visitorCity", $data, time()+3600*24*7); //set cookie for 1 week
  }
}
$visitorCity = unserialize(base64_decode($_COOKIE["visitorCity"]));
echo $visitorCity['countryName'].' Region'.$visitorCity['regionName'];
É isso.
 2
Author: Miraj, 2014-09-03 07:14:26

Pode usar http://ipinfo.io/ para obter detalhes do endereço ip é fácil de usar .

<?php
    function ip_details($ip)
    {
    $json = file_get_contents("http://ipinfo.io/{$ip}");
    $details = json_decode($json);
    return $details;
    }

    $details = ip_details(YoUR IP ADDRESS); 

    echo $details->city;
    echo "<br>".$details->country; 
    echo "<br>".$details->org; 
    echo "<br>".$details->hostname; /

    ?>
 2
Author: Aqib1604, 2014-10-15 06:44:03

Substituir 127.0.0.1 com visitantes IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

As instruções de instalação estão Aqui , e Leia isto para saber como obter Cidade, Estado, País, Longitude, Latitude, etc...

 2
Author: Jack M., 2014-11-01 12:55:09

Uma linha com um endereço IP para o país API

echo file_get_contents('https://ipapi.co/8.8.8.8/country_name/');

> United States

Exemplo:

Https://ipapi.co/country_name / - o seu país

Https://ipapi.co/8.8.8.8/country_name/ - país para IP 8.8.8.8

 2
Author: user6885709, 2018-02-08 04:14:16

A API do país Utilizador tem exactamente o que precisa. Aqui está um código de exemplo usando o ficheiro_get_contents () como você faz originalmente:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need
 0
Author: byl83, 2017-08-10 04:05:07
Pode receber visitantes do país e da cidade usando ipstack geo API.Você precisa obter sua própria API ipstack e então usar o código abaixo:
<?php
 $ip = $_SERVER['REMOTE_ADDR']; 
 $api_key = "YOUR_API_KEY";
 $freegeoipjson = file_get_contents("http://api.ipstack.com/".$ip."?access_key=".$api_key."");
 $jsondata = json_decode($freegeoipjson);
 $countryfromip = $jsondata->country_name;
 echo "Country: ". $countryfromip ."";
?>

Fonte: Obter visitantes país e cidade em PHP usando API ipstack

 0
Author: Faruque Ahamed Mollick, 2018-07-13 15:14:00