Amener les visiteurs du pays à partir de leur IP

220

Je veux obtenir des visiteurs du pays via leur IP ... En ce moment, j'utilise ceci ( http://api.hostip.info/country.php?ip= ......)

Voici mon code:

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

?>

Eh bien, cela fonctionne correctement, mais le fait est que cela renvoie le code du pays comme US ou CA., et pas le nom complet du pays comme United States ou Canada.

Existe-t-il une bonne alternative à hostip.info?

Je sais que je peux simplement écrire du code qui transformera éventuellement ces deux lettres en nom de pays entier, mais je suis juste trop paresseux pour écrire un code qui contient tous les pays ...

PS: Pour une raison quelconque, je ne veux pas utiliser de fichier CSV prêt à l'emploi ou de code qui récupérera ces informations pour moi, quelque chose comme le code prêt à l'emploi ip2country et CSV.

Alex C.
la source
20
Ne soyez pas paresseux, il n'y a pas beaucoup de pays et il n'est pas trop difficile d'obtenir un tableau de traduction des codes de lettres FIPS 2 en noms de pays.
Chris Henry
Utilisez la fonction geoip de Maxmind. Il inclura le nom du pays dans les résultats. maxmind.com/app/php
Tchoupi
Votre première affectation à $real_ip_addressest toujours ignorée. Quoi qu'il en soit, rappelez-vous que l' X-Forwarded-Foren-tête HTTP peut être extrêmement facilement contrefait, et qu'il existe des procurations comme www.hidemyass.com
Walter Tross
5
IPLocate.io fournit une API gratuite: https://www.iplocate.io/api/lookup/8.8.8.8- Avertissement: je lance ce service.
ttarik
Je suggère d'essayer Ipregistry : api.ipregistry.co/… (avertissement: je gère le service).
Laurent

Réponses:

495

Essayez cette simple fonction 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;
}

?>

Comment utiliser:

Exemple 1: obtenir les détails de l'adresse IP du visiteur

<?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 )

?>

Exemple 2: Obtenez des détails sur n'importe quelle adresse IP. [Prise en charge IPV4 et 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
la source
1
pourquoi im devenir inconnu tout le temps avec chaque ip? , utilisé le même code.
echo_Me
1
Vous obtenez "Inconnu" probablement parce que votre serveur ne le permet pas file_get_contents(). Vérifiez simplement votre fichier error_log. Solution: voyez ma réponse.
Kai Noack
3
cela pourrait aussi être parce que vous le vérifiez localement (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni
1
N'oubliez pas de mettre en cache les résultats pour une période définie. De plus, notez que vous ne devriez jamais vous fier à un autre site Web pour obtenir des données, le site Web pourrait tomber, le service pourrait s'arrêter, etc. Et si vous obtenez un nombre accru de visiteurs sur votre site Web, ce service pourrait vous interdire.
machineaddict
1
À suivre: c'est un problème lors du test d'un site sur localhost. Une façon de corriger à des fins de test? Utilise l'IP localhost 127.0.0.1 standard
Nick
54

Vous pouvez utiliser une API simple à partir 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>";

Fonction utilisée

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;
}

Production

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

Cela vous donne tellement d'options avec lesquelles vous pouvez jouer

Merci

:)

Baba
la source
1
C'est vraiment cool. Mais pendant le test, il n'y a pas de valeurs dans les champs suivants "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. Quelle est la raison? y-a-t'il une solution? Merci d'avance
WebDevRon
31

J'ai essayé la réponse de Chandra mais ma configuration de serveur ne permet pas file_get_contents ()

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

J'ai modifié le code de Chandra pour qu'il fonctionne également pour des serveurs comme celui-ci en utilisant 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

?>

J'espère que cela pourra aider ;-)

Kai Noack
la source
2
Selon les docs de leur site: "Si geoplugin.net répondait parfaitement, puis s'est arrêté, alors vous avez dépassé la limite de recherche gratuite de 120 requêtes par minute."
Rick Hellewell
Fonctionne magnifiquement. Merci!
Najeeb
11

Utilisez MaxMind GeoIP (ou GeoIPLite si vous n'êtes pas prêt à payer).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
Joyce Babu
la source
@Joyce: J'ai essayé d'utiliser l'API et la base de données Maxmind, mais je ne sais pas pourquoi cela ne fonctionne pas pour moi, en fait cela fonctionne en général, mais par exemple lorsque j'exécute ce $ _SERVER ['REMOTE_ADDR']; il me montre cette ip: 10.48.44.43, mais quand je l'utilise dans geoip_country_code_by_addr ($ gi, $ ip), ça ne renvoie rien, une idée?
mOna
Il s'agit d'une adresse IP réservée (adresse IP interne de votre réseau local). Essayez d'exécuter le code sur un serveur distant.
Joyce Babu
10

Découvrez php-ip-2-country sur code.google. La base de données qu'ils fournissent est mise à jour quotidiennement, il n'est donc pas nécessaire de se connecter à un serveur externe pour vérifier si vous hébergez votre propre serveur SQL. Donc, en utilisant le code, il vous suffirait de taper:

<?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;
?>

Exemple de code (à partir de la ressource)

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

Production

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
)
Zéro absolu
la source
4
nous devons fournir des informations de base de données pour fonctionner? semble pas bon.
echo_Me
10

Nous pouvons utiliser geobytes.com pour obtenir l'emplacement en utilisant l'adresse IP de l'utilisateur

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

il renverra des données comme celle-ci

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
)

Fonction pour obtenir l'IP de l'utilisateur

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
la source
J'ai essayé votre code, il me renvoie ceci: Array ([known] => false)
mOna
quand j'essaye ceci: $ ip = $ _SERVER ["REMOTE_ADDR"]; echo $ ip; il le renvoie: 10.48.44.43, savez-vous quel est le problème ?? J'ai utilisé alspo maxmind geoip, et quand j'ai utilisé geoip_country_name_by_addr ($ gi, $ ip) à nouveau, il ne m'a rien retourné ...
mOna
@mOna, il retourne votre adresse IP. pour plus de détails, veuillez partager votre code.
Ram Sharma
J'ai trouvé que le problème est lié à mon IP car il s'agit d'un réseau privé. alors je fuond mon vrai ip dans ifconfig et l'ai utilisé dans mon programme. alors cela a fonctionné :) Maintenant, ma question est de savoir comment obtenir une véritable ip dans le cas des utilisateurs similaires à moi? (s'ils utilisent une adresse IP locale) .. J'ai écrit mon code ici: stackoverflow.com/questions/25958564/…
mOna
9

Essayez ce simple code d'une ligne, vous obtiendrez le pays et la ville des visiteurs à partir de leur adresse IP distante.

$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
la source
9

Vous pouvez utiliser un service Web de http://ip-api.com
dans votre code php, procédez comme suit:

<?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';
}
?>

la requête contient de nombreuses autres informations:

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
la source
J'ai utilisé ip-api.com car ils fournissent également le nom du FAI!
Richard Tinkler
1
J'ai utilisé car ils fournissent également le fuseau horaire
Roy Shoa
8

Il existe une version de fichier plat bien entretenue de la base de données ip-> country maintenue par la communauté Perl au CPAN

L'accès à ces fichiers ne nécessite pas de serveur de données et les données elles-mêmes représentent environ 515 Ko

Higemaru a écrit un wrapper PHP pour parler à ces données: php-ip-country-fast

djsadinoff
la source
6

De nombreuses façons de le faire ...

Solution n ° 1:

Un service tiers que vous pourriez utiliser est http://ipinfodb.com . Ils fournissent le nom d'hôte, la géolocalisation et des informations supplémentaires.

Inscrivez-vous pour une clé API ici: http://ipinfodb.com/register.php . Cela vous permettra de récupérer les résultats de leur serveur, sans cela cela ne fonctionnera pas.

Copiez et collez le code PHP suivant:

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

Inconvénient:

Citant de leur site Web:

Notre API gratuite utilise la version IP2Location Lite qui offre une précision inférieure.

Solution n ° 2:

Cette fonction renvoie le nom du pays à l'aide du service 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));

Production:

Array ( [country] => DE - Germany )  // Full Country Name
imbondbaby
la source
3
Citant à partir de leur site Web: "Vous êtes limité à 1 000 demandes d'API par jour. Si vous avez besoin de faire plus de demandes, ou avez besoin de support SSL, consultez nos plans payants."
Walter Tross
Je l'ai utilisé sur mon site Web personnel, c'est pourquoi je l'ai publié. Merci pour l'info ... je ne m'en suis pas rendu compte. J'ai mis beaucoup plus d'efforts sur le post, alors veuillez voir le post mis à jour :)
imbondbaby
@imbondbaby: Salut, j'ai essayé votre code, mais pour moi il retourne ceci: Array ([country] => -), je ne comprends pas le problème depuis quand j'essaie d'imprimer ceci: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; il me montre cette ip: 10.48.44.43, je ne comprends pas pourquoi cette ip ne fonctionne pas! Je veux dire que partout où j'insère ce numéro, il ne renvoie aucun pays !!! counld u plz m'aider?
mOna
5

Mon service ipdata.co fournit le nom du pays en 5 langues! Ainsi que l'organisation, la devise, le fuseau horaire, le code d'appel, l'indicateur, les données de l'opérateur mobile, les données du proxy et les données d'état du nœud de sortie Tor à partir de n'importe quelle adresse IPv4 ou IPv6.

Cette réponse utilise une clé API «test» très limitée et destinée uniquement à tester quelques appels. Inscrivez -vous à votre propre clé API gratuite et recevez jusqu'à 1500 demandes par jour pour le développement.

Il est également extrêmement évolutif avec 10 régions du monde capables chacune de gérer> 10 000 requêtes par seconde!

Les options incluent; Anglais (en), allemand (de), japonais (ja), français (fr) et chinois simplifié (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
la source
1
Que Dieu vous bénisse, mec! J'ai plus que ce que j'ai demandé! Question rapide: puis-je l'utiliser pour prod? Je veux dire, tu ne vas pas le déposer de si tôt, n'est-ce pas?
Sayed
1
Pas du tout :) J'ajoute en fait plus de régions et plus de vernis. Heureux que vous ayez trouvé cela utile :)
Jonathan
Très utile, spécialement avec les paramètres supplémentaires, a résolu plus d'un problème pour moi!
Sayed
3
Merci pour les commentaires positifs! J'ai construit autour des cas d'utilisation les plus courants pour un tel outil, le but était d'éliminer tout traitement supplémentaire après la géolocalisation, heureux de voir que cela porte ses fruits pour les utilisateurs
Jonathan
4

Je ne sais pas s'il s'agit d'un nouveau service mais maintenant (2016) le moyen le plus simple en php est d'utiliser le service web php de geoplugin: http://www.geoplugin.net/php.gp :

Utilisation de base:

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

Ils fournissent également une classe prête à l'emploi: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache

billynoah
la source
Vous avez utilisé un elseaprès elsequi provoque une erreur. Qu'avez-vous essayé d'empêcher? REMOTE_ADDR devrait être disponible tout le temps?
AlexioVay
@Vaia - Peut-être que ça devrait l'être mais on ne sait jamais.
billynoah
Y a-t-il un cas où il n'est pas disponible à votre connaissance?
AlexioVay
2
@Vaia - à partir des documents PHP sur $_SERVER: "Il n'y a aucune garantie que chaque serveur Web fournira l'un de ceux-ci; les serveurs peuvent en omettre certains, ou en fournir d'autres non répertoriés ici."
billynoah
1
Notez qu'il y a une limite aux demandes; de leur site: "Si geoplugin.net répondait parfaitement, puis s'est arrêté, alors vous avez dépassé la limite de recherche gratuite de 120 requêtes par minute."
Rick Hellewell
2

J'utilise l' ipinfodb.comapi et j'obtiens exactement ce que vous cherchez.

C'est entièrement gratuit, il vous suffit de vous inscrire auprès d'eux pour obtenir votre clé api. Vous pouvez inclure leur classe php en téléchargeant à partir de leur site Web ou vous pouvez utiliser le format url pour récupérer des informations.

Voici ce que je fais:

J'ai inclus leur classe php dans mon script et en utilisant le code ci-dessous:

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

C'est tout.

Miraj
la source
2

vous pouvez utiliser http://ipinfo.io/ pour obtenir les détails de l'adresse IP Son facile à utiliser.

<?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
la source
2

Remplacez 127.0.0.1par les visiteurs IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Les instructions d'installation sont ici , et lisez ceci pour savoir comment obtenir la ville, l'état, le pays, la longitude, la latitude, etc.

Jack M.
la source
Veuillez fournir un code plus réel que de simples liens physiques.
Bram Vanroy
Dernières nouvelles du lien: "Depuis le 2 janvier 2019, Maxmind a supprimé les bases de données GeoLite originales que nous utilisons dans tous ces exemples. Vous pouvez lire l'annonce complète ici: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell
2

J'ai une réponse courte que j'ai utilisée dans un projet. Dans ma réponse, je considère que vous avez une adresse IP de visiteur.

$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
la source
1

Je sais que c'est vieux, mais j'ai essayé quelques autres solutions ici et elles semblent obsolètes ou retournent simplement null. Voilà donc comment je l'ai fait.

Utilisation http://www.geoplugin.net/json.gp?ip=qui ne nécessite aucun type d'inscription ou de paiement pour le service.

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

Et si vous voulez des informations supplémentaires à ce sujet, voici un retour complet de 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
la source
1

J'ai écrit un cours basé sur la réponse "Chandra Nakka". J'espère que cela peut aider les gens à sauvegarder les informations de la géoplugine dans une session afin que la charge soit beaucoup plus rapide lors du rappel des informations. Il enregistre également les valeurs dans un tableau privé, donc le rappel dans le même code est le plus rapide possible.

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;
}
}

Répondre à la question «op» avec cette classe que vous pouvez appeler

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

Et les autres propriétés disponibles sont:

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

De retour

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
la source
0

le API User Country a exactement ce dont vous avez besoin. Voici un exemple de code utilisant file_get_contents () comme vous le faites à l'origine:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need
byl83
la source
1
Cette API permet 100 appels d'API (gratuits) par jour.
réformé
0

Vous pouvez obtenir des visiteurs par pays et par ville à l'aide de l'ipstack geo API. Vous devez obtenir votre propre API ipstack, puis utiliser le code ci-dessous:

<?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 ."";
?>

Source: Obtenez des visiteurs pays et ville en PHP en utilisant l'API ipstack

Faruque Ahamed Mollick
la source
0

Ceci est juste une note de sécurité sur la fonctionnalité de la get_client_ip()plupart des réponses qui ont été incluses ici dans la fonction principale deget_geo_info_for_this_ip() .

Ne vous fiez pas trop aux données IP dans les en-têtes de demande, comme Client-IPou X-Forwarded-Forparce qu'elles peuvent être usurpées très facilement, mais vous devez vous fier à l'IP source de la connexion TCP qui est réellement établie entre notre serveur et le client $_SERVER['REMOTE_ADDR']comme il peut '' ne pas être usurpé

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

Il est correct d'obtenir le pays de l'adresse IP usurpée, mais gardez à l'esprit que l'utilisation de cette adresse IP dans n'importe quel modèle de sécurité (par exemple: interdire l'adresse IP qui envoie des demandes fréquentes) détruira l'ensemble du modèle de sécurité. À mon humble avis, je préfère utiliser l'IP client réel, même s'il s'agit de l'IP du serveur proxy.

Comptable م
la source
0

Essayer

  <?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
la source
La partie if-else vous donnera l'adresse IP du visiteur et la partie suivante renverra le code du pays. Essayez de visiter api.wipmania.com puis api.wipmania.com/[your_IP_address]
Dipanshu Mahla
0

Vous pouvez utiliser mon service: https://SmartIP.io , qui fournit les noms de pays complets et les noms de villes de n'importe quelle adresse IP. Nous exposons également les fuseaux horaires, les devises, la détection de proxy, la détection de nœuds TOR et la détection de crypto.

Il vous suffit de vous inscrire et d'obtenir une clé API gratuite qui permet de 250 000 demandes par mois.

En utilisant la bibliothèque PHP officielle, l'appel API devient:

$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"};

Consultez la documentation de l'API pour plus d'informations: https://smartip.io/docs

kevinj
la source
0

À partir de 2019, la base de données de pays MaxMind peut être utilisée comme suit:

<?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();

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

CONvid19
la source