Получение местоположения с IP-адреса - PullRequest
183 голосов
/ 04 января 2009

Я хочу получить информацию о городе, штате и стране посетителя с его IP-адреса, чтобы я мог настроить свою веб-страницу в соответствии с их местоположением. Есть ли хороший и надежный способ сделать это в PHP? Я использую JavaScript для сценариев на стороне клиента, PHP для сценариев на стороне сервера и MySQL для базы данных.

Ответы [ 24 ]

6 голосов
/ 04 сентября 2017

Ipdata.co - это быстрый, высокодоступный API-интерфейс геолокации с надежной производительностью.

Это чрезвычайно масштабируемая система с 10 конечными точками по всему миру, каждая из которых может обрабатывать> 10 000 запросов в секунду!

В этом ответе используется «тестовый» ключ API, который очень ограничен и предназначен только для тестирования нескольких вызовов. Зарегистрируйтесь для получения бесплатного ключа API и получите до 1500 запросов в день на разработку.

В php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

Вот пример на стороне клиента, показывающий, как вы получите страну, регион и город;

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");


Отказ от ответственности;

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

Примеры на нескольких языках см. В Документах

.

Также см. этот подробный анализ лучших API геолокации IP.

6 голосов
/ 04 января 2009

Если вы хотите сделать это самостоятельно и не полагаться на других провайдеров, IP2Nation предоставляет базу данных сопоставлений MySQL, которая обновляется по мере того, как региональные реестры меняют ситуацию.

6 голосов
/ 13 декабря 2011

PHP имеет расширение для этого.

Из PHP.net:

Расширение GeoIP позволяет вам найти местоположение IP-адреса. Город, штат, страна, долгота, широта и другая информация как все, такие как интернет-провайдер и тип соединения могут быть получены с помощью GeoIP.

Например:

$record = geoip_record_by_name($ip);
echo $record['city'];
5 голосов
/ 06 января 2017

В случае, если кто-то наткнется на эту тему, вот другое решение. На timezoneapi.io вы можете запросить IP-адрес и получить взамен несколько объектов (я создал сервис). Он был создан потому, что мне нужно было узнать, в каком часовом поясе находятся мои пользователи, где в мире и в какое время он сейчас.

В PHP - возвращает местоположение, часовой пояс и дату / время:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

Использование jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});
5 голосов
/ 15 ноября 2017

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

Проверьте документы для получения дополнительной информации.

4 голосов
/ 29 июля 2017

Если вам нужно получить местоположение с IP-адреса, вы можете использовать надежный гео-IP-сервис, вы можете получить более подробную информацию здесь . Поддерживает IPv6.

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

Вы можете использовать javascript или php, как показано ниже.

Javascript код:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

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
}
4 голосов
/ 29 августа 2013

Ниже приведена измененная версия фрагмента, который я обнаружил и использует http://ipinfodb.com/ip_locator.php для получения информации. Имейте в виду, что вы также можете подать заявку на получение ключа API и напрямую использовать API для получения предоставленной информации по своему усмотрению.

Отрывок

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

Для использования

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
3 голосов
/ 19 ноября 2014

Я создал оболочку для ipinfo.io . Вы можете установить его, используя composer.

Вы можете использовать его следующим образом:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();
2 голосов
/ 23 декабря 2013

Вы также можете воспользоваться услугой «smart-ip»:

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);
2 голосов
/ 04 сентября 2015

Я провел несколько тестов со службами 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
...