Получить страну IP-адреса с помощью PHP

В идеале я пытаюсь собрать скрипт PHP, который я могу запросить из любого веб-браузера, и он возвращает страну IP-адреса, которая обратилась к скрипту PHP.

Возможно ли это или есть лучшее решение?

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

Какой из них наиболее правдоподобен, зависит от вас 🙂

В противном случае существуют сценарии, основанные на локальных базах данных на вашем сервере. Однако данные базы данных необходимо регулярно обновлять. Проверьте это:

НТН!

Редактирование: И, конечно же, в зависимости от вашего проекта вы можете захотеть взглянуть на функции местоположения HTML5 . Вы не можете использовать их еще в Internet Explorer (IE9 будет поддерживать его, еще долгий путь), но в случае, если ваша аудитория в основном работает на мобильных устройствах или использует Safari / Firefox, определенно стоит посмотреть на нее!

После того, как у вас есть координаты, вы можете поменять геокод на код страны. Опять же, есть такие API, как этот:

Обновление, апрель 2013 г.
Сегодня я бы рекомендовал использовать Geocoder , библиотеку PHP, которая упрощает геокодирование IP-адресов, а также почтовых адресных данных.

*** Обновление, сентябрь 2016 года
Поскольку политика конфиденциальности Google изменилась, вы не можете использовать API привязки HTML5, если на вашем сервере нет сертификата HTPPS или пользователь не позволяет вам проверить его местоположение. Итак, теперь вы можете использовать IP-адрес пользователя и зарегистрироваться на PHP или получить сертификат HTTPS.

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

 $ip = $_SERVER['REMOTE_ADDR']; $details = json_decode(file_get_contents("http://ipinfo.io/{$ip}")); echo $details->country; // -> "US" 

Веб-API – это хорошее быстрое и простое решение, но если вам нужно много искать, то наличие базы данных IP -> на вашей собственной машине – лучшее решение. MaxMind предлагает бесплатную базу данных, которую вы можете использовать с различными библиотеками PHP, включая GeoIP .

Вы можете скачать ip-таблицы из MaxMind:

http://www.maxmind.com/app/geolite

Импортируйте CSV в свою базу данных (обязательно создайте индекс для ip_long_from + ip_long_to). Тогда вы можете просто сделать:

 $iplong = ip2long($_SERVER['REMOTE_ADDR']); // should use mysqli with prepared statements etc, but just an example mysql_query(" SELECT country FROM ip_table WHERE $iplong BETWEEN ip_long_from AND ip_long_to LIMIT 1 "); 

Ниже приведен пример использования http://www.geoplugin.net/json.gp

 $ip = $_SERVER['REMOTE_ADDR']; $details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}")); echo $details; 

Это 1 лайнер с этим API

Код

  echo file_get_contents('https://ipapi.co/8.8.8.8/country/'); 

отклик

  US 

Вот скрипка . Ответ – это text когда вы запрашиваете конкретное поле, например, country . Не требуется декодировать, просто подключите его к вашему коду.

PS Если вы хотите, чтобы все поля, например https://ipapi.co/8.8.8.8/json/ , ответ был JSON .

 $country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country")) 

вы получите код страны.

Посмотрите на функции GeoIP в разделе «Другие основные расширения». http://php.net/manual/en/book.geoip.php

Я вижу, что есть много ответов, но никто из них не упоминает https://freegeoip.net/

Вам разрешено до 15,000 queries per hour . Я думаю, этого достаточно в большинстве случаев. В противном случае вам следует подумать об использовании локальных баз данных из MaxMind GeoIP .

Freegeoip является открытым исходным кодом, и вы можете найти источники на github , локально развернуть его и избавиться от ограничений запросов.

Кроме того, сервис предоставляет широту / долготу / часовой пояс и другие полезные вещи.

Я нашел это сообщение в блоге очень полезным. Это спасло мой день. http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

В основном вам нужно установить таблицу базы данных IP, а затем выполнить запрос mysql для IP-адреса.

 <?php include 'config.php'; mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die(mysql_error()); mysql_select_db(DB_NAME) OR die(mysql_error()); $ip = $_SERVER['REMOTE_ADDR']; $long = sprintf('%u', ip2long($ip)); $sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; $result = mysql_query($sql) OR die(mysql_error()); $ip_detail = mysql_fetch_assoc($result); if($ip_detail){ echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city']; } else{ //Something wrong with IP } 

Вот еще один бесплатный API для запросов геолокации: http://geoip.nekudo.com

Ответы в формате JSON. Кроме того, исходный код API доступен в github, если вам нужно настроить свой собственный API.

Установите и используйте расширение GeoIP PHP, если сможете. На debian lenny:

 sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz sudo gunzip GeoLiteCity.dat.gz sudo mkdir -v /usr/share/GeoIP sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat sudo apt-get install php5-geoip # or sudo apt-get install php-geoip for PHP7 

а затем попробуйте в PHP:

 $ip = $_SERVER['REMOTE_ADDR']; $country = geoip_country_name_by_name($ip); echo 'The current user is located in: ' . $country; 

возвращает:

 The current user is located in: Cameroon 

Вы можете использовать https://ip-api.io/, чтобы получить название страны, название города, широту и долготу. Он поддерживает IPv6.

В качестве бонуса он скажет, является ли ip-адрес узлом tor, общедоступным прокси-сервером или спамером.

Код Php:

 $result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118')); var_dump($result); 

Вывод:

 { "ip": "64.30.228.118", "country_code": "US", "country_name": "United States", "region_code": "FL", "region_name": "Florida", "city": "Fort Lauderdale", "zip_code": "33309", "time_zone": "America/New_York", "latitude": 26.1882, "longitude": -80.1711, "metro_code": 528, "suspicious_factors": { "is_proxy": false, "is_tor_node": false, "is_spam": false, "is_suspicious": false } 

Используйте виджет http://www.feedsalive.com , чтобы получить информацию о стране и информацию о последней странице.

Вы можете попробовать воспользоваться услугами https://www.geoip-db.com. Они предоставляют решение JSON или JSONP-callback.

 <?php $json = file_get_contents("https://www.geoip-db.com/json"); $data = json_decode($json); print $data->country_code . "<br>"; print $data->country_name . "<br>"; print $data->state . "<br>"; print $data->city . "<br>"; print $data->postal . "<br>"; print $data->latitude . "<br>"; print $data->longitude . "<br>"; print $data->IPv4 . "<br>"; ?> 

Я запускаю службу на IPLocate.io , которую вы можете подключить бесплатно с помощью простого вызова:

 <?php $res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8'); $res = json_decode($res); echo $res->country; // United States echo $res->continent; // North America echo $res->latitude; // 37.751 echo $res->longitude; // -97.822 var_dump($res); 

Объект $res будет содержать ваши поля геолокации, такие как country , city и т. Д.

Ознакомьтесь с документами для получения дополнительной информации.

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

Я рекомендую это, потому что, по моему опыту, он отлично работал, включая город и страну для моего IP-адреса, которые большинство других баз данных / apis не включали / не сообщали о моем местоположении, кроме этой службы, которая направляла меня в эту базу данных.
(Мой IP-адрес был из города «Рашт» в «Иране», когда я тестировал, и ip был: 2.187.21.235 равный 45815275 )

Поэтому я рекомендую использовать эти службы, если вы не знаете, какая услуга более точная:

База данных: http://lite.ip2location.com/databases

Служба API: http://ipinfodb.com/ip_location_api.php