Obtendo o país dos visitantes a partir de seu IP

220

Quero receber visitantes do país por meio de seu IP ... No momento, estou usando isso ( 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á funcionando corretamente, mas o problema é que isso retorna o código do país, como EUA ou CA, e não o nome do país inteiro, como Estados Unidos ou Canadá.

Então, existe alguma boa alternativa para o hostip.info oferece isso?

Eu sei que posso escrever apenas um código que acabará transformando essas duas letras em nomes de países inteiros, mas estou com preguiça de escrever um código que contenha todos os países ...

PS: Por algum motivo, não quero usar nenhum arquivo CSV pronto ou qualquer código que pegue essas informações para mim, algo como código pronto para ip2country e CSV.

Alex C.
fonte
20
Não seja preguiçoso, não existem muitos países e não é muito difícil obter uma tabela de tradução de códigos de letras FIPS 2 para nomes de países.
23712 Chris Henry
Use o recurso MaxMind Geoip. Incluirá o nome do país nos resultados. maxmind.com/app/php
Tchoupi
Sua primeira tarefa para $real_ip_addresssempre é ignorada. De qualquer forma, lembre-se que o X-Forwarded-ForHTTP cabeçalho pode ser extremamente facilmente falsificado, e que há proxies como www.hidemyass.com
Walter Tross
5
O IPLocate.io fornece uma API gratuita: https://www.iplocate.io/api/lookup/8.8.8.8- Isenção de responsabilidade: eu executo este serviço.
ttarik
Sugiro tentar o Ipregistry : api.ipregistry.co/… (aviso: eu executo o serviço).
Laurent

Respostas:

495

Experimente esta função PHP simples.

<?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 usar:

Exemplo1: 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: obtenha detalhes de qualquer endereço IP. [Suporte IPV4 e 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 )

?>
Chandra Nakka
fonte
1
por que estou ficando desconhecido o tempo todo com cada ip? , usou o mesmo código.
echo_Me 18/02
1
Você fica "Desconhecido" provavelmente porque seu servidor não permite file_get_contents(). Basta verificar o seu arquivo error_log. Solução alternativa: veja minha resposta.
Kai Noack
3
Também pode ser porque u verificá-lo localmente (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni
1
Lembre-se de armazenar em cache os resultados por um período definido. Além disso, como nota, você nunca deve confiar em outro site para obter dados, o site pode ficar inoperante, o serviço pode parar etc.
precisa
1
Siga em frente: esse é um problema ao testar um site no host local. Alguma maneira de corrigir para fins de teste? Usa o IP localhost 127.0.0.1 padrão
Nick
54

Você pode usar uma API simples em 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;
}

Resultado

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 você ter tantas opções com as quais pode brincar

obrigado

:)

Baba
fonte
1
Isso é muito legal. Mas enquanto testamos aqui, não há valores nos seguintes campos "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. Qual é o motivo? Existe alguma solução? Agradecemos antecipadamente
WebDevRon
31

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

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

Modifiquei o código do Chandra para que ele também funcione para servidores como esse 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 ajude ;-)

Kai Noack
fonte
1
De acordo com os documentos em seu site: "Se o geoplugin.net estava respondendo perfeitamente, então parou, então você ultrapassou o limite de pesquisa gratuita de 120 solicitações por minuto".
Rick Hellewell,
Trabalhou lindamente. Obrigado!
Najeeb
11

Use MaxMind GeoIP (ou GeoIPLite se você 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);
Joyce Babu
fonte
@ Joyce: Tentei usar a API e o banco de dados Maxmind, mas não sei por que não funciona para mim, na verdade funciona em geral, mas, por exemplo, quando executo esse $ _SERVER ['REMOTE_ADDR']; ele me mostra este ip: 10.48.44.43, mas quando eu o uso em geoip_country_code_by_addr ($ gi, $ ip), ele não retorna nada, alguma ideia?
mOna 21/09/14
É um endereço IP reservado (endereço IP interno da sua rede local). Tente executar o código em um servidor remoto.
precisa saber é o seguinte
10

Confira php-ip-2-country em code.google. O banco de dados que eles fornecem é atualizado diariamente, portanto, não é necessário conectar-se a um servidor externo para verificação, se você hospedar seu próprio servidor SQL. Então, usando o código, você apenas precisará 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 de exemplo (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
)
Zero absoluto
fonte
4
devemos fornecer informações do banco de dados para funcionar? parece não ser bom.
Echo_Me 15/02
10

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

$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);

retornará 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 IP do usuário

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;
}
Ram Sharma
fonte
Eu tentei o seu código, ele retorna isso para mim: Array ([conhecidos] => false)
Mona
quando tento isso: $ ip = $ _SERVER ["REMOTE_ADDR"]; eco $ ip; retorna: 10.48.44.43, você sabe qual é o problema? Eu costumava alspo geoip MaxMind, e quando eu usei geoip_country_name_by_addr ($ gi, $ ip) againit me devolveu nada ...
Mona
@mOna, ele retorna seu endereço IP. para mais detalhes pls, compartilhe seu código.
Ram Sharma
Descobri que o problema é realted para o meu ip, pois é para rede privada. então eu fuond meu ip real no ifconfig e usei no meu programa. então funcionou :) Agora, minha pergunta é como obter ip real no caso desses usuários semelhantes a mim? (se eles usam ip local) .. Eu escrevi meu código aqui: stackoverflow.com/questions/25958564/…
mOna
9

Experimente este código simples de uma linha. Você receberá o país e a cidade dos visitantes a partir do 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'];
Sankar Jay
fonte
9

Você pode usar um serviço da web em 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',
)
Halayem Anis
fonte
Usado ip-api.com porque eles também fornecem o nome do provedor!
Richard Tinkler
1
Eu usei porque eles também fornecem o fuso horário
Roy Shoa 10/10
8

Existe uma versão de arquivo simples bem mantida do banco de dados ip-> country mantida pela comunidade Perl no CPAN

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

Higemaru escreveu um wrapper PHP para conversar com esses dados: php-ip-country-fast

djsadinoff
fonte
6

Muitas maneiras diferentes de fazer isso ...

Solução 1:

Um serviço de terceiros que você pode usar é http://ipinfodb.com . Eles fornecem nome do host, localização geográfica e informações adicionais.

Registre-se para obter uma chave de API aqui: http://ipinfodb.com/register.php . Isso permitirá que você recupere resultados do servidor deles, sem isso não funcionará.

Copie e cole o seguinte código PHP:

$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'];

Desvantagem:

Citando em seu site:

Nossa API gratuita está usando a versão IP2Location Lite, que fornece menor precisão.

Solução 2:

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

$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
imbondbaby
fonte
3
Citando seu site: "Você está limitado a 1.000 solicitações de API por dia. Se precisar fazer mais solicitações ou precisar de suporte SSL, consulte nossos planos pagos".
Walter Tross
Eu o usei no meu site pessoal e foi por isso que o publiquei. Obrigado pela informação ... não percebi. Eu coloquei muito mais esforço no post, por favor, veja o post atualizados :)
imbondbaby
@imbondbaby: Oi, eu tentei o seu código, mas para mim ele retorna isso: Array ([country] => -), não entendo o problema desde quando tento imprimir: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; mostra-me este ip: 10.48.44.43, não consigo entender por que esse ip não funciona! Quero dizer, onde quer que eu insira esse número, ele não retorna nenhum país !!! Você pode me ajudar?
mOna 21/09/14
5

Meu serviço ipdata.co fornece o nome do país em 5 idiomas! Assim como a organização, moeda, fuso horário, código de chamada, sinalizador, dados da operadora de celular, dados de proxy e dados de status do nó de saída do Tor de qualquer endereço IPv4 ou IPv6.

Esta resposta usa uma chave de API 'teste' muito limitada e destinada apenas ao teste de algumas chamadas. Inscreva-se em sua própria chave de API gratuita e receba até 1500 solicitações diárias para desenvolvimento.

Também é extremamente escalável, com 10 regiões ao redor do mundo, cada uma capaz de lidar com mais de 10.000 solicitações 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;
//美国
Jonathan
fonte
1
Deus te abençoe, cara! Eu tenho mais do que aquilo que pedi! Pergunta rápida: posso usá-lo para prod? Quero dizer, você não vai anotar tão cedo, não é?
Disse
1
Nem um pouco :) Na verdade, estou adicionando mais regiões e mais polimento. Fico feliz que você encontrou este para ser de ajuda :)
Jonathan
Muito útil, especialmente com os parâmetros adicionais, resolveu mais de um problema para mim!
Disse
3
Obrigado pelo feedback positivo! Eu construído em torno da maioria dos casos de uso comuns para essa ferramenta, o objetivo era eliminar ter que fazer qualquer processamento adicional após a geolocalização, feliz em ver esta pagando para os usuários
Jonathan
4

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

Uso básico:

// 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: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache

billynoah
fonte
Você usou um elseapós o elsequal causa um erro. O que você tentou impedir? REMOTE_ADDR deve estar disponível o tempo todo?
AlexioVay 27/10/16
@ Vaia - Talvez deva ser, mas você nunca sabe.
billynoah
Existe um caso em que ele não está disponível?
AlexioVay
2
@Vaia - a partir dos documentos do PHP em $_SERVER: "Não há garantia de que todos os servidores da Web forneçam um desses; os servidores podem omitir alguns ou fornecer outros não listados aqui".
billynoah
1
Observe que há um limite para solicitações; do site: "Se o geoplugin.net estava respondendo perfeitamente, então parou, você ultrapassou o limite de pesquisa gratuita de 120 solicitações por minuto".
Rick Hellewell
2

Estou usando a ipinfodb.comAPI e obtendo exatamente o que você está procurando.

É totalmente gratuito, você só precisa se registrar com eles para obter sua chave da API. Você pode incluir a classe php baixando do site ou usar o formato de URL para recuperar informações.

Aqui está o que estou fazendo:

Eu incluí a classe php no meu script e usando 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 aí.

Miraj
fonte
2

você 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; /

    ?>
Aqib1604
fonte
2

Substitua 127.0.0.1pelos 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 ...

Jack M.
fonte
Forneça mais código real do que apenas links físicos.
Bram Vanroy
Notícias posteriores do link: "A partir de 2 de janeiro de 2019, a Maxmind interrompeu os bancos de dados GeoLite originais que usamos em todos esses exemplos. Você pode ler o comunicado completo aqui: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell
2

Eu tenho uma resposta curta que usei em um projeto. Na minha resposta, considero que você 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;
}
Shahbaz
fonte
1

Eu sei que isso é antigo, mas tentei algumas outras soluções aqui e elas parecem estar desatualizadas ou simplesmente retornam nulas. Então foi assim que eu fiz.

Uso http://www.geoplugin.net/json.gp?ip=que não requer nenhum tipo de inscrição ou pagamento pelo serviço.

function get_client_ip_server() {
  $ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
  $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
  $ipaddress = $_SERVER['REMOTE_ADDR'];
else
  $ipaddress = 'UNKNOWN';

  return $ipaddress;
}

$ipaddress = get_client_ip_server();

function getCountry($ip){
    $curlSession = curl_init();
    curl_setopt($curlSession, CURLOPT_URL, 'http://www.geoplugin.net/json.gp?ip='.$ip);
    curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

    $jsonData = json_decode(curl_exec($curlSession));
    curl_close($curlSession);

    return $jsonData->geoplugin_countryCode;
}

echo "County: " .getCountry($ipaddress);

E se você quiser informações extras sobre isso, este é um retorno completo do Json:

{
  "geoplugin_request":"IP_ADDRESS",
  "geoplugin_status":200,
  "geoplugin_delay":"2ms",
  "geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href='http:\/\/www.maxmind.com'>http:\/\/www.maxmind.com<\/a>.",
  "geoplugin_city":"Current City",
  "geoplugin_region":"Region",
  "geoplugin_regionCode":"Region Code",
  "geoplugin_regionName":"Region Name",
  "geoplugin_areaCode":"",
  "geoplugin_dmaCode":"650",
  "geoplugin_countryCode":"US",
  "geoplugin_countryName":"United States",
  "geoplugin_inEU":0,
  "geoplugin_euVATrate":false,
  "geoplugin_continentCode":"NA",
  "geoplugin_continentName":"North America",
  "geoplugin_latitude":"37.5563",
  "geoplugin_longitude":"-99.9413",
  "geoplugin_locationAccuracyRadius":"5",
  "geoplugin_timezone":"America\/Chicago",
  "geoplugin_currencyCode":"USD",
  "geoplugin_currencySymbol":"$",
  "geoplugin_currencySymbol_UTF8":"$",
  "geoplugin_currencyConverter":1
}
Jayce
fonte
1

Eu escrevi uma aula baseada na resposta "Chandra Nakka". Espero que ajude as pessoas a salvar as informações da geoplugin em uma sessão, para que a carga seja muito mais rápida ao recuperar as informações. Ele também salva os valores em uma matriz privada, portanto, recuperar o mesmo código é o mais rápido possível.

class Geo {
private $_ip = null;
private $_useSession = true;
private $_sessionNameData = 'GEO_SESSION_DATA';
private $_hasError = false;
private $_geoData = [];

const PURPOSE_SUPPORT = [
    "all", "*", "location",
    "request",
    "latitude", 
    "longitude",
    "accuracy",
    "timezonde",
    "currencycode",
    "currencysymbol",
    "currencysymbolutf8",
    "country", 
    "countrycode", 
    "state", "region", 
    "city", 
    "address",
    "continent", 
    "continentcode"
];
const CONTINENTS = [
    "AF" => "Africa",
    "AN" => "Antarctica",
    "AS" => "Asia",
    "EU" => "Europe",
    "OC" => "Australia (Oceania)",
    "NA" => "North America",
    "SA" => "South America"
];

function __construct($ip = null, $deepDetect = true, $useSession = true)
{
    // define the session useage within this class
    $this->_useSession = $useSession;
    $this->_startSession();

    // define a ip as far as possible
    $this->_ip = $this->_defineIP($ip, $deepDetect);

    // check if the ip was set
    if (!$this->_ip) {
        $this->_hasError = true;
        return $this;
    }

    // define the geoData
    $this->_geoData = $this->_fetchGeoData();

    return $this;
}

function get($purpose)
{
    // making sure its lowercase
    $purpose = strtolower($purpose);

    // makeing sure there are no error and the geodata is not empty
    if ($this->_hasError || !count($this->_geoData) && !in_array($purpose, self::PURPOSE_SUPPORT)) {
        return 'error';
    }

    if (in_array($purpose, ['*', 'all', 'location']))  {
        return $this->_geoData;
    }

    if ($purpose === 'state') $purpose = 'region';

    return (isset($this->_geoData[$purpose]) ? $this->_geoData[$purpose] : 'missing: '.$purpose);
}

private function _fetchGeoData()
{
    // check if geo data was set before
    if (count($this->_geoData)) {
        return $this->_geoData;
    }

    // check possible session
    if ($this->_useSession && ($sessionData = $this->_getSession($this->_sessionNameData))) {
        return $sessionData;
    }

    // making sure we have a valid ip
    if (!$this->_ip || $this->_ip === '127.0.0.1') {
        return [];
    }

    // fetch the information from geoplusing
    $ipdata = @json_decode($this->curl("http://www.geoplugin.net/json.gp?ip=" . $this->_ip));

    // check if the data was fetched
    if (!@strlen(trim($ipdata->geoplugin_countryCode)) === 2) {
        return [];
    }

    // make a address array
    $address = [$ipdata->geoplugin_countryName];
    if (@strlen($ipdata->geoplugin_regionName) >= 1)
        $address[] = $ipdata->geoplugin_regionName;
    if (@strlen($ipdata->geoplugin_city) >= 1)
        $address[] = $ipdata->geoplugin_city;

    // makeing sure the continentCode is upper case
    $continentCode = strtoupper(@$ipdata->geoplugin_continentCode);

    $geoData = [
        'request' => @$ipdata->geoplugin_request,
        'latitude' => @$ipdata->geoplugin_latitude,
        'longitude' => @$ipdata->geoplugin_longitude,
        'accuracy' => @$ipdata->geoplugin_locationAccuracyRadius,
        'timezonde' => @$ipdata->geoplugin_timezone,
        'currencycode' => @$ipdata->geoplugin_currencyCode,
        'currencysymbol' => @$ipdata->geoplugin_currencySymbol,
        'currencysymbolutf8' => @$ipdata->geoplugin_currencySymbol_UTF8,
        'city' => @$ipdata->geoplugin_city,
        'region' => @$ipdata->geoplugin_regionName,
        'country' => @$ipdata->geoplugin_countryName,
        'countrycode' => @$ipdata->geoplugin_countryCode,
        'continent' => self::CONTINENTS[$continentCode],
        'continentcode' => $continentCode,
        'address' => implode(", ", array_reverse($address))
    ];

    if ($this->_useSession) {
        $this->_setSession($this->_sessionNameData, $geoData);
    }

    return $geoData;
}

private function _startSession()
{
    // only start a new session when the status is 'none' and the class
    // requires a session
    if ($this->_useSession && session_status() === PHP_SESSION_NONE) {
        session_start();
    }
}

private function _defineIP($ip, $deepDetect)
{
    // check if the ip was set before
    if ($this->_ip) {
        return $this->_ip;
    }

    // check if the ip given is valid
    if (filter_var($ip, FILTER_VALIDATE_IP)) {
        return $ip;
    }

    // try to get the ip from the REMOTE_ADDR
    $ip = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);

    // check if we need to end the search for a IP if the REMOTE_ADDR did not
    // return a valid and the deepDetect is false
    if (!$deepDetect) {
        return $ip;
    }

    // try to get the ip from HTTP_X_FORWARDED_FOR
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    // try to get the ip from the HTTP_CLIENT_IP
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    return $ip;
}

private function _hasSession($key, $filter = FILTER_DEFAULT) 
{
    return (isset($_SESSION[$key]) ? (bool)filter_var($_SESSION[$key], $filter) : false);
}

private function _getSession($key, $filter = FILTER_DEFAULT)
{
    if ($this->_hasSession($key, $filter)) {
        $value = filter_var($_SESSION[$key], $filter);

        if (@json_decode($value)) {
            return json_decode($value, true);
        }

        return filter_var($_SESSION[$key], $filter);
    } else {
        return false;
    }
}

private function _setSession($key, $value) 
{
    if (is_array($value)) {
        $value = json_encode($value);
    }

    $_SESSION[$key] = $value;
}

function emptySession($key) {
    if (!$this->_hasSession($key)) {
        return;
    }

    $_SESSION[$key] = null;
    unset($_SESSION[$key]);

}

function curl($url) 
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
}

Respondendo à pergunta 'op' com esta classe, você pode ligar

$country = (new \Geo())->get('country'); // United Kingdom

E as outras propriedades disponíveis são:

$geo = new \Geo('185.35.50.4');
var_dump($geo->get('*')); // allias all / location
var_dump($geo->get('country'));
var_dump($geo->get('countrycode'));
var_dump($geo->get('state')); // allias region
var_dump($geo->get('city')); 
var_dump($geo->get('address')); 
var_dump($geo->get('continent')); 
var_dump($geo->get('continentcode'));   
var_dump($geo->get('request'));
var_dump($geo->get('latitude'));
var_dump($geo->get('longitude'));
var_dump($geo->get('accuracy'));
var_dump($geo->get('timezonde'));
var_dump($geo->get('currencyCode'));
var_dump($geo->get('currencySymbol'));
var_dump($geo->get('currencySymbolUTF8'));

Retornando

array(15) {
  ["request"]=>
  string(11) "185.35.50.4"
  ["latitude"]=>
  string(7) "51.4439"
  ["longitude"]=>
  string(7) "-0.1854"
  ["accuracy"]=>
  string(2) "50"
  ["timezonde"]=>
  string(13) "Europe/London"
  ["currencycode"]=>
  string(3) "GBP"
  ["currencysymbol"]=>
  string(2) "£"
  ["currencysymbolutf8"]=>
  string(2) "£"
  ["city"]=>
  string(10) "Wandsworth"
  ["region"]=>
  string(10) "Wandsworth"
  ["country"]=>
  string(14) "United Kingdom"
  ["countrycode"]=>
  string(2) "GB"
  ["continent"]=>
  string(6) "Europe"
  ["continentcode"]=>
  string(2) "EU"
  ["address"]=>
  string(38) "Wandsworth, Wandsworth, United Kingdom"
}
string(14) "United Kingdom"
string(2) "GB"
string(10) "Wandsworth"
string(10) "Wandsworth"
string(38) "Wandsworth, Wandsworth, United Kingdom"
string(6) "Europe"
string(2) "EU"
string(11) "185.35.50.4"
string(7) "51.4439"
string(7) "-0.1854"
string(2) "50"
string(13) "Europe/London"
string(3) "GBP"
string(2) "£"
string(2) "£"
royalwebs
fonte
0

A API do país do usuário tem exatamente o que você precisa. Aqui está um código de exemplo usando file_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
byl83
fonte
1
Essa API permite 100 chamadas de API (gratuitas) por dia.
reformada
0

Você pode receber visitantes do país e da cidade usando a API geográfica do ipstack. Você precisa obter sua própria API do ipstack e 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: Obtenha visitantes país e cidade em PHP usando a API do ipstack

Faruque Ahamed Mollick
fonte
0

Esta é apenas uma nota de segurança sobre a funcionalidade de get_client_ip()que a maioria das respostas aqui foram incluídas na função principal de get_geo_info_for_this_ip().

Não confie muito nos dados IP nos cabeçalhos de solicitação, Client-IPou X-Forwarded-Forporque eles podem ser falsificados com muita facilidade; no entanto, você deve confiar no IP de origem da conexão TCP que é realmente estabelecida entre o servidor e o cliente $_SERVER['REMOTE_ADDR'], pois pode ' não seja falsificado

$_SERVER['HTTP_CLIENT_IP'] // can be spoofed 
$_SERVER['HTTP_X_FORWARDED_FOR'] // can be spoofed 
$_SERVER['REMOTE_ADDR']// can't be spoofed 

Não há problema em obter o país do IP falsificado, mas lembre-se de que o uso desse IP em qualquer modelo de segurança (por exemplo: banir o IP que envia solicitações frequentes) destruirá todo o modelo de segurança. IMHO Eu prefiro usar o IP do cliente real, mesmo que seja o IP do servidor proxy.

Contador م
fonte
0

Experimentar

  <?php
  //gives you the IP address of the visitors
  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'];
  }

  //return the country code
  $url = "http://api.wipmania.com/$ip";
  $country = file_get_contents($url);
  echo $country;

  ?>
Dipanshu Mahla
fonte
A parte if-else fornecerá o endereço IP do visitante e a próxima parte retornará o código do país. Tente visitar api.wipmania.com e depois api.wipmania.com/[your_IP_address]
Dipanshu Mahla
0

Você pode usar meu serviço: https://SmartIP.io , que fornece nomes completos de países e nomes de cidades de qualquer endereço IP. Também expomos fusos horários, moeda, detecção de proxy, detecção de nós TOR e detecção de criptografia.

Você só precisa se inscrever e obter uma chave de API gratuita que permita 250.000 solicitações por mês.

Usando a biblioteca PHP oficial, a chamada da API se torna:

$apiKey = "your API key";
$smartIp = new SmartIP($apiKey);
$response = $smartIp->requestIPData("8.8.8.8");

echo "\nstatus code: " . $response->{"status-code"};
echo "\ncountry name: " . $response->country->{"country-name"};

Verifique a documentação da API para obter mais informações: https://smartip.io/docs

kevinj
fonte
0

A partir de 2019, o banco de dados do país MaxMind pode ser usado da seguinte maneira:

<?php
require_once 'vendor/autoload.php';
use MaxMind\Db\Reader;
$databaseFile = 'GeoIP2-Country.mmdb';
$reader = new Reader($databaseFile);
$cc = $reader->get($_SERVER['REMOTE_ADDR'])['country']['iso_code'] # US/GB...
$reader->close();

Fonte: https://github.com/maxmind/MaxMind-DB-Reader-php

CONvid19
fonte