Как получить страну по определенному IP?
кто-нибудь знает простой способ получить страну для данного IP-адреса? Предпочтительно в формате ISO_3166-1?
14 ответов:
многие люди (включая мою компанию), похоже, используют MaxMind GeoIP.
у них есть бесплатная версия GeoLite что не так точно, как платная версия, но если вы просто после чего-то простого, это может быть достаточно хорошо.
есть два подхода: использование интернет-сервиса и использование какого-то локального списка (возможно, завернутого в библиотеку). Что вы хотите, будет зависеть от того, что вы строите.
услуги:
- http://www.hostip.info/use.html (Как упоминалось Марк)
- http://www.team-cymru.org/Services/ip-to-asn.html
для списки:
- http://www.maxmind.com/app/geoip_country (Как упоминалось Орион)
вы можете свернуть свой собственный, загрузив списки из Рирс:
- ftp.arin.net/pub/stats/arin/delegated-arin-latest
- ftp.ripe.net/ripe/stats/delegated-ripencc-latest
- ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
- ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
формат документально в этом README
вот хороший бесплатный сервис с публичным API: http://www.hostip.info/use.html
ipinfodb предоставляет бесплатную базу данных и API для IP в страну и наоборот. Они используют бесплатные данные от MaxMind. Данных обновляется каждый месяц, и это отличная бесплатная альтернатива с приличной точностью.
Я не знаю, насколько это точно hostip.info сайт есть. Я только что посетил этот сайт, и он сообщил, что моя страна-Канада. Я нахожусь в США, и интернет-провайдер, который использует мой офис, работает только из США. Это позволяет вам исправить это предположение, но если вы используете этот сервис для отслеживания веб-сайта vistors по стране, у вас не будет возможности узнать, правильны ли данные. Конечно, я всего лишь одна точка данных. Я загрузил базу данных страны GeoLite, которая является просто a .csv-файл и мой IP-адрес был правильно идентифицирован как мы.
еще одно преимущество линейки продуктов MaxMind (платное или бесплатное) заключается в том, что у вас есть данные, вы не несете потери производительности при вызове веб-службы в другую систему.
Наиболее точным является цифровые элементы NetAcuity...не бесплатно, но вы получаете то, что вы платите за большую часть времени....Цифровой Элемент
google clientlocation возвращает (мой пример)
latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude); location = "IP location: " + getFormattedLocation(); document.getElementById("location").innerHTML = location;
вы можете использовать решение, предлагаемое для этот вопрос.
но он возвращает 2-значный код страны.
попробуйте этот 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];?>
вы можете воспользоваться моим сервисом,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 пользователя просто передать в . Подробнее доступно по адресу http://ipinfo.io/developers
используйте функцию ipToCountry ($ip) из http://www.mmtutorialvault.com/php-ip-to-country-function/
вы можете использовать API веб-службы, которые делают эту работу, как:
see example of service: http://ip-api.com and usage: http://whatmyip.info
см.ipdata.co что дает вам несколько точек данных с ip-адреса.
API довольно быстрый, с 10 глобальными конечными точками, каждая из которых способна обрабатывать >800M вызовов ежедневно.
вот пример curl;
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 } }⏎
вы можете попробовать бесплатно база данных 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); } } ?>