Отримання країни відвідувачів від їх IP


220

Я хочу отримати країну відвідувачів через їх IP ... Зараз я цим користуюся ( http://api.hostip.info/country.php?ip= ......)

Ось мій код:

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

?>

Ну, це працює належним чином, але річ у тому, що це повертає код країни, наприклад, США чи CA., а не назву всієї країни, наприклад, США чи Канада.

Отже, чи є якась хороша альтернатива hostip.info, що пропонує це?

Я знаю, що я можу просто написати якийсь код, який згодом перетворить ці дві літери на цілу назву країни, але мені просто лінь писати код, який містить усі країни ...

PS: Я чомусь не хочу використовувати будь-який готовий файл CSV або будь-який код, який захопить цю інформацію для мене, щось на зразок готового коду ip2country та CSV.


20
Не лінуйтеся, не так багато країн, і не так складно отримати таблицю перекладу кодів літер FIPS 2 до назв країн.
Кріс Генрі

Використовуйте функцію Maxmind geoip. Він буде включати назву країни в результати. maxmind.com/app/php
Tchoupi

Ваше перше доручення $real_ip_addressзавжди ігнорується. У будь-якому разі пам’ятайте, що X-Forwarded-Forзаголовок HTTP можна надзвичайно легко підробити, а також є такі проксі, як www.hidemyass.com
Walter Tross

5
IPLocate.io надає безкоштовний API: https://www.iplocate.io/api/lookup/8.8.8.8- Відмова: Я запускаю цю послугу.
ttarik

Я пропоную спробувати Ipregistry : api.ipregistry.co/… (відмова від відповідальності: я запускаю службу).
Лоран

Відповіді:


495

Спробуйте цю просту функцію 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;
}

?>

Як використовувати:

Приклад1: Отримання даних про IP-адресу відвідувача

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

?>

Приклад 2: Отримайте детальну інформацію про будь-яку IP-адресу. [Підтримка 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 )

?>

1
Чому я весь час не знаю, з кожним ip? , використовується той же код.
echo_Me

1
Ви отримуєте "Невідомо", ймовірно, тому, що ваш сервер не дозволяє file_get_contents(). Просто перевірте свій файл error_log. Обхід: див мою відповідь.
Кай Ноак

3
також це може бути тому, що ти перевіриш локально (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Хонтоні

1
Не забудьте кешувати результати за певний період. Крім того, зауважте, що ніколи не слід покладатися на інший веб-сайт, щоб отримати будь-які дані, веб-сайт може знизитися, сервіс може припинитися і т. Д. І якщо ви отримаєте збільшену кількість відвідувачів на своєму веб-сайті, ця послуга може заборонити вас.
машинобудівний вирок

1
Продовжуйте: це питання під час тестування сайту на localhost. Будь-який спосіб виправити для тестування? Використовує стандартний 127.0.0.1 localhost IP
Nick

54

Ви можете використовувати простий API від 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>";

Функція, що використовується

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

Вихідні дані

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

Це робить у вас так багато варіантів, з якими можна пограти

Дякую

:)


1
Це дійсно круто. Але під час тестування тут немає значень у наступних полях "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. У чому причина? Чи є рішення? Дякую заздалегідь
WebDevRon

31

Я спробував відповідь Чандри, але моя конфігурація сервера не дозволяє file_get_contents ()

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

Я змінив код Chandra, щоб він також працював на таких серверах, використовуючи 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

?>

Сподіваюся, що це допомагає ;-)


1
Згідно з документами на їхньому сайті: "Якщо geoplugin.net реагував ідеально, то зупинився, ви перейшли за межу безкоштовного пошуку 120 запитів за хвилину"
Рік Гелвелл

Працювали красиво. Дякую!
Najeeb


11

Використовуйте MaxMind GeoIP (або GeoIPLite, якщо ви не готові платити).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

@Joyce: Я намагався використовувати API Maxmind і DB, але я не знаю, чому це не працює для мене, насправді він працює в цілому, але, наприклад, коли я запускаю цей $ _SERVER ['REMOTE_ADDR']; він показує мені цей ip: 10.48.44.43, але коли я використовую його в geoip_country_code_by_addr ($ gi, $ ip), він нічого не повертає, будь-яка ідея?
mOna

Це зарезервована ip-адреса (внутрішня ip-адреса з вашої локальної мережі). Спробуйте запустити код на віддаленому сервері.
Джойс Бабу


10

Перегляньте php-ip-2-країну з code.google. База даних, яку вони надають, оновлюється щодня, тому не потрібно підключатися до зовнішнього сервера для перевірки, якщо ви розміщуєте власний SQL-сервер. Отже, використовуючи код, вам слід було б лише набрати:

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

Приклад коду (з ресурсу)

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

Вихідні дані

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
)

4
ми повинні надати інформацію бази даних для роботи? здається, не добре.
echo_Me

10

Ми можемо використовувати geobytes.com для отримання місцезнаходження за допомогою IP-адреси користувача

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

він поверне такі дані

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
)

Функція отримання 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;
}

Я спробував ваш код, він мені це повертає: Array ([відомий] => false)
mOna

коли я спробую це: $ ip = $ _SERVER ["REMOTE_ADDR"]; ехо $ ip; він повертає його: 10.48.44.43, чи знаєте ви, в чому проблема ?? Я використовував alspo maxmind geoip, а коли я використав geoip_country_name_by_addr ($ gi, $ ip), знову мені нічого не повернув ...
mOna

@mOna, він повертає вашу ip-адресу. для отримання детальної інформації, будь ласка, поділіться своїм кодом.
Рам Шарма

Я виявив, що проблема пов'язана з моїм ip, оскільки це стосується приватної мережі. то я знаходжу свій реальний ip у ifconfig і використовую його у своїй програмі. тоді це спрацювало :) Тепер моє запитання - як отримати справжній ip у випадку тих, хто схожий на мене? (Якщо вони використовують локальний IP) .. я написав код тут: stackoverflow.com/questions/25958564 / ...
Mona

9

Спробуйте цей простий код з одним рядком, ви отримаєте країну та місто відвідувачів з їх віддаленої адреси ip.

$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

Ви можете використовувати веб-сервіс від http://ip-api.com
у своєму PHP-коді, зробіть наступне:

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

у запиті є багато іншої інформації:

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',
)

Використовується ip-api.com, оскільки вони також надають ім'я провайдера!
Річард Тінклер

1
Я використовував, тому що вони також постачають Timezone
Roy Shoa

8

Існує доглянута версія файлу бази даних ip-> country, що підтримується спільнотою Perl в CPAN

Доступ до цих файлів не потребує сервера даних, а сам дані приблизно 515 к

Higemaru написав обгортку PHP, щоб поговорити з цими даними: php-ip-country-fast


6

Багато різних способів це зробити ...

Рішення №1:

Служба третьої сторони, яку ви можете використати, - http://ipinfodb.com . Вони надають ім'я хоста, геолокацію та додаткову інформацію.

Зареєструйтесь для ключа API тут: http://ipinfodb.com/register.php . Це дозволить отримати результати з їх сервера, без цього не вийде.

Скопіюйте та вставте наступний 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'];

Нижня сторона:

Цитуючи їх веб-сайт:

Наш безкоштовний API використовує версію IP2Location Lite, яка забезпечує меншу точність.

Рішення №2:

Ця функція поверне ім'я країни за допомогою послуги 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));

Вихід:

Array ( [country] => DE - Germany )  // Full Country Name

3
Цитуючи з їх веб-сайту: "Ви обмежені до 1000 запитів API щодня. Якщо вам потрібно зробити більше запитів або вам потрібна підтримка SSL, перегляньте наші платні плани".
Вальтер Трос

Я використовував його на своєму особистому веб-сайті, тому я і розмістив його. Дякую за інформацію ... не усвідомлював цього. Я доклав набагато більше зусиль до публікації, тому, будь ласка, дивіться оновлений пост :)
imbondbaby

@imbondbaby: Привіт, я спробував ваш код, але він повертає це: Array ([країна] => -), я не розумію проблеми з тих пір, коли я намагаюся надрукувати це: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; він показує мені цей ip: 10.48.44.43, я не можу зрозуміти, чому цей ip не працює! Я маю на увазі, де б я не вставив цей номер, він не повертає жодної країни !!! порадив у PLZ допомогти мені?
mOna

5

Мій сервіс ipdata.co надає назву країни на 5 мовах! А також організацію, валюту, часовий пояс, код виклику, прапор, дані мобільного оператора, дані проксі та дані про стан виходу Tor із будь-якої адреси IPv4 або IPv6.

У цій відповіді використовується тестовий ключ API, який дуже обмежений і призначений лише для тестування кількох викликів. Підпишіться на свій власний Безкоштовний ключ API та отримуйте до 1500 запитів щодня на розвиток.

Це також надзвичайно масштабується, оскільки 10 регіонів у всьому світі можуть обробити> 10 000 запитів в секунду!

Варіанти включають; Англійська (en), німецька (de), японська (ja), французька (fr) та спрощена китайська (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;
//美国

1
Бог тебе благослови, чоловіче! Я отримав більше, ніж просив! Швидке запитання: чи можу я використовувати його для prod? Я маю на увазі, ти скоро не збираєшся здавати це, чи не так?
Сказав

1
Зовсім не :) Я насправді додаю більше регіонів та більше польської мови. Радий, що вам це допомогло :)
Джонатан

Дуже корисно, спеціально з додатковими парамами вирішила не одну проблему для мене!
Сказав

3
Дякуємо за позитивні відгуки! Я створив навколо найпоширеніших випадків використання такого інструменту, метою було усунути необхідність додаткової обробки після геолокації, радий, що це окупається користувачами
Джонатан

4

Не впевнений, чи це нова послуга, але зараз (2016 р.) Найпростішим способом у php є використання веб-сервісу php geoplugin: http://www.geoplugin.net/php.gp :

Основне використання:

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

Вони також забезпечують готовий клас: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache


Ви використовували те, elseпісля elseчого викликає помилку. Що ви намагалися запобігти? REMOTE_ADDR повинен бути доступний постійно?
AlexioVay

@Vaia - Можливо, так і має бути, але ніколи не знаєш.
billynoah

Чи є випадок, коли він доступний вам невідомо?
AlexioVay

2
@Vaia - з документів PHP на тему $_SERVER: "Немає гарантії, що кожен веб-сервер надасть будь-яке з них; сервери можуть опускати деякі або надавати інші, які не вказані тут."
billynoah

1
Зверніть увагу: існує обмеження на кількість запитів; з їхнього сайту: "Якщо geoplugin.net реагував ідеально, то зупинився, значить, ви перевищили ліміт безкоштовного пошуку 120 запитів за хвилину".
Рік Гелвелл

2

Я використовую ipinfodb.comapi і отримую саме те, що ви шукаєте.

Це абсолютно безкоштовно, вам просто потрібно зареєструватися у них, щоб отримати ключ api. Ви можете включити їхній клас PHP, завантаживши з їхнього веб-сайту, або ви можете використовувати формат URL для отримання інформації.

Ось що я роблю:

Я включив їхній клас php у свій сценарій та використовуючи наведений нижче код:

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

Це воно.


2

ви можете використовувати http://ipinfo.io/, щоб отримати детальну інформацію про ip-адресу.

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

Замініть 127.0.0.1відвідувачів IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Тут наведено інструкції з установки , і прочитайте цю інформацію, щоб дізнатися, як отримати місто, штат, країну, довготу, широту тощо ...


Надайте більше фактичного коду, ніж лише жорсткі посилання.
Брам Ванрой

Пізніші новини за посиланням: "З 2 січня 2019 року Maxmind скасував оригінальні бази даних GeoLite, які ми використовували у всіх цих прикладах. Повне повідомлення ви можете прочитати тут: support.maxmind.com/geolite-legacy-discontinuation-notice "
Рік Гелвелл


2

У мене є коротка відповідь, яку я використав у проекті. У своїй відповіді я вважаю, що у вас IP-адреса відвідувача.

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

1

Я знаю, що це старе, але я спробував декілька інших рішень тут, і вони здаються застарілими або просто повертаються нульовими. Так ось і я це зробив.

Використання http://www.geoplugin.net/json.gp?ip=яких не потребує будь-якого типу реєстрації або оплати послуги.

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

І якщо ви хочете отримати додаткову інформацію про це, це повне повернення 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
}

1

Я написав клас на основі відповіді "Чандра Накка". Сподіваємось, це може допомогти людям, зберігаючи інформацію від geoplugin до сеансу, тому завантаження відбувається набагато швидше при згадці інформації. Він також зберігає значення в приватному масиві, тому виклик у тому самому коді є найшвидшим, як це могло бути.

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

Відповідаючи на питання "op" за допомогою цього класу, ви можете зателефонувати

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

Інші доступні властивості:

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

Повернення

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) "£"

0

Користувач Країна API має саме те , що вам потрібно. Ось зразок коду з використанням file_get_contents (), як ви робили раніше:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need

1
Цей API дозволяє 100 (безкоштовних) дзвінків API на день.
реформовано

0

Ви можете отримати країну та місто відвідувачів за допомогою ipstack geo API. Вам потрібно отримати власний API ipstack, а потім скористатись наведеним нижче кодом:

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

Джерело: Отримайте країну та місто відвідувачів у PHP за допомогою API ipstack


0

Це лише застереження щодо функціональності, get_client_ip()що більшість відповідей тут включено до основної функції get_geo_info_for_this_ip().

Не надто покладайтеся на дані IP в заголовках запитів, як-от Client-IPабо X-Forwarded-Forтому, що вони можуть бути легко підроблені, однак ви повинні покладатися на вихідний IP-з'єднання TCP, яке фактично встановлено між нашим сервером і клієнтом, $_SERVER['REMOTE_ADDR']як це можливо " не підробляйте

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

Добре отримати країну підробленого IP, але майте на увазі, що використання цього IP в будь-якій моделі безпеки (наприклад: заборона IP, що надсилає часті запити) знищить всю модель безпеки. IMHO Я вважаю за краще використовувати фактичну IP-адресу клієнта, навіть якщо це IP-проксі-сервер.


0

Спробуйте

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

  ?>

Частина if-else дасть вам IP-адресу відвідувача, а наступна частина поверне код країни. Спробуйте відвідати api.wipmania.com, а потім api.wipmania.com/ evidenceyour_IP_address]
Dipanshu Mahla

0

Ви можете скористатися моєю послугою: https://SmartIP.io , яка надає повні назви країн та назви міст будь-якої IP-адреси. Ми також виставляємо часові пояси, валюту, виявлення проксі, виявлення вузлів TOR та виявлення криптовалют.

Вам просто потрібно зареєструватися та отримати безкоштовний ключ API, який дозволяє отримувати 250 000 запитів на місяць.

Використовуючи офіційну бібліотеку PHP, виклик API стає:

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

Перегляньте документацію API для отримання додаткової інформації: https://smartip.io/docs


0

Станом на 2019 рік БД країни MaxMind може використовуватися таким чином:

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

Джерело: https://github.com/maxmind/MaxMind-DB-Reader-php


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.