Lấy vị trí từ một địa chỉ IP


205

Tôi muốn truy xuất thông tin như thành phố, tiểu bang và quốc gia của khách truy cập từ địa chỉ IP của họ để tôi có thể tùy chỉnh trang web của mình theo vị trí của họ. Có một cách tốt và đáng tin cậy để làm điều này trong PHP? Tôi đang sử dụng JavaScript cho kịch bản phía máy khách, PHP cho kịch bản phía máy chủ và MySQL cho cơ sở dữ liệu.


Đây là khá nhiều bản sao của stackoverflow.com/questions/348614/ .
Charlie Martin

Câu trả lời:


255

Bạn có thể tải xuống cơ sở dữ liệu GeoIP miễn phí và tra cứu địa chỉ IP cục bộ hoặc bạn có thể sử dụng dịch vụ của bên thứ ba và thực hiện tra cứu từ xa. Đây là tùy chọn đơn giản hơn, vì nó không yêu cầu thiết lập, nhưng nó giới thiệu độ trễ bổ sung.

Một dịch vụ bên thứ ba bạn có thể sử dụng là của tôi, http://ipinfo.io . Họ cung cấp tên máy chủ, định vị địa lý, chủ sở hữu mạng và thông tin bổ sung, ví dụ:

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

Đây là một ví dụ về PHP:

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

Bạn cũng có thể sử dụng nó phía khách hàng. Đây là một ví dụ đơn giản về 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
Bạn có thể muốn đảm bảo rằng bạn thêm một json vào cuối URL để đảm bảo bạn lấy lại json thay vì trang web đầy đủ. $ chi tiết = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax Không phải vậy, vì sau đó sẽ không thể phân tích phản hồi của máy chủ.
Ja͢ck

3
Có vẻ như không phải là một dịch vụ rất đáng tin cậy. Tôi đang nhận được nulltên thành phố của tôi. Nó không giống như một thành phố nhỏ hay cái gì đó nhưng nó vẫn không thể định vị được nó. Nếu nó không hoạt động tốt ở Hoa Kỳ, tôi nghi ngờ tần suất nó cũng sẽ trả về null bên ngoài Hoa Kỳ.
Derek 朕 會

2
kết quả không chính xác .. khu vực, bưu chính thành phố
Mark Gerryl Mirandilla

2
CẢNH BÁO: Kể từ tháng 1 năm 2019, một số người đã báo cáo rằng url ipinfo này không an toàn trên virustotal, do trojan. Các phiếu bầu là giữa năm 2015 và 2018
Ricardo

55

Tôi nghĩ rằng tôi sẽ đăng bài vì dường như không ai đã cung cấp thông tin về API cụ thể này, nhưng nó sẽ trả lại chính xác những gì tôi đang theo dõi và bạn có thể khiến nó trở lại ở nhiều định dạng, json, xml and csv .

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

Điều này sẽ cung cấp cho bạn tất cả những điều bạn có thể muốn:

{
      "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
Này Jamie FreegeoIp.net không hoạt động. Còn cách nào khác không?
Adi

Xin lỗi không phải lúc này, nhưng đó là một sự xấu hổ vì đó là dịch vụ tôi đang sử dụng trên các trang web trực tiếp của tôi. Hãy hy vọng họ sẽ quay lại một lúc nào đó
Jamie Hutber

2
chủ yếu là xuống và hiếm khi cung cấp cho bất kỳ khu vực hoặc thành phố
Rahul aman

2
Dịch vụ của Tony tại Azure dường như hoạt động nhanh và đáng tin cậy: freegeoip2
Gustav

1
Thật không may, dịch vụ này sẽ bị ngắt kết nối vào ngày 1 tháng 7 năm 2018 theo thông báo này: "Điểm cuối API này không được chấp nhận và sẽ ngừng hoạt động vào ngày 1 tháng 7 năm 2018. Để biết thêm thông tin, vui lòng truy cập: github.com/ap lớp / freegeoip # readme \
Julio Bailon

20

Một ví dụ Javascript thuần túy, sử dụng các dịch vụ của https://geolocation-db.com Họ cung cấp giải pháp gọi lại JSON và JSONP.

Không cần 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>

Có giới hạn nào liên quan đến việc sử dụng https://geoilocation-db.comapi không?
Priyanka Sharma

16

Sử dụng 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

Còn về chất lượng của vị trí địa lý IP APIS này của Google thì sao? (đó là, hoặc tôi sai?), so với các dịch vụ khác như ipinfo.io ?
Basj

Tôi đã yêu cầu ~ 30 người ở các thành phố khác nhau và chất lượng định vị địa lý IP của Google APIS kém so với ipinfo.io
Basj

1
@Basj Google API hoạt động như một cơ duyên trong khi ipinfo.io cho thấy tôi ở Mỹ trong khi tôi thực sự ở Trung Âu
patryk

15

Bạn cần sử dụng một dịch vụ bên ngoài ... chẳng hạn như http://www.hostip.info/ nếu bạn tìm kiếm "địa lý ip", bạn có thể nhận được nhiều kết quả hơn.

API Host-IP dựa trên HTTP để bạn có thể sử dụng nó trong PHP hoặc JavaScript tùy theo nhu cầu của bạn.


6
Tôi đã sử dụng hostip.info được một năm và tôi KHÔNG ấn tượng. Nó thường trả lại séc 9/10 không xác định
aron

đồng ý, nó nói với tôi rằng tôi sống ở Woking ... Công bằng mà nói, nó có bit GB đúng ... Nhưng tôi đang ở London.
Jamie Hutber

2
Hãy nhớ rằng bất kỳ dịch vụ nào sẽ chỉ tốt như thông tin / dữ liệu công khai có sẵn. Vì lý do riêng tư, thông tin này chỉ có thể là "rất tốt". Nếu quốc gia của bạn đúng, và ít nhất là gần với tiểu bang / tỉnh, tôi sẽ coi đó là CHIẾN THẮNG. Nếu bạn tình cờ sử dụng thông tin này để tra cứu thông tin cho một cuộc tấn công DOS, hãy nhớ rằng IP thậm chí có thể không hợp lệ (không được gán cho bất kỳ ai hoặc ngoài phạm vi IP công cộng hợp lệ).
eselk

Trên trang web của họ, tôi nhận được "Địa điểm: ... thực sự chúng tôi không có manh mối." Tất cả những gì tôi cần biết
Bojan Kogoj

15

Tôi đã viết một bot sử dụng API từ ipapi.co , đây là cách bạn có thể nhận vị trí cho một địa chỉ IP (ví dụ 1.2.3.4) trong php:

Đặt tiêu đề:

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

Nhận phản hồi JSON

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

nhận được một lĩnh vực cụ thể (quốc gia, múi giờ, v.v.)

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

1
@Eoin Đã xóa nó. Có vẻ như IP của phpfiddle bị hạn chế.
Jaimes

10

Câu hỏi này được bảo vệ, mà tôi hiểu. Tuy nhiên, tôi không thấy câu trả lời ở đây, những gì tôi thấy là rất nhiều người cho thấy những gì họ nghĩ ra khi có cùng một câu hỏi.

Hiện tại có năm Cơ quan đăng ký Internet khu vực với các mức độ chức năng khác nhau đóng vai trò là điểm liên lạc đầu tiên liên quan đến quyền sở hữu IP. Quá trình này rất khó khăn, đó là lý do tại sao các dịch vụ khác nhau ở đây đôi khi hoạt động và không hoạt động vào các thời điểm khác.

Tuy nhiên, ai là (rõ ràng) một giao thức TCP cổ đại - cách thức hoạt động ban đầu là do kết nối với cổng 43, khiến nó gặp vấn đề khi chuyển nó qua các kết nối thuê, qua tường lửa ... vv.

Tại thời điểm này - hầu hết Ai được thực hiện thông qua RESTful HTTP và ARIN, RIPE và APNIC đều có các dịch vụ RESTful hoạt động. LACNIC trả về 503 và AfriNIC dường như không có API như vậy. (Tất cả đều có dịch vụ trực tuyến, tuy nhiên.)

Điều đó sẽ giúp bạn - địa chỉ của chủ sở hữu đã đăng ký của IP, nhưng - không phải địa điểm của khách hàng của bạn - bạn phải lấy thông tin đó từ họ và cả - bạn phải yêu cầu. Ngoài ra, proxy là ít lo lắng nhất của bạn khi xác thực IP mà bạn nghĩ là người khởi tạo.

Mọi người không đánh giá cao khái niệm rằng họ đang bị theo dõi, vì vậy - suy nghĩ của tôi là - lấy nó trực tiếp từ khách hàng của bạn và với sự cho phép của họ và mong đợi rất nhiều để chùn bước trước khái niệm này.


8

Nhìn vào API từ hostip.info - nó cung cấp nhiều thông tin.
Ví dụ trong 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...

Nếu bạn tin tưởng hostip.info, nó dường như là một API rất hữu ích.


1
không so với các dịch vụ khác HostIP là waaaay tắt tuy nhiên .. www.ip-adress.com, móng tay nó
Scott Evernden

8

Dịch vụ trong phản hồi của Ben Dowling đã thay đổi, vì vậy giờ đây nó đơn giản hơn. Để tìm vị trí, chỉ cần làm:

// 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

Các tọa độ trả về trong một chuỗi đơn như '31, -80 ', vì vậy từ đó bạn chỉ cần:

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

4
Bạn đúng rằng ipinfo.io sẽ trả về các chi tiết cho IP của người gọi theo mặc định. Nếu bạn đang chạy một trang web PHP sẽ là IP của máy chủ của bạn, chứ không phải IP của người dùng. Đó là lý do tại sao bạn cần vượt qua trong $ _SERVER ['REMOTE_ADDR']. Nếu bạn chỉ muốn tọa độ, sẽ nhanh hơn để nối / định vị vào URL để chỉ nhận trường đó.
Ben Dowling

À, đúng rồi! Và tôi đã không biết về / loc - Tôi sẽ sửa nó ngay lập tức trên trang web của riêng tôi.
Isaac Askew

7

Giả sử bạn muốn tự làm và không phụ thuộc vào các nhà cung cấp khác, IP2Nation cung cấp cơ sở dữ liệu MySQL về ánh xạ được cập nhật khi các cơ quan đăng ký khu vực thay đổi mọi thứ xung quanh.


Tôi đang sử dụng một dịch vụ bên ngoài và đột nhiên trang web của tôi trở nên rất chậm. Dịch vụ bên ngoài đã mất 20 giây để gửi lại thông tin - điều này rõ ràng là thảm họa đối với khách truy cập. Vì vậy, quyết định tự làm điều đó, và đây là một giải pháp hoàn hảo. Cảm ơn rất nhiều.
Williamz902

7

Tôi chạy dịch vụ tại IPLocate.io , nơi bạn có thể kết nối miễn phí với một cuộc gọi dễ dàng:

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

Đối $restượng sẽ chứa các trường định vị địa lý của bạn như country,city vv

Kiểm tra các tài liệu để biết thêm thông tin.


7

Tôi thích GeoLite City miễn phí từ Maxmind hoạt động cho hầu hết các ứng dụng và từ đó bạn có thể nâng cấp lên phiên bản trả tiền nếu nó không đủ chính xác. Có một API PHP đi kèm, cũng như cho các ngôn ngữ khác. Và nếu bạn đang chạy Lighttpd với tư cách là một máy chủ web, bạn thậm chí có thể sử dụng một mô-đun để lấy thông tin trong biến SERVER cho mọi khách truy cập nếu đó là những gì bạn cần.

Tôi nên thêm vào đó là một Quốc gia Geolite miễn phí (sẽ nhanh hơn nếu bạn không cần xác định chính xác thành phố IP từ đâu) và Geolite ASN (nếu bạn muốn biết ai sở hữu IP) và cuối cùng tất cả những điều này là có thể tải xuống trên máy chủ của riêng bạn, được cập nhật hàng tháng và khá nhanh chóng để tra cứu với các API được cung cấp khi chúng nêu "hàng ngàn lượt tra cứu mỗi giây".


1
Bạn có thể xem xét IP2Location LITE lite.ip2location.com miễn phí. Nó có tối đa thông tin mã ZIP rất hữu ích.
Michael C.

6

PHP có một phần mở rộng cho điều đó.

Từ PHP.net:

Tiện ích mở rộng GeoIP cho phép bạn tìm vị trí của địa chỉ IP. Thành phố, Bang, Quốc gia, Kinh độ, Vĩ độ và tất cả các thông tin khác, chẳng hạn như ISP và loại kết nối có thể được lấy với sự trợ giúp của GeoIP.

Ví dụ:

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

3
Đây chỉ là một mô-đun php cho cơ sở dữ liệu MaxMind, là phần mềm trả tiền. (Phiên bản "lite" miễn phí rất không chính xác.) Không nói đó là một điều xấu, nhưng nó thực sự chỉ hữu ích cho mục đích thương mại.
Ai đó

6

Ipdata.co là API định vị địa lý IP nhanh, khả dụng cao với hiệu suất đáng tin cậy.

Nó cực kỳ có thể mở rộng với 10 điểm cuối trên toàn thế giới, mỗi điểm có thể xử lý> 10.000 yêu cầu mỗi giây!

Câu trả lời này sử dụng Khóa API 'kiểm tra' rất hạn chế và chỉ có nghĩa là để thử nghiệm một vài cuộc gọi. Đăng ký Khóa API miễn phí của riêng bạn và nhận tới 1500 yêu cầu hàng ngày để phát triển.

Trong 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

Đây là một ví dụ về phía khách hàng cho thấy cách bạn có được quốc gia, khu vực và thành phố;

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

Tuyên bố miễn trừ trách nhiệm;

Tôi xây dựng dịch vụ.

Để biết ví dụ bằng nhiều ngôn ngữ, hãy xem Tài liệu

Cũng xem phân tích chi tiết này về API vị trí địa lý IP tốt nhất.


5

Trong trường hợp bất cứ ai vấp phải chủ đề này, đây là một giải pháp khác. Tại timezoneapi.io, bạn có thể yêu cầu một địa chỉ IP và nhận lại một số đối tượng (Tôi đã tạo dịch vụ). Nó được tạo ra bởi vì tôi cần biết người dùng của mình đang ở đâu, ở đâu trên thế giới và hiện tại là mấy giờ.

Trong PHP - trả về vị trí, múi giờ và ngày / giờ:

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

}

Sử dụng 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

Sau đây là phiên bản sửa đổi của đoạn trích tôi tìm thấy sử dụng http://ipinfodb.com/ip_locator.php để lấy thông tin của nó. Hãy nhớ rằng, bạn cũng có thể đăng ký khóa API với họ và sử dụng API trực tiếp để nhận thông tin được cung cấp khi bạn thấy phù hợp.

Đoạn trích

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

Sử dụng

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

Nếu bạn cần lấy vị trí từ một địa chỉ IP, bạn có thể sử dụng dịch vụ ip địa lý đáng tin cậy, bạn có thể biết thêm chi tiết tại đây . Nó hỗ trợ IPv6.

Là một phần thưởng, nó cho phép kiểm tra xem địa chỉ IP là nút tor, proxy công cộng hay spammer.

Bạn có thể sử dụng javascript hoặc php như dưới đây.

Mã 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);
                 });
        });
    });

Mã Php:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

Đầu ra:

{
"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

Tôi đã tạo một trình bao bọc cho ipinfo.io . Bạn có thể cài đặt nó bằng trình soạn nhạc.

Bạn có thể sử dụng nó theo cách này:

$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

Bạn cũng có thể sử dụng dịch vụ "smart-ip":

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

2

Tôi đã thực hiện một loạt thử nghiệm với các dịch vụ địa chỉ IP và đây là một vài cách tôi tự làm. Trước hết, một loạt các liên kết đến các trang web hữu ích mà tôi sử dụng:

https://db-ip.com/db Có dịch vụ tra cứu ip miễn phí và có một vài tệp csv miễn phí mà bạn có thể tải xuống. Điều này sử dụng khóa api miễn phí được đính kèm với email của bạn. Nó giới hạn ở 2000 truy vấn mỗi ngày.

http://ipinfo.io/ Dịch vụ tra cứu ip miễn phí không có chức năng PHP api-key:

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

Cuối cùng, bạn nhận được một cái gì đó như thế này:

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/ Hơi cũ nhưng dịch vụ này cung cấp cho bạn một loạt các thông tin hữu ích bổ sung như tiền tệ ngoài quốc gia, mã lục địa, kinh độ và hơn thế nữa.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Cung cấp một loạt các tệp có thể tải xuống với hướng dẫn để nhập chúng vào cơ sở dữ liệu của bạn. Khi bạn có một trong những tệp này trong cơ sở dữ liệu của mình, bạn có thể chọn dữ liệu khá dễ dàng.

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

Sử dụng hàm php ip2long (); để biến địa chỉ IP thành một giá trị số. Ví dụ 1.1.1.1 trở thành 16843009. Điều này cho phép bạn quét các dải ip được cung cấp cho bạn bởi tệp cơ sở dữ liệu.

Vì vậy, để tìm ra nơi 1.1.1.1 thuộc về tất cả những gì chúng ta làm là chạy truy vấn này:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

Điều này trả về dữ liệu này là một ví dụ.

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

2

Có 2 cách tiếp cận rộng để thực hiện định vị địa lý IP: một là tải xuống tập dữ liệu, lưu trữ trên cơ sở hạ tầng của bạn và duy trì cập nhật. Điều này đòi hỏi thời gian và nỗ lực, đặc biệt nếu bạn cần hỗ trợ một số lượng lớn yêu cầu. Một giải pháp khác là sử dụng dịch vụ API hiện có để quản lý tất cả công việc cho bạn và hơn thế nữa.

Tồn tại nhiều dịch vụ Định vị địa lý API: Maxmind, Ip2location, Ipstack, IpInfo, v.v. Gần đây, công ty tôi làm việc đã chuyển sang Ipregology ( https://ipregistry.co ) và tôi đã tham gia vào quá trình quyết định và thực hiện. Dưới đây là một số yếu tố bạn nên xem xét khi tìm kiếm API định vị địa lý IP:

  • Dịch vụ có chính xác không? Có phải họ đang sử dụng một nguồn thông tin duy nhất?
  • Họ thực sự có thể xử lý tải của bạn?
  • Họ có cung cấp thời gian phản hồi nhất quán và nhanh chóng trên toàn thế giới (trừ khi người dùng của bạn là quốc gia cụ thể) không?
  • Mô hình định giá của họ là gì?

Dưới đây là một ví dụ để nhận thông tin định vị địa lý IP (nhưng cũng đe dọa và dữ liệu tác nhân người dùng bằng một cuộc gọi):

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

Lưu ý: Tôi không ở đây để quảng bá Ipregology và nói rằng đó là cách tốt nhất nhưng tôi đã dành một thời gian dài để phân tích các giải pháp hiện có và giải pháp của họ thực sự hứa hẹn.


-1

Nếu bạn đang tìm kiếm một cơ sở dữ liệu cập nhật / chính xác, tôi khuyên bạn nên sử dụng cơ sở dữ liệu này tại đây vì nó hiển thị vị trí chính xác của tôi không được bao gồm trong nhiều dịch vụ khác khi tôi đang thử nghiệm.
(Thành phố của tôi là Rashtvà đất nước của tôi Irancó địa chỉ IP này: 2.187.21.235khi tôi đang thử nghiệm.)

Tôi khuyên bạn nên sử dụng cơ sở dữ liệu thay vì các phương thức API, vì nó sẽ được xử lý nhanh hơn nhiều cục bộ.


-1

Ok, cảm ơn vì lời đề nghị của bạn; Trong khi tôi có 6k + IP, một số dịch vụ sẽ không thực hiện được yêu cầu của tôi do một số hạn chế; Vì vậy, bạn có thể sử dụng tất cả chúng trong chế độ dự phòng;

Nếu chúng ta có tệp nguồn với định dạng sau:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

hơn bạn có thể sử dụng lệnh expample đơn giản này (PoC) cho 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;
}

}

Đây là một số loại mã shitty, nhưng nó hoạt động. sử dụng:

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

Hãy sử dụng, sửa đổi nó và làm nó tốt hơn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.