Как получить Страну по определенному IP?

Кто-нибудь знает простой способ получить страну для данного IP-адреса? Желательно в формате ISO_3166-1?

4.08.2008 05:15:35
Не стоит слишком полагаться на IP, сообщающий вам страну, в которой находится пользователь: поскольку я работаю в скандинавской компании, я продолжаю видеть рекламу на шведском языке, даже если наш офис находится в Шотландии ...
AAT 13.01.2010 13:45:19
Точно - если вы думаете об этом. Есть много случаев, когда вы, кажется, пришли откуда-то, но на самом деле пришли откуда-то еще. Все сводится к тому, что топология сети не должна подтверждать политические или геологические границы. F.ex. VPN, беспроводные, спутниковые и так далее.
Phluks 6.02.2013 10:26:11
14 ОТВЕТОВ
РЕШЕНИЕ

Многие люди (включая мою компанию), похоже, используют MaxMind GeoIP.

У них есть бесплатная версия GeoLite, которая не так точна, как платная версия, но если вам нужна простая вещь , она может быть достаточно хорошей.

36
8.10.2014 00:17:40
Ссылка GeoLite выше приводит к 404, когда я проверил сегодня.
Parag 17.02.2014 23:04:10

Есть два подхода: использование интернет-сервиса и использование какого-то локального списка (возможно, в библиотеке). То, что вы хотите, будет зависеть от того, что вы строите.

За услуги:

Для списков:

39
23.05.2017 12:26:00
Один из самых полезных ответов в общем, что я видел в SO. Спасибо!
tzot 3.10.2008 12:08:59
Возможно, вы знаете, есть ли в RIR более подробная информация, например, о геопространстве в базе данных maxmind, доступная в виде открытых данных? Я действительно смотрел, но не мог найти это
Jevado 29.07.2011 09:44:46

Вот хороший бесплатный сервис с открытым API: http://www.hostip.info/use.html

10
4.08.2008 05:21:59

ipinfodb предоставляет бесплатную базу данных и API для IP в страну и наоборот. Они используют бесплатные данные от MaxMind. Данные обновляются каждый месяц, и это отличная бесплатная альтернатива с приличной точностью.

8
25.05.2013 13:54:58
Это намного лучше, чем поддерживать свою собственную базу данных. Только что проверил это в очень непонятном месте (Uthai Thani, Таиланд), и это было на месте. Отличная находка, спасибо!
Jannie Theunissen 29.07.2010 13:05:46

Я не знаю, насколько точен этот сайт hostip.info. Я только что посетил этот сайт, и он сообщил, что моя страна Канада. Я нахожусь в США, и интернет-провайдер, который использует мой офис, работает только из США. Это позволяет вам исправить это предположение, но если вы используете этот сервис для отслеживания посещений веб-сайтов по странам, у вас не будет возможности узнать, верны ли данные. Конечно, я всего лишь одна точка данных. Я загрузил базу данных GeoLite Country, которая является просто файлом .csv, и мой IP-адрес был правильно определен как США.

Еще одно преимущество линейки продуктов MaxMind (платной или бесплатной) заключается в том, что у вас есть данные, что не сказывается на производительности при вызове веб-службы в другую систему.

5
4.08.2008 14:02:14
Я в Великобритании и мне сказали, что я в Рио, Бразилия :)
Mike 8.05.2011 15:44:50

Наиболее точным является Digital Elements NetAcuity ... не бесплатно, но вы получаете то, за что платите большую часть времени .... Digital Element

2
27.09.2008 03:04:41

клиентское местоположение Google возвращается ( мой пример )

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
2
13.01.2010 13:25:21

Вы можете использовать решение, предоставленное для этого вопроса .

Но он возвращает 2-значный код страны.

2
23.05.2017 12:02:20

Попробуйте этот код PHP

  <?php  $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
    $json = json_decode($json,true);
    $timezone = $json[localTimeZone];?>
2
30.07.2012 08:07:35

Вы можете использовать мой сервис, http://ipinfo.io , для этого. API возвращает целую кучу разных деталей об IP-адресе:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "CA",
  "country": "US",
  "phone": 650
}

Если вы только после кода страны, вам просто нужно добавить / страну к URL:

$ curl ipinfo.io/8.8.8.8/country
US

Вот общая функция PHP, которую вы можете использовать:

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

$details = ip_details("8.8.8.8");

echo $details->city;     // => Mountain View
echo $details->country;  // => US
echo $details->org;      // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com

В этих примерах я использовал IP 8.8.8.8, но если вам нужны подробности для IP-адреса пользователя, просто передайте его $_SERVER['REMOTE_ADDR']. Более подробная информация доступна на http://ipinfo.io/developers

2
26.08.2014 04:49:49

используйте функцию ipToCountry ($ ip) с http://www.mmtutorialvault.com/php-ip-to-country-function/

1
27.06.2013 17:54:01

Вы можете использовать API веб-сервисов, которые выполняют эту работу следующим образом:

see example of service: http://ip-api.com and usage: http://whatmyip.info
1
28.05.2014 12:57:32

См. Ipdata.co, который дает вам несколько точек данных с IP-адреса.

API довольно быстрый, с 10 глобальными конечными точками, каждая из которых может обрабатывать более 800 миллионов вызовов ежедневно.

Вот пример завитка;

curl https://api.ipdata.co/78.8.53.5
{
    "ip": "78.8.53.5",
    "city": "G\u0142og\u00f3w",
    "region": "Lower Silesia",
    "region_code": "DS",
    "country_name": "Poland",
    "country_code": "PL",
    "continent_name": "Europe",
    "continent_code": "EU",
    "latitude": 51.6461,
    "longitude": 16.1678,
    "asn": "AS12741",
    "organisation": "Netia SA",
    "postal": "67-200",
    "currency": "PLN",
    "currency_symbol": "z\u0142",
    "calling_code": "48",
    "flag": "https://ipdata.co/flags/pl.png",
    "emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
    "time_zone": "Europe/Warsaw",
    "is_eu": true,
    "suspicious_factors": {
        "is_tor": false
    }
}⏎  
0
18.02.2018 19:05:11

Вы можете попробовать бесплатную базу данных IP2Location LITE

Создать таблицу в MySQL

CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db1`(
    `ip_from` INT(10) UNSIGNED,
    `ip_to` INT(10) UNSIGNED,
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Чтобы импортировать данные

LOAD DATA LOCAL
    INFILE 'IP2LOCATION-LITE-DB1.CSV'
INTO TABLE
    `ip2location_db1`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;

PHP-код для запроса MySQL

<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";

// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];

// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);

// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");

// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");

// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";

// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");

// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);

// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;

echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";

// Free recordset and close database connection
mysql_free_result($result);
mysql_close($link);

// Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1)
function Dot2LongIP ($IPaddr) {
 if ($IPaddr == "")
 {
   return 0;
 } else {
   $ips = explode(".", $IPaddr);
   return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
 }
}
?>
0
27.02.2018 05:32:26