Я провел несколько тестов со службами IP-адресов, и вот несколько способов сделать это самому.
Во-первых, куча ссылок на полезные веб-сайты, которые я использую:
https://db -ip.com / дб
Имеет бесплатный сервис ip-lookup и несколько бесплатных csv-файлов, которые вы можете
скачать. При этом используется бесплатный ключ API, прикрепленный к вашей электронной почте. Он ограничивает 2000 запросов в день.
http://ipinfo.io/
Бесплатный сервис ip-lookup без API-ключа
PHP функции:
//uses http://ipinfo.io/.
function ip_visitor_country($ip){
$ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
$ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use
//this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
return false;
}else{
return $ip_data;
}
}
function get_web_page($url){
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
$options = array(
CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get
CURLOPT_POST =>false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
$httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
curl_close( $ch );
$header['errno'] = $err; //curl error code
$header['errmsg'] = $errmsg; //curl error message
$header['content'] = $content; //the webpage result (In this case the ip data in json array form)
$header['httpcode'] = $httpCode; //the webpage response code
return $header; //return the collected data and response codes
}
В итоге вы получите что-то вроде этого:
Array
(
[ip] => 1.1.1.1
[hostname] => No Hostname
[city] =>
[country] => AU
[loc] => -27.0000,133.0000
[org] => AS15169 Google Inc.
)
http://www.geoplugin.com/
Немного старше, но этот сервис дает вам кучу дополнительной полезной информации, такой как валюта страны, код континента, долгота и многое другое.
http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude
Предлагает кучу загружаемых файлов с инструкциями для импорта их в вашу базу данных.
Если у вас есть один из этих файлов в вашей базе данных, вы можете выбрать данные довольно легко.
SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to
Используйте функцию php ip2long (); превратить IP-адрес в числовое значение. Например, 1.1.1.1 становится 16843009. Это позволяет сканировать диапазоны IP-адресов, предоставленные вам файлом базы данных.
Таким образом, чтобы выяснить, где 1.1.1.1 принадлежит всем, что мы делаем, выполните этот запрос:
SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;
Возвращает эти данные в качестве примера.
FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809