IP 주소에서 위치 얻기


205

IP 주소에서 방문자의 도시, 주 및 국가와 같은 정보를 검색하여 위치에 따라 웹 페이지를 사용자 정의 할 수 있습니다. PHP에서 이것을 할 수있는 좋고 신뢰할 수있는 방법이 있습니까? 클라이언트 쪽 스크립팅에 JavaScript, 서버 쪽 스크립팅에 PHP, 데이터베이스에 MySQL을 사용하고 있습니다.


이것은 stackoverflow.com/questions/348614/… 의 복제본입니다 .
Charlie Martin

답변:


255

무료 GeoIP 데이터베이스를 다운로드하고 IP 주소를 로컬로 조회하거나 타사 서비스를 사용하여 원격 조회를 수행 할 수 있습니다. 설정이 필요하지 않으므로 더 간단한 옵션이지만 추가 대기 시간이 발생합니다.

사용할 수있는 타사 서비스 중 하나는 내 http://ipinfo.io 입니다. 호스트 이름, 지리적 위치, 네트워크 소유자 및 추가 정보를 제공합니다. 예 :

$ 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
}

다음은 PHP 예제입니다.

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

클라이언트 쪽에서도 사용할 수 있습니다. 다음은 간단한 jQuery 예제입니다.

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>


1
전체 웹 페이지 대신 json을 다시 얻을 수 있도록 URL 끝에 json을 추가해야 할 수 있습니다. $ details = json_decode (file_get_contents ( " ipinfo.io {$ ip} / json"));
Doug

1
@Manatax 서버 응답을 구문 분석하는 것이 불가능하기 때문에 그렇지 않습니다.
Ja͢ck

3
매우 안정적인 서비스처럼 보이지 않습니다. null도시 이름을 받고 있습니다. 작은 도시 나 다른 곳과는 다르지만 여전히 찾을 수 없었습니다. 미국 내에서 잘 작동하지 않으면 미국 외부에서 null을 반환하는 빈도가 의심됩니다.
Derek 朕 會 功夫

2
결과는 정확하지 않습니다 .. 지역, 도시 우편
Mark Gerryl Mirandilla

2
경고 : 2019 년 1 월 현재 일부 사람들은이 ipinfo URL이 트로이 목마로 인해 바이러스 에 대해 안전하지 않다고 보고했습니다 . 투표는 2015 년과 2018 년 사이에있었습니다
Ricardo

55

아무도이 특정 API에 대한 정보를 제공하지 않은 것처럼 게시 할 것이라고 생각했지만 그 이후의 것을 정확하게 반환하고 여러 형식으로 반환 할 수 있습니다 json, xml and csv.

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

이렇게하면 원하는 모든 것을 얻을 수 있습니다.

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}

1
Jamie FreegeoIp.net이 작동하지 않습니다. 다른 방법이 있습니까?
Adi

현재 미안하지만 라이브 사이트에서 사용하는 서비스는 부끄러운 일입니다. 그들이 몇 시간 다시 돌아 오기를 바랍니다
Jamie Hutber

2
대부분 아래로 거의 모든 지역 또는 도시주지 않는다
아만 라훌

2
Azure의 Tony 서비스는 빠르고 안정적으로 작동하는 것 같습니다. freegeoip2
Gustav

1
안타깝게도이 메시지는 다음 메시지에 따라 2018 년 7 월 1 일에 연결이 끊어집니다. "이 API 엔드 포인트는 더 이상 사용되지 않으며 2018 년 7 월 1 일부터 작동이 중단됩니다. 자세한 내용은 다음 사이트를 방문하십시오 : github.com/apilayer/freegeoip#readme \
Julio Bailon

20

https://geolocation-db.com 의 서비스를 사용하는 순수 Javascript 예제 JSON 및 JSONP 콜백 솔루션을 제공합니다.

jQuery가 필요하지 않습니다!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>

https://geoilocation-db.comAPI 사용과 관련하여 제한이 있습니까?
Priyanka Sharma

16

Google APIS 사용 :

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

9
The geolocation functionality in the Loader hasn't been retired, per se. We stopped documenting it several years ago and have recommended the HTML-based solutions due to their improved accuracy, but the functionality itself has not been removed from the Loader at this time. code.google.com/p/google-ajax-apis/issues/detail?id=586
TheFrost

이 Google APIS IP 지리적 위치의 품질은 어떻습니까? 같은 다른 서비스에 비해, (그것은, 또는 내가 잘못입니까?) ipinfo.io ?
Basj

나는 다른 도시에서 ~ 30 명에게 물었고 Google APIS IP 지리적 위치 품질은 ipinfo.io에 비해 열악합니다.
Basj

1
@Basj Google API는 매력처럼 작동합니다. ipinfo.io는 제가 중부 유럽에있는 동안 미국에 있다고 표시합니다
patryk

15

http://www.hostip.info/ 와 같은 외부 서비스를 사용해야합니다 . 합니다. Google에서 "geo-ip"을 검색하면 더 많은 결과를 얻을 수 있습니다.

Host-IP API는 HTTP 기반이므로 필요에 따라 PHP 또는 JavaScript로 사용할 수 있습니다.


6
나는 지금 1 년 동안 hostip.info를 사용해 왔으며 감동하지 않았습니다. 일반적으로 알 수없는 9/10 수표를 반환합니다
aron

동의, 내가 Woking에 살고 있다고 말하면 ... 공정하게 GB 비트가 맞았지만 ... 나는 런던에 있습니다.
Jamie Hutber

2
모든 서비스는 공개 정보 / 데이터만큼 유용 할 것입니다. 개인 정보 보호상의 이유로이 정보는 "너무 좋아질"수 있습니다. 그것이 당신의 나라를 올바르게하고 적어도 주 /도에 가까워지면 나는 그것을 승리라고 생각할 것입니다. 이 정보를 사용하여 DOS 공격에 대한 정보를 조회하는 경우 IP가 유효하지 않을 수도 있습니다 (다른 사람에게 할당되지 않았거나 유효한 공개 IP 범위를 벗어난 IP).
eselk

그들의 웹 사이트에 "Location : ... 실제로 실마리는 없습니다."라는 메시지가 나타납니다. 내가 알아야 할 모든 것
Bojan Kogoj

15

ipapi.co 의 API를 사용하여 봇을 작성했습니다. 다음에서 IP 주소의 위치를 ​​얻는 방법 1.2.3.4php다음 과 같습니다.

헤더 설정 :

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

JSON 응답 받기

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

특정 분야 (국가, 시간대 등)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

1
@Eoin 제거했습니다. phpfiddle의 IP가 제한된 것 같습니다.
Jaimes

10

이 질문은 보호되어 있습니다. 그러나 나는 여기에 답을 보지 못합니다. 제가 보는 것은 많은 사람들이 그들이 같은 질문을하면서 나온 것을 보여줍니다.

현재 IP 소유권과 관련된 첫 번째 연락 지점 역할을하는 다양한 기능을 갖춘 5 개의 지역 인터넷 레지스트리가 있습니다. 프로세스가 유동적이기 때문에 다양한 서비스가 때때로 작동하고 다른 시간에는 작동하지 않습니다.

Who Is는 (분명히) 고대 TCP 프로토콜입니다. 원래의 작동 방식은 포트 43에 연결하는 것이기 때문에 임대 연결, 방화벽 등을 통해 라우팅하는 데 문제가 있습니다.

현재 대부분의 Who Is는 RESTful HTTP 및 ARIN을 통해 수행되며 RIPE 및 APNIC는 RESTful 서비스가 작동합니다. LACNIC의 결과는 503을 반환하며 AfriNIC은 분명히 그러한 API를 가지고 있지 않습니다. (모두 온라인 서비스가 있습니다.)

IP의 등록 된 소유자의 주소는 얻을 수 있지만 고객의 위치는 아닙니 다. 주소를 가져와야합니다. 또한 프록시는 발신자라고 생각하는 IP의 유효성을 검사 할 때 걱정할 필요가 없습니다.

사람들은 그들이 추적하고 있다는 개념에 감사하지 않기 때문에-내 생각은-고객으로부터 직접 허락을 얻어 그 개념을 이해하기를 기대합니다.


8

hostip.info에서 API를 살펴보십시오. 많은 정보를 제공합니다.
PHP의 예 :

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

hostip.info를 신뢰하면 매우 유용한 API 인 것 같습니다.


1
unf. 다른 서비스와 비교하여 HostIP는 waaaay off입니다. .. www.ip-adress.com, 그러나 그것을 못 박아
Scott Evernden

8

Ben Dowling의 응답 서비스가 변경되었으므로 이제 더 간단 해졌습니다. 위치를 찾으려면 다음을 수행하십시오.

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

좌표는 '31, -80 '과 같은 단일 문자열로 반환되므로 거기에서 다음을 수행하십시오.

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

4
당신이 바로 있다는 것 ipinfo.io는 기본적으로 발신자의 IP에 대한 세부 정보를 반환합니다. PHP 웹 사이트를 실행하는 경우 사용자의 IP가 아닌 서버의 IP가됩니다. 이것이 $ _SERVER [ 'REMOTE_ADDR']에 전달해야하는 이유입니다. 좌표를 원한다면 URL에 / loc을 추가하여 해당 필드도 가져 오는 것이 더 빠릅니다.
벤 Dowling

아, 맞아! 그리고 나는 / loc에 대해 몰랐다 – 나는 그것을 내 사이트에서 즉시 고칠 것이다.
Isaac Askew

7

IP2Nation 은 사용자가 직접 수행하고 다른 제공 업체에 의존하지 않기를 원한다고 가정하면 지역 레지스트리가 변경 될 때 업데이트되는 매핑의 MySQL 데이터베이스를 제공합니다.


나는 외부 서비스를 사용하고 있었고 갑자기 내 웹 사이트가 정말 느려졌습니다. 외부 서비스는 정보를 다시 보내는 데 20 초가 걸렸습니다. 이는 방문자에게 재앙입니다. 그래서 직접하기로 결정했으며 이것이 완벽한 솔루션입니다. 너무 감사합니다.
Williamz902

7

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

자세한 내용 은 문서 를 확인하십시오.


7

Maxmind 의 무료 GeoLite City 를 사용하는 것이 좋습니다. 대부분의 응용 프로그램에서 작동하며 정확하지 않은 경우 유료 버전으로 업그레이드 할 수 있습니다. 가 PHP API를 포함,뿐만 아니라 다른 언어. 또한 Lighttpd를 웹 서버로 실행하는 경우 필요한 경우 모듈 을 사용하여 모든 방문자에 대한 SERVER 변수의 정보를 얻을 수도 있습니다 .

또한 무료 Geolite Country (IP가있는 도시를 정확하게 지정할 필요가없는 경우 더 빠름)와 Geolite ASN (IP를 소유 한 사람을 알고 싶다면)이 있으며 마지막으로 이러한 모든 국가가 있음을 추가해야합니다 자체 서버에서 다운로드 할 수 있으며 매월 업데이트되며 "초당 수천 번의 조회"를 제공하므로 제공된 API를 사용하여 조회하는 것이 매우 빠릅니다.


1
무료로 제공되는 IP2Location LITE lite.ip2location.com 을 고려할 수 있습니다 . 그것은 우편 번호 정보까지 매우 유용합니다.
Michael C.

6

PHP는 확장 기능이 있습니다.

PHP.net에서 :

GeoIP 확장을 사용하면 IP 주소의 위치를 ​​찾을 수 있습니다. ISP, 연결 유형 등의 도시, 주, 국가, 경도, 위도 및 기타 정보는 GeoIP를 통해 얻을 수 있습니다.

예를 들면 다음과 같습니다.

$record = geoip_record_by_name($ip);
echo $record['city'];

3
이것은 MaxMind 데이터베이스를위한 PHP 모듈입니다. 페이웨어입니다. (무료 "lite"버전은 매우 정확하지 않습니다.) 나쁜 것은 아니지만 실제로는 상업적 목적으로 만 유용합니다.
누군가

6

Ipdata.co 는 안정적인 성능을 갖춘 빠르고 고 가용성의 IP Geolocation 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");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>

부인 성명;

서비스를 만들었습니다.

여러 언어로 된 예는 문서를 참조하십시오.

또한 볼 최고의 IP 위치 정보 API에 대한 자세한 분석을.


5

누군가이 스레드를 우연히 발견하는 경우 다른 해결책이 있습니다. 에서 timezoneapi.io 당신은 IP 주소를 요청할 수 있으며, (I 서비스를 만들었습니다) 반환에 여러 개체를 얻을. 사용자가 어느 시간대에 있는지, 세계 어디에 있는지, 현재 몇 시인 지 알아야했기 때문에 만들어졌습니다.

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);

    }

});

4

다음은 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" }

4

IP 주소에서 위치를 가져와야하는 경우 안정적인 지리 IP 서비스를 사용할 수 있습니다 . 자세한 내용은 여기를 참조 하십시오 . IPv6을 지원합니다.

보너스로 IP 주소가 토르 노드인지, 퍼블릭 프록시인지 또는 스패머인지 확인할 수 있습니다.

아래와 같이 자바 스크립트 또는 PHP를 사용할 수 있습니다.

자바 스크립트 코드 :

$(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
}

3

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

"smart-ip"서비스를 사용할 수도 있습니다.

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

2

IP 주소 서비스를 사용하여 많은 테스트를 수행했으며 여기 직접 수행하는 몇 가지 방법이 있습니다. 먼저 내가 사용하는 유용한 웹 사이트에 대한 링크를 제공합니다.

https://db-ip.com/db 무료 ip-lookup 서비스가 있으며 다운로드 할 수있는 몇 가지 무료 csv 파일이 있습니다. 이메일에 첨부 된 무료 API 키를 사용합니다. 하루에 2,000 개의 쿼리로 제한됩니다.

http://ipinfo.io/ api-key PHP 기능이없는 무료 ip-lookup 서비스 :

//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-address를 숫자 값으로 변환합니다. 예를 들어 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

2

IP 위치 정보를 수행하는 두 가지 광범위한 접근 방식이 있습니다. 하나는 데이터 집합을 다운로드하여 인프라에서 호스팅하고 최신 상태로 유지하는 것입니다. 특히 많은 수의 요청을 지원해야하는 경우 시간과 노력이 필요합니다. 또 다른 솔루션은 기존 작업을 사용하여 모든 작업을 관리하는 기존 API 서비스를 사용하는 것입니다.

Maxmind, Ip2location, Ipstack, IpInfo 등 많은 API Geolocation 서비스가 있습니다. 최근에 제가 일하는 회사는 Ipregistry ( https://ipregistry.co ) 로 전환 하여 의사 결정 및 구현 프로세스에 참여했습니다. 다음은 IP 지리적 위치 API를 찾는 동안 고려해야 할 요소입니다.

  • 서비스가 정확합니까? 그들은 단일 정보원을 사용하고 있습니까?
  • 그들은 실제로 부하를 처리 할 수 ​​있습니까?
  • 전 세계적으로 일관되고 빠른 응답 시간을 제공합니까 (사용자가 국가별로 다른 경우 제외)?
  • 그들의 가격 모델은 무엇입니까?

다음은 IP 지리적 위치 정보 (한 번의 호출을 사용하는 위협 및 사용자 에이전트 데이터)를 가져 오는 예입니다.

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

참고 : 나는 Ipregistry를 홍보하기 위해 여기에 없으며 최고라고 말하지만 기존 솔루션을 분석하는 데 오랜 시간을 보냈으며 솔루션은 실제로 유망합니다.


-1

업데이트되거나 정확한 데이터베이스를 검색하는 경우 테스트 할 때 다른 많은 서비스에 포함되지 않은 정확한 위치를 보여주기 때문에 여기 에서 사용하는 것이 좋습니다 .
(내 도시는 Rasht있었고 내 나라는 Iran이 IP 주소를 사용했습니다 : 2.187.21.235테스트 할 때.)

로컬에서 훨씬 빠르게 처리되므로 API 메서드 대신 데이터베이스를 사용하는 것이 좋습니다.


-1

좋습니다, 제안 해 주셔서 감사합니다. 6k + 이상의 IP가 있지만 일부 서비스는 일부 제한으로 인해 요청에 실패합니다. 따라서 폴백 모드에서 모두 사용할 수 있습니다.

다음 형식의 소스 파일이있는 경우 :

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

이 간단한 expample 명령 (PoC)을 Yii에 사용할 수있는 것보다 :

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

이것은 일종의 칙칙한 코드이지만 작동합니다. 용법:

./yiic geoip index --filename="./source_id_ip_list.txt"

자유롭게 사용하고 수정하고 더 잘하십시오)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.