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

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

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

Ответ 1

Есть бесплатные и простые API, которые вы можете использовать, например:

Какой из них выглядит наиболее заслуживающим доверия, зависит от вас :)

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

НТН!

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

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

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

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

Ответ 2

Существуют различные веб-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.

Ответ 3

Вы можете загружать 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
");

Ответ 5

Вы можете получить страну с IP-адреса с этим 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.

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

Установите и используйте расширение PHP GeoIP, если сможете. На 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

Ответ 10

Я нашел этот пост в блоге очень полезным. Это спасло мой день. 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
}

Ответ 11

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

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

Ответ 12

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

Я рекомендую это, потому что, по моему опыту, он отлично работал, включая город и страну для моего IP-адреса, которые большинство других баз данных /apis не включали/не сообщали мое местоположение, кроме эта услуга, которая направила меня в эту базу данных.

(Мой IP-адрес был из города "Рашт" в "Иране", когда я тестировал, и ip был: 2.187.21.235 равным 45815275)

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

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

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

Ответ 13

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

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

Код 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
}

Ответ 14

Я запускаю службу в 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 и т.д.

Подробнее о docs.

Ответ 15

Ipdata.co предоставляет масштабируемый API для этого. С 10 глобальными конечными точками, каждый из которых способен обрабатывать> 800 миллионов запросов в день!

Он также предоставляет данные об организации, валюте, часовом поясе, коде вызова, флаге и узле выхода Tor с любого адреса IPv4 или IPv6.

В php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->location;
37.405991,-122.078514

отказ

Я построил этот сервис.

Ответ 16

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

Ответ 17

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

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

?>