Konumu bir IP adresinden alma


205

Bir ziyaretçinin şehri, eyaleti ve ülkesi gibi bilgileri IP adreslerinden almak istiyorum, böylece web sayfamı konumlarına göre özelleştirebilirim. PHP bunu yapmanın iyi ve güvenilir bir yolu var mı? İstemci tarafı komut dosyası için JavaScript, sunucu tarafı komut dosyası için PHP ve veritabanı için MySQL kullanıyorum.


Yanıtlar:


255

Ücretsiz bir GeoIP veritabanı indirebilir ve IP adresini yerel olarak arayabilir veya üçüncü taraf bir hizmet kullanabilir ve uzaktan arama yapabilirsiniz. Kurulum gerektirmediği için daha basit bir seçenektir, ancak ek gecikme sağlar.

Kullanabileceğiniz bir üçüncü taraf hizmeti benimdir, http://ipinfo.io . Ana bilgisayar adı, coğrafi konum, ağ sahibi ve ek bilgiler sağlarlar, örneğin:

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

İşte bir PHP örneği:

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

Ayrıca istemci tarafında da kullanabilirsiniz. Basit bir jQuery örneği:

$.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
Tam web sayfası yerine json'u geri almak için URL'nin sonuna bir json eklediğinizden emin olmak isteyebilirsiniz. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax Değil, çünkü o zaman sunucu yanıtını ayrıştırmak imkansız olurdu.
Ja͢ck

3
Çok güvenilir bir hizmet gibi görünmüyor. nullŞehir adımı alıyorum . Küçük bir şehir gibi bir şey değil ama yine de bulamadı. ABD içinde iyi çalışmazsa, ABD dışında ne sıklıkta boş değer vereceğinden şüpheliyim.
Derek 朕 會 功夫

2
sonuç doğru değil .. bölge, şehir posta
Mark Gerryl Mirandilla

2
UYARI: Jan / 2019 itibarıyla, bazı kişiler bu bildirdi ipinfo url olduğunu güvensiz nedeniyle trojan, virustotal üzerinde. Oylar 2015-2018 arasındaydı
Ricardo

55

Kimse bu belirli API hakkında bilgi vermiş gibi görüneceğini düşündüm, ama onun tam olarak ne sonra geri dönen ve birden çok biçimde geri dönmek için alabilirsiniz json, xml and csv.

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

Bu size isteyebileceğiniz her şeyi verecektir:

{
      "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
Hey Jamie FreegeoIp.net çalışmıyor. Başka yolu var mı?
Adi

Maalesef şu an için değil, canlı sitelerimde kullandığım hizmet kadar utanç verici. Bir süre geri gelmelerini umuyoruz
Jamie Hutber

2
çoğunlukla aşağı ve nadiren herhangi bir bölge veya şehir verir
Rahul Aman

2
Tony'nin Azure'daki servisi hızlı ve güvenilir bir şekilde çalışıyor: freegeoip2
Gustav

1
Ne yazık ki, bu iletinin şu iletiye göre 1 Temmuz 2018'de bağlantısı kesilecek: "Bu API uç noktası kullanımdan kaldırıldı ve 1 Temmuz 2018'de çalışmayı durduracak. Daha fazla bilgi için lütfen şu adresi ziyaret edin: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Https://geolocation-db.com hizmetlerini kullanarak saf bir Javascript örneği JSON ve JSONP geri arama çözümü sağlarlar.

JQuery gerekmez!

<!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 kullanımıyla ilgili herhangi bir sınır var mı ?
Priyanka Sharma

16

Google APIS kullanma:

<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

Bu Google APIS IP coğrafi konumunun kalitesi ne olacak? (öyle ya da yanlış mıyım?), ipinfo.io gibi diğer hizmetlerle karşılaştırıldığında ?
Basj

Farklı şehirlerde ~ 30 kişiye sordum ve Google APIS IP coğrafi konum kalitesi ipinfo.io'ya kıyasla düşük
Basj

1
@Basj Google API bir cazibe gibi çalışır, ancak ipinfo.io aslında ABD'deyken ABD'de olduğumu gösterir
patryk

15

Harici bir hizmet kullanmanız gerekiyor ... http://www.hostip.info/ gibi "geo-ip" için Google'da arama yaparsanız daha fazla sonuç alabilirsiniz.

Host-IP API HTTP tabanlıdır, bu nedenle ihtiyacınıza göre PHP veya JavaScript olarak kullanabilirsiniz.


6
Bir yıldır hostip.info kullanıyorum ve etkilendim DEĞİLDİR. Genellikle bilinmeyen 9/10 çekleri döndürür
aron

kabul etti, bana Woking'de yaşadığımı söylüyor ... Adil olmak gerekirse GB biti doğru geldi ... Ama Londra'dayım.
Jamie Hutber

2
Herhangi bir hizmetin yalnızca genel bilgi / veri kadar iyi olacağını unutmayın. Gizlilik nedeniyle bu bilgi sadece "çok iyi" olabilir. Ülkenizi doğru ve en azından eyalet / vilayete yakın olursa, bir WIN olduğunu düşünürdüm. Bir DOS saldırısı için bilgi aramak amacıyla bunu kullanıyorsanız, IP'lerin bile geçerli olmayabileceğini (kimseye atanmamış veya geçerli genel IP aralığının dışında) unutmayın.
eselk

Web sitelerinde "Yer: ... aslında bir ipucu yok." Tüm bilmem gereken
Bojan Kogoj

15

Ben ipapi.co bir API kullanarak bir bot yazdım , işte nasıl bir IP adresi (örneğin 1.2.3.4) için konum alabilirsiniz php:

Üstbilgiyi ayarla:

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

JSON yanıtı alın

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

alan (ülke, saat dilimi vb.)

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

1
@ Eoin Kaldırıldı. Phpfiddle'ın IP'sinin kısıtlanmış olduğu anlaşılıyor.
Jaimes

10

Bu soru korunuyor, anlıyorum. Bununla birlikte, burada bir cevap görmüyorum, gördüğüm şey, aynı soruyu ortaya çıkardıklarını gösteren birçok insan.

Şu anda IP mülkiyeti ile ilgili olarak ilk temas noktası olarak işlev gören çeşitli işlev derecelerine sahip beş Bölgesel İnternet Kaydı bulunmaktadır. Süreç akış halindedir, bu yüzden buradaki çeşitli hizmetler bazen çalışır ve diğer zamanlarda çalışmaz.

Bununla birlikte, Kim (açık bir şekilde) eski bir TCP protokolüdür - başlangıçta çalıştığı yol, 43 numaralı bağlantı noktasına bağlanmaktı, bu da kiralık bağlantılar, güvenlik duvarları aracılığıyla yönlendirilmesini zorlaştırıyordu ... vb.

Şu anda - çoğu Kim RESTful HTTP üzerinden yapılır ve ARIN, RIPE ve APNIC çalışan RESTful hizmetleri vardır. LACNIC'in 503 döndürdüğü ve AfriNIC'in böyle bir API'sı olmadığı anlaşılıyor. (Ancak hepsinin çevrimiçi hizmetleri vardır.)

Bu - IP'nin kayıtlı sahibinin adresi, ancak - müşterinizin konumu değil - bunu onlardan almanız ve ayrıca - bunu istemeniz gerekir. Ayrıca, temsilci olduğunu düşündüğünüz IP'yi doğrularken proxy'ler en az endişelerinizdir.

İnsanlar izlendikleri fikrini takdir etmiyorlar, bu yüzden - düşüncelerim - bunu doğrudan müşterinizden ve onların izniyle alın ve çok fazla fikrinin bozulmasını bekler.


8

API'ye hostip.info'dan bakın - çok fazla bilgi sağlar.
PHP'de örnek:

$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'ya güveniyorsanız, çok kullanışlı bir API gibi görünüyor.


1
unf. diğer hizmetlere kıyasla HostIP waaaay kapalı .. www.ip-adress.com Ancak, çivi
Scott Evernden

8

Ben Dowling'in yanıtındaki hizmet değişti, bu yüzden şimdi daha basit. Konumu bulmak için şunları yapmanız yeterlidir:

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

Koordinatlar '31, -80 'gibi tek bir dizede geri döner, böylece oradan şunları yapabilirsiniz:

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

4
Haklısınız şeyiz ipinfo.io varsayılan olarak arayanın IP için ayrıntıları dönecektir. Kullanıcının IP'si yerine sunucunuzun IP'si olacak bir PHP web sitesi çalıştırıyorsanız. Bu nedenle $ _SERVER ['REMOTE_ADDR'] iletmeniz gerekiyor. Sadece koordinatları istiyorsanız, yalnızca bu alanı almak için URL'yi eklemek / bulmak daha hızlı olacaktır.
Ben Dowling

Ah, bu doğru! Ve / loc hakkında bilmiyordum - hemen kendi sitemde düzeltirim.
Isaac Askew

7

Bunu kendiniz yapmak ve diğer sağlayıcılara güvenmek istemediğinizi varsayarsak, IP2Nation , bölgesel kayıtlar bir şeyleri değiştirdikçe güncellenen eşlemelerin bir MySQL veritabanını sağlar.


Harici bir hizmet kullanıyordum ve aniden web sitem gerçekten yavaşladı. Harici hizmet, bilgileri geri göndermek için iyi bir 20 saniye sürüyordu - ki bu ziyaretçiler için açık bir şekilde dezavantajlı. Bu yüzden kendim yapmaya karar verdim ve bu mükemmel bir çözüm. Çok teşekkürler.
Williamz902

7

Hizmeti tek bir kolay çağrı ile ücretsiz olarak bağlanabileceğiniz IPLocate.io'da çalıştırıyorum :

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

$resNesne sitelerine coğrafi konum alanları gibi içerecektir country, cityvb

Kontrol et Daha fazla bilgi dokümanlara göz .


7

Çoğu uygulama için çalışan ve yeterince hassas değilse ücretli bir sürüme yükseltebileceğiniz Maxmind'in ücretsiz GeoLite City'yi seviyorum . Diğer diller için olduğu gibi bir de PHP API var . Lighttpd'yi web sunucusu olarak çalıştırıyorsanız, bir modül bile kullanabilirsiniz. olan her şey varsa, her ziyaretçi için SERVER değişkenindeki bilgileri almak için .

Ben de ücretsiz bir Geolite Ülke (IP kimden olduğunu kesin olarak gerek yok daha hızlı olurdu) ve Geolite ASN (IP sahibi kim olduğunu bilmek istiyorsanız) ve nihayet tüm bunlar olduğunu eklemek gerekir kendi sunucunuzda indirilebilir, her ay güncellenir ve "saniyede binlerce arama" belirttikleri için sağlanan API'larla arama yapmak oldukça hızlıdır.


1
IP2Location LITE lite.ip2location.com'u ücretsiz olarak düşünebilirsiniz . Çok yararlı olan posta kodu bilgisine sahiptir.
Michael

6

PHP bir uzantıya sahiptir.

PHP.net'ten:

GeoIP uzantısı bir IP adresinin yerini bulmanızı sağlar. Şehir, Eyalet, Ülke, Boylam, Enlem ve ISP ve bağlantı türü gibi diğer tüm bilgiler GeoIP yardımıyla edinilebilir.

Örneğin:

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

3
Bu sadece paymware MaxMind veritabanı için bir php modülüdür. (Ücretsiz "lite" sürümleri son derece yanlıştır.) Kötü bir şey olduğunu söylememek, ancak gerçekten sadece ticari amaçlar için yararlıdır.
Birisi

6

Ipdata.co , güvenilir performansa sahip, hızlı ve yüksek oranda kullanılabilir bir IP Coğrafi Konum .

Her biri saniyede 10.000'den fazla isteği işleyebilen 10 uç nokta ile son derece ölçeklenebilir!

Bu yanıt, çok sınırlı olan ve yalnızca birkaç aramayı test etmek için kullanılan bir 'test' API Anahtarı kullanır. Aboneliği Kendi ücretsiz API Key ve geliştirme için her gün 1500 isteklerine kalk.

Php içinde

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

Ülkeyi, bölgeyi ve şehri nasıl alacağınızı gösteren bir müşteri tarafı örneği:

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

Yasal Uyarı;

Hizmeti ben kurdum.

Birden çok dilde örnekler için Dokümanlar'a bakın

Ayrıca en iyi IP Coğrafi Konum API'larının bu ayrıntılı analizine bakın .


5

Herkes bu iş parçacığı üzerinde tökezlemek durumunda, işte başka bir çözüm. at timezoneapi.io Eğer bir IP adresi talep edebilir ve (ı servisini oluşturduk) karşılığında birkaç nesne olsun. Oluşturuldu çünkü kullanıcılarımın hangi saat diliminde olduğunu, dünyanın neresinde olduğunu ve şu anda saatin kaç olduğunu bilmem gerekiyordu.

PHP'de - konum, saat dilimi ve tarih / saat döndürür:

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

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

Aşağıda, bilgi almak için http://ipinfodb.com/ip_locator.php kullanan bir snippet'in değiştirilmiş bir sürümüdür . Unutmayın, onlarla birlikte bir API anahtarı için başvurabilir ve uygun gördüğünüz gibi sağlanan bilgileri almak için doğrudan API'yı kullanabilirsiniz.

Pasaj

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

Kullanmak

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

Bir IP adresinden konum almanız gerekirse, güvenilir geo ip hizmetini kullanabilirsiniz, burada daha fazla ayrıntı alabilirsiniz . IPv6'yı destekler.

Bonus olarak ip adresinin bir tor düğüm, genel proxy veya spam göndericisi olup olmadığını kontrol etmenizi sağlar.

Javascript veya php'yi aşağıdaki gibi kullanabilirsiniz.

Javascript Kodu:

$(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 Kodu:

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

Çıktı:

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

İpinfo.io için bir sarıcı oluşturdum . Besteci kullanarak kurabilirsiniz.

Bu şekilde kullanabilirsiniz:

$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

Ayrıca "smart-ip" hizmetini de kullanabilirsiniz:

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

2

IP adresi hizmetleriyle bir sürü test yaptım ve işte bunu kendim yapmanın birkaç yolu var. Öncelikle kullandığım yararlı web sitelerinin bağlantılarından bir demet:

https://db-ip.com/db Ücretsiz bir ip arama servisi var ve indirebileceğiniz birkaç ücretsiz csv dosyası var. Bu, e-postanıza eklenen ücretsiz bir api anahtarı kullanır. Günde 2000 sorgu ile sınırlıdır.

http://ipinfo.io/ Api-anahtar PHP işlevleri olmadan ücretsiz ip arama hizmeti:

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

Sonunda şöyle bir şey elde edersiniz:

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/ Biraz daha eski ancak bu hizmet size ülke dışından para birimi, kıta kodu, boylam ve daha fazlası gibi bir sürü ekstra yararlı bilgi sağlar.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Veritabanınıza aktarma talimatlarını içeren bir dizi indirilebilir dosya sunar. Veritabanınızdaki bu dosyalardan birine sahip olduğunuzda, verileri oldukça kolay bir şekilde seçebilirsiniz.

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

İp2long () php işlevini kullanın; ip adresini sayısal bir değere dönüştürmek için. Örneğin 1.1.1.1, 16843009 olur. Bu, veritabanı dosyası tarafından size verilen ip aralıklarını taramanızı sağlar.

Yani 1.1.1.1'in nereye ait olduğunu bulmak için şu sorguyu çalıştırın:

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

Bu, bu verileri örnek olarak döndürür.

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

2

IP coğrafi konumlandırma yapmak için 2 geniş yaklaşım vardır: biri veri kümesini indirmek, altyapınızda barındırmak ve güncel tutmaktır. Bu, özellikle çok sayıda talebi desteklemeniz gerekiyorsa zaman ve çaba gerektirir. Başka bir çözüm, tüm işleri sizin için ve daha fazlasını yöneten mevcut bir API hizmetini kullanmaktır.

Birçok API Coğrafi Konumlandırma hizmeti vardır: Maxmind, Ip2location, Ipstack, IpInfo, vb. Son zamanlarda, çalıştığım şirket Ipregistry'e ( https://ipregistry.co ) geçti ve karar ve uygulama sürecine dahil oldum. Bir IP coğrafi konum API'sini ararken göz önünde bulundurmanız gereken bazı öğeler şunlardır:

  • Hizmet doğru mu? tek bir bilgi kaynağı kullanıyorlar mı?
  • Yükünüzü gerçekten kaldırabilirler mi?
  • Dünya çapında tutarlı ve hızlı yanıt süreleri sağlıyorlar mı (kullanıcılarınız ülkeye özgü olanlar hariç)?
  • Fiyatlandırma modelleri nedir?

IP coğrafi konum bilgilerini almak için bir örnek (aynı zamanda bir çağrı kullanarak tehdit ve kullanıcı aracısı verileri):

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

Not: Burada Ipregistry'i tanıtmak ve bunun en iyisi olduğunu söylemek için gelmedim, ancak mevcut çözümleri analiz etmek için uzun zaman harcadım ve çözümleri gerçekten umut vericidir.


-1

Güncellenmiş / doğru bir veritabanı arıyorsanız, bunu burada kullanmanızı öneririm, çünkü test ederken diğer birçok hizmette bulunmayan tam konumumu gösteriyordu.
(Benim şehrim Rashtve ülkem Iranbu ip adresiyle birlikteydi: 2.187.21.235test ederken.)

Yerel olarak çok daha hızlı işleneceği için API yöntemleri yerine veritabanı kullanmanızı öneririm.


-1

Tamam çocuklar, önerileriniz için teşekkürler; IP 6k + var, bazı hizmetler bazı sınırlamalar nedeniyle benim istekleri başarısız olacak; Böylece, hepsini yedek modunda kullanabilirsiniz;

Aşağıdaki biçimde bir kaynak dosyamız varsa:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

Yii için bu basit ifade komutunu (PoC) kullanabilirsiniz.

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

}

Bu bir tür boktan kod, ama işe yarıyor. kullanımı:

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

Kullanmaktan, değiştirmek ve daha iyi yapmaktan çekinmeyin)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.