답변:
무료 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>
null
도시 이름을 받고 있습니다. 작은 도시 나 다른 곳과는 다르지만 여전히 찾을 수 없었습니다. 미국 내에서 잘 작동하지 않으면 미국 외부에서 null을 반환하는 빈도가 의심됩니다.
아무도이 특정 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": ""
}
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.com
API 사용과 관련하여 제한이 있습니까?
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>
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
http://www.hostip.info/ 와 같은 외부 서비스를 사용해야합니다 . 합니다. Google에서 "geo-ip"을 검색하면 더 많은 결과를 얻을 수 있습니다.
Host-IP API는 HTTP 기반이므로 필요에 따라 PHP 또는 JavaScript로 사용할 수 있습니다.
ipapi.co 의 API를 사용하여 봇을 작성했습니다. 다음에서 IP 주소의 위치를 얻는 방법 1.2.3.4
은 php
다음 과 같습니다.
헤더 설정 :
$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);
이 질문은 보호되어 있습니다. 그러나 나는 여기에 답을 보지 못합니다. 제가 보는 것은 많은 사람들이 그들이 같은 질문을하면서 나온 것을 보여줍니다.
현재 IP 소유권과 관련된 첫 번째 연락 지점 역할을하는 다양한 기능을 갖춘 5 개의 지역 인터넷 레지스트리가 있습니다. 프로세스가 유동적이기 때문에 다양한 서비스가 때때로 작동하고 다른 시간에는 작동하지 않습니다.
Who Is는 (분명히) 고대 TCP 프로토콜입니다. 원래의 작동 방식은 포트 43에 연결하는 것이기 때문에 임대 연결, 방화벽 등을 통해 라우팅하는 데 문제가 있습니다.
현재 대부분의 Who Is는 RESTful HTTP 및 ARIN을 통해 수행되며 RIPE 및 APNIC는 RESTful 서비스가 작동합니다. LACNIC의 결과는 503을 반환하며 AfriNIC은 분명히 그러한 API를 가지고 있지 않습니다. (모두 온라인 서비스가 있습니다.)
IP의 등록 된 소유자의 주소는 얻을 수 있지만 고객의 위치는 아닙니 다. 주소를 가져와야합니다. 또한 프록시는 발신자라고 생각하는 IP의 유효성을 검사 할 때 걱정할 필요가 없습니다.
사람들은 그들이 추적하고 있다는 개념에 감사하지 않기 때문에-내 생각은-고객으로부터 직접 허락을 얻어 그 개념을 이해하기를 기대합니다.
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 인 것 같습니다.
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
IP2Nation 은 사용자가 직접 수행하고 다른 제공 업체에 의존하지 않기를 원한다고 가정하면 지역 레지스트리가 변경 될 때 업데이트되는 매핑의 MySQL 데이터베이스를 제공합니다.
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
등
자세한 내용 은 문서 를 확인하십시오.
Maxmind 의 무료 GeoLite City 를 사용하는 것이 좋습니다. 대부분의 응용 프로그램에서 작동하며 정확하지 않은 경우 유료 버전으로 업그레이드 할 수 있습니다. 가 PHP API를 포함,뿐만 아니라 다른 언어. 또한 Lighttpd를 웹 서버로 실행하는 경우 필요한 경우 모듈 을 사용하여 모든 방문자에 대한 SERVER 변수의 정보를 얻을 수도 있습니다 .
또한 무료 Geolite Country (IP가있는 도시를 정확하게 지정할 필요가없는 경우 더 빠름)와 Geolite ASN (IP를 소유 한 사람을 알고 싶다면)이 있으며 마지막으로 이러한 모든 국가가 있음을 추가해야합니다 자체 서버에서 다운로드 할 수 있으며 매월 업데이트되며 "초당 수천 번의 조회"를 제공하므로 제공된 API를 사용하여 조회하는 것이 매우 빠릅니다.
PHP는 확장 기능이 있습니다.
PHP.net에서 :
GeoIP 확장을 사용하면 IP 주소의 위치를 찾을 수 있습니다. ISP, 연결 유형 등의 도시, 주, 국가, 경도, 위도 및 기타 정보는 GeoIP를 통해 얻을 수 있습니다.
예를 들면 다음과 같습니다.
$record = geoip_record_by_name($ip);
echo $record['city'];
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에 대한 자세한 분석을.
누군가이 스레드를 우연히 발견하는 경우 다른 해결책이 있습니다. 에서 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);
}
});
다음은 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" }
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
}
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();
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
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를 홍보하기 위해 여기에 없으며 최고라고 말하지만 기존 솔루션을 분석하는 데 오랜 시간을 보냈으며 솔루션은 실제로 유망합니다.
좋습니다, 제안 해 주셔서 감사합니다. 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"
자유롭게 사용하고 수정하고 더 잘하십시오)