Mendapatkan lokasi dari alamat IP

205

Saya ingin mengambil informasi seperti kota, negara bagian, dan negara pengunjung dari alamat IP mereka, sehingga saya dapat menyesuaikan halaman web saya sesuai dengan lokasi mereka. Apakah ada cara yang baik dan dapat diandalkan untuk melakukan ini di PHP? Saya menggunakan JavaScript untuk skrip sisi klien, PHP untuk skrip sisi server, dan MySQL untuk database.

Ben Dowling
sumber
Ini adalah duplikat dari stackoverflow.com/questions/348614/… .
Charlie Martin

Jawaban:

255

Anda bisa mengunduh database GeoIP gratis dan mencari alamat IP secara lokal, atau Anda bisa menggunakan layanan pihak ketiga dan melakukan pencarian jarak jauh. Ini adalah opsi yang lebih sederhana, karena tidak memerlukan pengaturan, tetapi memang memperkenalkan latensi tambahan.

Layanan pihak ketiga yang dapat Anda gunakan adalah milik saya, http://ipinfo.io . Mereka memberikan nama host, geolokasi, pemilik jaringan dan informasi tambahan, misalnya:

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

Berikut ini contoh PHP:

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

Anda juga dapat menggunakannya di sisi klien. Inilah contoh jQuery sederhana:

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

Ben Dowling
sumber
1
Anda mungkin ingin memastikan Anda menambahkan json di akhir URL untuk memastikan Anda mendapatkan json kembali, bukan halaman web lengkap. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug
1
@Manatax Tidak, karena dengan begitu tidak mungkin untuk menguraikan respons server.
Ja͢ck
3
Sepertinya bukan layanan yang sangat andal. Saya mendapatkan nulluntuk nama kota saya. Itu tidak seperti kota kecil atau sesuatu tetapi masih tidak dapat menemukannya. Jika tidak bekerja dengan baik di AS, saya ragu seberapa sering itu juga akan mengembalikan nol di luar AS.
Derek 朕 會 功夫
2
hasilnya tidak akurat .. wilayah, pos kota
Mark Gerryl Mirandilla
2
PERINGATAN: Pada Januari / 2019, beberapa orang melaporkan bahwa url ipinfo ini tidak aman di virustotal, karena trojan. Pemungutan suara antara 2015 dan 2018
Ricardo
55

Saya pikir saya akan memposting karena tampaknya tidak ada yang memberikan info tentang API khusus ini, tetapi mengembalikan persis apa yang saya cari dan Anda bisa mendapatkannya kembali dalam berbagai format json, xml and csv,.

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

Ini akan memberi Anda semua hal yang mungkin Anda inginkan:

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

}
Jamie Hutber
sumber
1
Hai, Jamie FreegeoIp.net tidak berfungsi. Apakah ada cara lain?
Adi
Maaf tidak saat ini, tapi itu memalukan karena itulah layanan yang saya gunakan di situs langsung saya. Semoga mereka kembali lagi beberapa waktu yang lalu
Jamie Hutber
2
kebanyakan turun dan jarang memberikan wilayah atau kota mana pun
Rahul aman
2
Layanan Tony di Azure tampaknya bekerja cepat dan andal: freegeoip2
Gustav
1
Sayangnya, layanan ini akan terputus 1 Juli 2018 karena pesan ini: "Titik akhir API ini sudah usang dan akan berhenti bekerja pada 1 Juli 2018. Untuk informasi lebih lanjut, silakan kunjungi: github.com/apilayer/freegeoip#readme \
Julio Bailon
20

Contoh Javascript murni, menggunakan layanan https://geolocation-db.com. Mereka menyediakan solusi panggilan balik JSON dan JSONP.

Tidak diperlukan 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>
Kurt Van den Branden
sumber
Apakah ada batasan terkait penggunaan https://geoilocation-db.comapi?
Priyanka Sharma
16

Menggunakan 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>
Raposo
sumber
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
Bagaimana dengan kualitas geolokasi IP APIS Google ini? (itu, atau saya salah?), dibandingkan dengan layanan lain seperti ipinfo.io ?
Basj
Saya bertanya kepada ~ 30 orang di berbagai kota, dan kualitas geolokasi IP Google APIS buruk dibandingkan dengan ipinfo.io
Basj
1
@ Basj Google API bekerja seperti pesona sementara ipinfo.io menunjukkan saya di AS sementara saya sebenarnya di Eropa tengah
patryk
15

Anda perlu menggunakan layanan eksternal ... seperti http://www.hostip.info/ jika Anda mencari "geo-ip" di google, Anda bisa mendapatkan hasil lebih banyak.

Host-IP API berbasis HTTP sehingga Anda dapat menggunakannya dalam PHP atau JavaScript tergantung kebutuhan Anda.

batal
sumber
6
Saya telah menggunakan hostip.info selama satu tahun sekarang dan saya TIDAK terkesan. Ini biasanya kembali diketahui 9/10 cek
aron
setuju, itu memberitahuku aku tinggal di Woking ... Dalam keadilan itu benar GB ... Tapi aku di London.
Jamie Hutber
2
Ingatlah bahwa layanan apa pun hanya akan sebagus info / data publik yang tersedia. Karena alasan privasi info ini hanya bisa "sangat bagus". Jika itu membuat negara Anda benar, dan setidaknya dekat dengan negara bagian / provinsi, saya akan menganggap itu MENANG. Jika Anda kebetulan menggunakan ini untuk mencari info untuk serangan DOS, perlu diingat bahwa IP mungkin bahkan tidak valid (tidak ditugaskan kepada siapa pun atau di luar rentang IP publik yang valid).
eselk
Di situs web mereka, saya mendapatkan "Lokasi: ... sebenarnya kami tidak memiliki petunjuk." Yang perlu saya ketahui
Bojan Kogoj
15

Saya menulis bot menggunakan API dari ipapi.co , berikut cara Anda bisa mendapatkan lokasi untuk alamat IP (mis. 1.2.3.4) Di php:

Setel tajuk:

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

Dapatkan respons JSON

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

dari mendapatkan bidang tertentu (negara, zona waktu, dll.)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);
Jaimes
sumber
1
@Eoin Menghapusnya. Sepertinya IP phpfiddle dibatasi.
Jaimes
10

Pertanyaan ini dilindungi, yang saya mengerti. Namun, saya tidak melihat jawaban di sini, yang saya lihat adalah banyak orang menunjukkan apa yang mereka dapatkan dari pertanyaan yang sama.

Saat ini ada lima Regional Internet Registries dengan berbagai tingkat fungsi yang berfungsi sebagai titik kontak pertama sehubungan dengan kepemilikan IP. Prosesnya berubah, itulah sebabnya berbagai layanan di sini kadang-kadang bekerja dan tidak di waktu lain.

Who Is (jelas) merupakan protokol TCP kuno, namun - cara kerjanya semula adalah dengan koneksi ke port 43, yang membuatnya bermasalah saat dialihkan melalui koneksi sewaan, melalui firewall ... dll.

Saat ini - kebanyakan Who Is dilakukan melalui RESTful HTTP dan ARIN, RIPE dan APNIC memiliki layanan RESTful yang berfungsi. LACNIC mengembalikan 503 dan AfriNIC tampaknya tidak memiliki API semacam itu. (Namun, semua memiliki layanan online.)

Itu akan memberi Anda - alamat pemilik terdaftar IP, tetapi - bukan lokasi klien Anda - Anda harus mendapatkannya dari mereka dan juga - Anda harus memintanya. Juga, proksi adalah yang paling tidak Anda khawatirkan saat memvalidasi IP yang menurut Anda adalah pencetusnya.

Orang tidak menghargai gagasan bahwa mereka sedang dilacak, jadi - menurut saya - dapatkan langsung dari klien Anda dan dengan izin mereka dan berharap banyak untuk menolak gagasan tersebut.

jinzai
sumber
8

Lihatlah API dari hostip.info - ini menyediakan banyak informasi.
Contoh dalam 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...

Jika Anda mempercayai hostip.info, sepertinya itu adalah API yang sangat berguna.

Isaac Waller
sumber
1
unf. dibandingkan dengan layanan lain HostIP adalah waaaay off .. www.ip-adress.com, tetapi berhasil
Scott Evernden
8

Layanan dalam respons Ben Dowling telah berubah, jadi sekarang lebih sederhana. Untuk menemukan lokasi, cukup lakukan:

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

Koordinat kembali dalam string tunggal seperti '31, -80 ', jadi dari sana Anda cukup:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude
Isaac Askew
sumber
4
Anda benar bahwa ipinfo.io akan mengembalikan rincian untuk IP pemanggil secara default. Jika Anda menjalankan situs web PHP yang akan menjadi IP server Anda, bukan IP pengguna. Itulah alasan mengapa Anda harus memberikan $ _SERVER ['REMOTE_ADDR']. Jika Anda hanya ingin koordinat, akan lebih cepat untuk menambahkan / menemukan URL untuk mendapatkan bidang itu juga.
Ben Dowling
Ah, benar juga! Dan saya tidak tahu tentang / loc - saya akan segera memperbaikinya di situs saya sendiri.
Isaac Askew
7

Dengan asumsi Anda ingin melakukannya sendiri dan tidak bergantung pada penyedia lain, IP2Nation menyediakan database MySQL dari pemetaan yang diperbarui sebagai pendaftar regional mengubah hal-hal di sekitar.

James Cape
sumber
Saya menggunakan layanan eksternal dan tiba-tiba situs web saya menjadi sangat lambat. Layanan eksternal memerlukan waktu 20 detik untuk mengirim kembali informasi - yang jelas merupakan bencana bagi pengunjung. Jadi memutuskan untuk melakukannya sendiri, dan ini adalah solusi sempurna. Terima kasih banyak.
Williamz902
7

Saya menjalankan layanan di IPLocate.io , yang dapat Anda hubungi secara gratis dengan satu panggilan mudah:

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

The $resobjek akan berisi bidang geolocation Anda seperti country,city , dll

Lihat dokumen untuk informasi lebih lanjut.

ttarik
sumber
7

Saya suka GeoLite City gratis dari Maxmind yang berfungsi untuk sebagian besar aplikasi dan dari mana Anda dapat memutakhirkan ke versi berbayar jika tidak cukup akurat. Ada PHP PHP yang disertakan, serta untuk bahasa lain. Dan jika Anda menjalankan Lighttpd sebagai server web, Anda bahkan dapat menggunakan modul untuk mendapatkan informasi dalam variabel SERVER untuk setiap pengunjung jika itu yang Anda butuhkan.

Saya harus menambahkan ada juga Geolite Country gratis (yang akan lebih cepat jika Anda tidak perlu menentukan kota IP berasal dari) dan Geolite ASN (jika Anda ingin tahu siapa yang memiliki IP) dan yang akhirnya semua ini adalah dapat diunduh di server Anda sendiri, diperbarui setiap bulan dan cukup cepat untuk mencari dengan API yang disediakan karena mereka menyatakan "ribuan pencarian per detik".

lpfavreau
sumber
1
Anda dapat mempertimbangkan IP2Location LITE lite.ip2location.com yang gratis. Ini memiliki hingga informasi kode ZIP yang sangat berguna.
Michael C.
6

PHP memiliki ekstensi untuk itu.

Dari PHP.net:

Ekstensi GeoIP memungkinkan Anda menemukan lokasi alamat IP. Kota, Negara Bagian, Negara, Bujur, Lintang, dan informasi lainnya, seperti ISP dan jenis koneksi dapat diperoleh dengan bantuan GeoIP.

Sebagai contoh:

$record = geoip_record_by_name($ip);
echo $record['city'];
Ian Hunter
sumber
3
Ini hanya modul php untuk database MaxMind, yang merupakan perangkat bayar. (Versi "lite" gratis sangat tidak akurat.) Tidak mengatakan itu adalah hal yang buruk, tetapi ini hanya berguna untuk tujuan komersial.
Seseorang
6

Ipdata.co adalah API Geolokasi IP yang cepat dan sangat tersedia dengan kinerja yang andal.

Ini sangat scalable dengan 10 titik akhir di seluruh dunia yang masing-masing mampu menangani> 10.000 permintaan per detik!

Jawaban ini menggunakan Kunci API 'uji' yang sangat terbatas dan hanya dimaksudkan untuk menguji beberapa panggilan. Daftar untuk Kunci API Gratis Anda sendiri dan dapatkan hingga 1500 permintaan setiap hari untuk pengembangan.

Dalam 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

Berikut adalah contoh sisi klien yang menunjukkan bagaimana Anda mendapatkan negara, wilayah, dan kota;

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

Penolakan;

Saya membangun layanan.

Untuk contoh dalam berbagai bahasa, lihat Documents

Juga melihat ini analisis rinci dari yang terbaik IP Geolocation API.

Jonathan
sumber
5

Jika ada yang menemukan utas ini, inilah solusi lain. Di timezoneapi.io Anda dapat meminta alamat IP dan mendapatkan beberapa objek sebagai balasan (saya telah membuat layanan). Itu dibuat karena saya perlu tahu di zona waktu mana pengguna saya berada, di mana di dunia dan jam berapa saat ini.

Dalam PHP - mengembalikan lokasi, zona waktu, dan tanggal / waktu:

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

}

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

    }

});
Michael Nilsson
sumber
4

Berikut ini adalah versi modifikasi dari cuplikan yang saya temukan yang menggunakan http://ipinfodb.com/ip_locator.php untuk mendapatkan informasinya. Ingat, Anda juga dapat mengajukan kunci API dengan mereka dan menggunakan API secara langsung untuk mendapatkan informasi yang diberikan sesuai keinginan Anda.

Potongan

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

Menggunakan

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" }
SpYk3HH
sumber
4

Jika Anda perlu mendapatkan lokasi dari alamat IP Anda dapat menggunakan layanan geo ip yang andal, Anda bisa mendapatkan detail lebih lanjut di sini . Ini mendukung IPv6.

Sebagai bonus, ini memungkinkan untuk memeriksa apakah alamat ip adalah node, proxy publik, atau spammer.

Anda dapat menggunakan javascript atau php seperti di bawah ini.

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

Kode Php:

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

Keluaran:

{
"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
}
Vindhyachal Kumar
sumber
3

Saya telah membuat pembungkus untuk ipinfo.io . Anda dapat menginstalnya menggunakan komposer.

Anda dapat menggunakannya dengan cara ini:

$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();
Davide Pastore
sumber
2

Anda juga dapat menggunakan layanan "smart-ip":

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

Saya telah melakukan banyak pengujian dengan layanan alamat IP dan berikut adalah beberapa cara saya melakukannya sendiri. Pertama, banyak tautan ke situs web berguna yang saya gunakan:

https://db-ip.com/db Memiliki layanan ip-lookup gratis dan memiliki beberapa file csv gratis yang dapat Anda unduh. Ini menggunakan kunci api gratis yang dilampirkan ke email Anda. Batasnya 2.000 permintaan per hari.

http://ipinfo.io/ Layanan ip-lookup gratis tanpa fungsi PHP kunci-api:

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

Pada akhirnya Anda mendapatkan sesuatu seperti ini:

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/ Sedikit lebih tua tetapi layanan ini memberi Anda banyak informasi berguna tambahan seperti mata uang luar negeri, kode benua, bujur dan banyak lagi.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Menawarkan banyak file yang dapat diunduh dengan instruksi untuk mengimpornya ke dalam database Anda. Setelah Anda memiliki satu dari file-file ini di database Anda, Anda dapat memilih data dengan cukup mudah.

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

Gunakan fungsi php ip2long (); untuk mengubah alamat ip menjadi nilai numerik. Misalnya 1.1.1.1 menjadi 16843009. Ini memungkinkan Anda memindai rentang ip yang diberikan kepada Anda oleh file database.

Jadi untuk mengetahui di mana 1.1.1.1 milik kami, jalankan query ini:

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

Ini mengembalikan data ini sebagai contoh.

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

Ada 2 pendekatan luas untuk melakukan geolokasi IP: satu adalah mengunduh dataset, menyimpannya di infrastruktur Anda dan menjaganya tetap terbaru. Ini membutuhkan waktu dan usaha, terutama jika Anda perlu mendukung banyak permintaan. Solusi lain adalah dengan menggunakan layanan API yang ada yang mengelola semua pekerjaan untuk Anda dan banyak lagi.

Ada banyak layanan Geolokasi API: Maxmind, Ip2location, Ipstack, IpInfo, dll. Baru-baru ini, perusahaan tempat saya bekerja telah beralih ke Ipregistry ( https://ipregistry.co ) dan saya terlibat dalam proses pengambilan keputusan dan implementasi. Berikut adalah beberapa elemen yang harus Anda pertimbangkan saat mencari API geolokasi IP:

  • Apakah layanannya akurat? apakah mereka menggunakan satu sumber informasi?
  • Bisakah mereka benar-benar menangani beban Anda?
  • Apakah mereka memberikan waktu respons yang konsisten dan cepat di seluruh dunia (kecuali jika pengguna Anda spesifik untuk negara)?
  • Apa model penetapan harganya?

Berikut adalah contoh untuk mendapatkan informasi geolokasi IP (tetapi juga data ancaman dan agen pengguna menggunakan satu panggilan):

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

Catatan: Saya di sini bukan untuk mempromosikan Ipregistry dan mengatakan itu yang terbaik tetapi saya menghabiskan waktu lama menganalisis solusi yang ada dan solusi mereka benar-benar menjanjikan.

BonieE
sumber
-1

Jika Anda mencari database yang diperbarui / akurat saya sarankan untuk menggunakan yang ini di sini karena itu menunjukkan lokasi saya yang sebenarnya yang tidak termasuk dalam banyak layanan lain ketika saya sedang menguji.
(Kota saya dulu Rashtdan negara saya Iranmenggunakan alamat ip ini:2.187.21.235 ketika saya menguji.)

Saya merekomendasikan untuk menggunakan database daripada metode API, karena akan diproses lebih cepat secara lokal.

Mojtaba Rezaeian
sumber
-1

Ok, teman-teman, terima kasih atas saran Anda; Meskipun saya memiliki 6 k + IP, beberapa layanan akan gagal permintaan saya karena beberapa batasan; Jadi, Anda bisa menggunakan semuanya dalam mode fallback;

Jika kami memiliki file sumber dengan format berikut:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

daripada Anda bisa menggunakan perintah expample sederhana (PoC) ini untuk 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;
}

}

Ini semacam kode yang menyebalkan, tetapi berhasil. pemakaian:

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

Jangan ragu untuk menggunakan, memodifikasinya, dan melakukannya dengan lebih baik)

alexglue
sumber