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

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


person DylanJ    schedule 04.08.2008    source источник
comment
Не слишком полагайтесь на IP-адрес, сообщающий вам страну, в которой находится пользователь: поскольку я работаю в скандинавской компании, я постоянно вижу рекламу на шведском языке, хотя наш офис находится в Шотландии...   -  person AAT    schedule 13.01.2010
comment
Именно - если подумать. Есть много случаев, когда кажется, что вы пришли откуда-то, но на самом деле пришли откуда-то еще. Все дело в том, что топология сети не должна соответствовать политическим или геологическим границам. F.ex. VPN, беспроводная связь, спутник и так далее.   -  person Phluks    schedule 06.02.2013


Ответы (15)


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

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

person Orion Edwards    schedule 04.08.2008
comment
Ссылка GeoLite выше приводит к 404, когда я проверил сегодня. - person Parag; 18.02.2014

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

За услуги:

Для списков:

person Warren Blanchet    schedule 15.09.2008
comment
Один из самых полезных ответов в целом, которые я видел в SO. Спасибо! - person tzot; 03.10.2008
comment
Возможно, вы знаете, есть ли у RIR более подробная информация, такая как база данных geopipcity от maxmind, доступная в виде открытых данных? Я смотрел, но не нашел - person Jevado; 29.07.2011

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

person Mark Harrison    schedule 04.08.2008

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

person Donny Kurnia    schedule 13.01.2010
comment
Намного лучше, чем поддерживать собственную базу данных. Только что протестировал его в очень малоизвестном месте (Утаи Тани, Таиланд), и он оказался на высоте. Отличная находка, спасибо! - person Jannie Theunissen; 29.07.2010

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

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

person Chris Miller    schedule 04.08.2008
comment
Я в Великобритании, и это сказало, что я был в Рио, Бразилия :) - person Mike; 08.05.2011

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

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
person Niklas R.    schedule 13.01.2010

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

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

person zak    schedule 19.10.2011

Попробуйте этот 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];?>
person pckabeer    schedule 30.07.2012

Для этого вы можете использовать мой сервис 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
}

Если вам нужен только код страны, вам просто нужно добавить /country к 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.

person Ben Dowling    schedule 26.08.2014

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

person CSharpAtl    schedule 27.09.2008

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

person Community    schedule 27.06.2013

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

see example of service: http://ip-api.com and usage: http://whatmyip.info
person user3463375    schedule 26.05.2014

Вы можете попробовать бесплатную базу данных 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);
 }
}
?>
person Vlam    schedule 27.02.2018

См. 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
    }
}⏎  
person Jonathan    schedule 18.02.2018

Вы можете попробовать https://astroip.co, это новый созданный мной API геолокации, который предоставляет геоданные. вместе с другими полезными точками данных, такими как валюта, часовой пояс, данные ASN и безопасность.

Вот пример ответа json:

curl https://api.astroip.co/70.163.7.1
{
  "status_code": 200,
  "geo": {
    "is_metric": false,
    "is_eu": false,
    "longitude": -77.0924,
    "latitude": 38.7591,
    "country_geo_id": 6252001,
    "zip_code": "22306",
    "city": "Alexandria",
    "region_code": "VA",
    "region_name": "Virginia",
    "continent_code": "NA",
    "continent_name": "North America",
    "capital": "Washington",
    "country_name": "United States",
    "country_code": "US"
  },
  "asn": {
    "route": "70.160.0.0/14",
    "type": "isp",
    "domain": "cox.net",
    "organization": "ASN-CXA-ALL-CCI-22773-RDC",
    "asn": "AS22773"
  },
  "currency": {
    "native_name": "US Dollar",
    "code": "USD",
    "name": "US Dollar",
    "symbol": "$"
  },
  "timezone": {
    "is_dst": false,
    "gmt_offset": -18000,
    "date_time": "2020-12-05T17:04:48-05:00",
    "microsoft_name": "Eastern Standard Time",
    "iana_name": "America/New_York"
  },
  "security": {
    "is_crawler": false,
    "is_proxy": false,
    "is_tor": false,
    "tor_insights": null,
    "proxy_insights": null,
    "crawler_insights": null
  },
  "error": null,
  "ip_type": "ipv4",
  "ip": "70.163.7.1"
}
person bre_dev    schedule 05.12.2020