Abrufen des Standorts von einer IP-Adresse


205

Ich möchte Informationen wie Stadt, Bundesland und Land eines Besuchers von seiner IP-Adresse abrufen, damit ich meine Webseite an ihren Standort anpassen kann. Gibt es eine gute und zuverlässige Möglichkeit, dies in PHP zu tun? Ich verwende JavaScript für clientseitiges Scripting, PHP für serverseitiges Scripting und MySQL für die Datenbank.


Dies ist so ziemlich ein Duplikat von stackoverflow.com/questions/348614/… .
Charlie Martin

Antworten:


255

Sie können eine kostenlose GeoIP-Datenbank herunterladen und die IP-Adresse lokal nachschlagen, oder Sie können einen Drittanbieter-Service verwenden und eine Remote-Suche durchführen. Dies ist die einfachere Option, da keine Einrichtung erforderlich ist, jedoch eine zusätzliche Latenz entsteht.

Ein Drittanbieter-Service, den Sie verwenden können, ist meiner, http://ipinfo.io . Sie bieten Hostnamen, Geolocation, Netzwerkbesitzer und zusätzliche Informationen, z.

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

Hier ist ein PHP-Beispiel:

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

Sie können es auch clientseitig verwenden. Hier ist ein einfaches jQuery-Beispiel:

$.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
Möglicherweise möchten Sie sicherstellen, dass Sie am Ende der URL einen JSON hinzufügen, um sicherzustellen, dass Sie JSON anstelle der vollständigen Webseite zurückerhalten. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax Das ist es nicht, denn dann wäre es unmöglich, die Serverantwort zu analysieren.
Ja͢ck

3
Scheint kein sehr zuverlässiger Service zu sein. Ich bekomme nullmeinen Städtenamen. Es ist nicht wie eine kleine Stadt oder so, aber es konnte es immer noch nicht finden. Wenn es in den USA nicht gut funktioniert, bezweifle ich, wie oft es auch außerhalb der USA null zurückgibt.
Derek 7 會 功夫

2
das Ergebnis ist nicht genau .. Region, Stadt Post
Mark Gerryl Mirandilla

2
WARNUNG: Ab Januar 2019 berichteten einige Leute, dass diese IPinfo- URL aufgrund von Trojanern auf Virustotal nicht sicher ist. Die Stimmen waren zwischen 2015 und 2018
Ricardo

55

Ich dachte, ich würde posten, da anscheinend niemand Informationen zu dieser bestimmten API gegeben hat, aber sie gibt genau das zurück, wonach ich suche, und Sie können sie in mehreren Formaten zurückgeben json, xml and csv.

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

Dies gibt Ihnen alle Dinge, die Sie möglicherweise wollen könnten:

{
      "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 funktioniert nicht. Gibt es einen anderen Weg?
Adi

Entschuldigung im Moment nicht, aber das ist eine Schande, da dies der Dienst ist, den ich auf meinen Live-Sites verwende. Hoffen
wir,

2
Meistens unten und gibt selten eine Region oder Stadt
Rahul aman

2
Tonys Dienst bei Azure scheint schnell und zuverlässig zu funktionieren: freegeoip2
Gustav

1
Leider wird dieser Dienst am 1. Juli 2018 gemäß der folgenden Meldung getrennt: "Dieser API-Endpunkt ist veraltet und funktioniert am 1. Juli 2018 nicht mehr. Weitere Informationen finden Sie unter: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Ein reines Javascript-Beispiel mit den Diensten von https://geolocation-db.com Sie bieten eine JSON- und JSONP-Rückruflösung.

Keine jQuery erforderlich!

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

Gibt es eine Beschränkung in Bezug auf die Verwendung von https://geoilocation-db.comAPI?
Priyanka Sharma

16

Verwenden von 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

Was ist mit der Qualität dieser Google APIS IP-Geolokalisierung? (ist es oder irre ich mich?) im Vergleich zu anderen Diensten wie ipinfo.io ?
Basj

Ich habe ~ 30 Personen in verschiedenen Städten gefragt, und die IP-Geolokalisierungsqualität von Google APIS ist im Vergleich zu ipinfo.io
Basj

1
@Basj Google API funktioniert wie ein Zauber, während ipinfo.io zeigt, dass ich in den USA bin, während ich tatsächlich in Mitteleuropa bin
patryk

15

Sie müssen einen externen Dienst verwenden, z. B. http://www.hostip.info/. Wenn Sie bei der Google-Suche nach "Geo-IP" suchen, erhalten Sie weitere Ergebnisse.

Die Host-IP-API basiert auf HTTP, sodass Sie sie je nach Bedarf entweder in PHP oder JavaScript verwenden können.


6
Ich benutze hostip.info seit einem Jahr und bin NICHT beeindruckt. Es gibt normalerweise unbekannte 9/10 Schecks zurück
aron

stimmte zu, es sagt mir, dass ich in Woking lebe ... Fairerweise hat es das GB-bisschen richtig gemacht ... Aber ich bin in London.
Jamie Hutber

2
Denken Sie daran, dass jeder Dienst nur so gut sein wird wie die verfügbaren öffentlichen Informationen / Daten. Aus Datenschutzgründen können diese Informationen nur "so gut" sein. Wenn es Ihr Land richtig macht und zumindest in der Nähe des Staates / der Provinz liegt, würde ich das als GEWINN betrachten. Wenn Sie dies verwenden, um Informationen für einen DOS-Angriff nachzuschlagen, denken Sie daran, dass die IPs möglicherweise nicht einmal gültig sind (niemandem zugewiesen oder außerhalb eines gültigen öffentlichen IP-Bereichs).
Eselk

Auf ihrer Website bekomme ich "Ort: ... eigentlich haben wir keine Ahnung.". Alles was ich wissen musste
Bojan Kogoj

15

Ich habe einen Bot mit einer API von ipapi.co geschrieben. So erhalten Sie den Speicherort für eine IP-Adresse (z. B. 1.2.3.4) in php:

Kopfzeile setzen:

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

JSON-Antwort abrufen

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

von erhalten ein bestimmtes Feld (Land, Zeitzone usw.)

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

1
@Eoin Entfernte es. Es sieht so aus, als ob die IP von phpfiddle eingeschränkt ist.
Jaimes

10

Diese Frage ist geschützt, was ich verstehe. Allerdings sehe ich hier keine Antwort. Ich sehe, dass viele Leute zeigen, was sie sich aus derselben Frage ausgedacht haben.

Derzeit gibt es fünf regionale Internetregister mit unterschiedlichem Funktionsumfang, die als erste Anlaufstelle für die Inhaberschaft von geistigem Eigentum dienen. Der Prozess ist im Fluss, weshalb die verschiedenen Dienste hier manchmal funktionieren und zu anderen Zeiten nicht.

Who Is ist jedoch (offensichtlich) ein altes TCP-Protokoll - ursprünglich funktionierte es über die Verbindung zu Port 43, was es problematisch macht, es über geleaste Verbindungen, über Firewalls usw. weiterzuleiten.

In diesem Moment haben die meisten Who Is über RESTful HTTP und ARIN, RIPE und APNIC RESTful-Dienste, die funktionieren. LACNIC gibt einen 503 zurück und AfriNIC hat anscheinend keine solche API. (Alle haben jedoch Online-Dienste.)

Damit erhalten Sie - die Adresse des registrierten IP-Eigentümers, aber - nicht den Standort Ihres Kunden - müssen Sie diese von ihm erhalten und müssen auch danach fragen. Außerdem sind Proxys die geringste Sorge bei der Validierung der IP, von der Sie glauben, dass sie der Urheber ist.

Die Leute schätzen die Vorstellung, dass sie verfolgt werden, nicht, also - meine Gedanken sind - holen Sie sie direkt und mit ihrer Erlaubnis von Ihrem Kunden und erwarten, dass viel gegen die Vorstellung verstößt.


8

Schauen Sie sich die API von hostip.info an - sie enthält viele Informationen.
Beispiel in 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...

Wenn Sie hostip.info vertrauen, scheint dies eine sehr nützliche API zu sein.


1
unf. im Vergleich zu anderen Diensten ist HostIP waaaay off .. www.ip-adress.com nagelt es jedoch
Scott Evernden

8

Der Service in der Antwort von Ben Dowling hat sich geändert und ist jetzt einfacher. Um den Standort zu finden, gehen Sie einfach wie folgt vor:

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

Die Koordinaten kehren in einer einzelnen Zeichenfolge wie '31, -80 'zurück, sodass Sie von dort aus einfach:

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

4
Sie haben Recht, dass ipinfo.io standardmäßig die Details für die IP des Anrufers zurückgibt . Wenn Sie eine PHP-Website betreiben, ist dies jedoch die IP Ihres Servers und nicht die IP des Benutzers. Aus diesem Grund müssen Sie $ _SERVER ['REMOTE_ADDR'] übergeben. Wenn Sie nur Koordinaten möchten, können Sie die URL schneller anhängen / lokalisieren, um auch nur dieses Feld zu erhalten.
Ben Dowling

Ah, das stimmt! Und ich wusste nichts über die / loc - ich werde das sofort auf meiner eigenen Seite beheben.
Isaac Askew

7

Angenommen, Sie möchten dies selbst tun und sich nicht auf andere Anbieter verlassen, bietet IP2Nation eine MySQL-Datenbank mit den Zuordnungen, die aktualisiert werden, wenn die regionalen Register Änderungen vornehmen .


Ich nutzte einen externen Dienst und plötzlich wurde meine Website sehr langsam. Der externe Dienst brauchte gut 20 Sekunden, um die Informationen zurückzusenden - was für Besucher offensichtlich katastrophal ist. Also habe ich beschlossen, es selbst zu tun, und dies ist eine perfekte Lösung. Vielen Dank.
Williamz902

7

Ich führe den Dienst auf IPLocate.io aus , in den Sie sich mit einem einfachen Anruf kostenlos einbinden können:

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

Das $resObjekt enthält Ihre Geolocation - Felder mögen country, cityusw.

Weitere Informationen finden Sie in den Dokumenten .


7

Ich mag die kostenlose GeoLite City von Maxmind, die für die meisten Anwendungen funktioniert und von der Sie auf eine kostenpflichtige Version upgraden können, wenn sie nicht präzise genug ist. Es gibt eine PHP-API sowie für andere Sprachen. Und wenn Sie Lighttpd als Webserver ausführen, können Sie sogar ein Modul verwenden , um die Informationen in der SERVER-Variablen für jeden Besucher abzurufen, wenn Sie dies benötigen.

Ich sollte hinzufügen, dass es auch ein kostenloses Geolite-Land (das schneller wäre, wenn Sie die Stadt, aus der die IP stammt, nicht genau bestimmen muss) und Geolite-Lieferavis (wenn Sie wissen möchten, wem die IP gehört) gibt, und dass dies schließlich alles ist Sie können auf Ihren eigenen Server heruntergeladen werden, werden jeden Monat aktualisiert und können mit den bereitgestellten APIs schnell nachgeschlagen werden, da sie "Tausende von Suchvorgängen pro Sekunde" angeben.


1
Sie können die kostenlose IP2Location LITE lite.ip2location.com in Betracht ziehen . Es enthält bis zu Postleitzahlinformationen, was sehr nützlich ist.
Michael C.

6

PHP hat dafür eine Erweiterung.

Von PHP.net:

Mit der GeoIP-Erweiterung können Sie den Speicherort einer IP-Adresse ermitteln. Stadt, Bundesland, Land, Längengrad, Breitengrad und andere Informationen wie ISP und Verbindungstyp können mithilfe von GeoIP abgerufen werden.

Beispielsweise:

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

3
Dies ist nur ein PHP-Modul für die MaxMind-Datenbank, bei der es sich um Payware handelt. (Kostenlose "Lite" -Versionen sind sehr ungenau.) Nicht zu sagen, dass es eine schlechte Sache ist, aber es ist wirklich nur für kommerzielle Zwecke nützlich.
Jemand

6

Ipdata.co ist eine schnelle, hochverfügbare IP-Geolocation-API mit zuverlässiger Leistung.

Es ist extrem skalierbar mit 10 Endpunkten auf der ganzen Welt, die jeweils> 10.000 Anfragen pro Sekunde verarbeiten können!

Diese Antwort verwendet einen 'Test'-API-Schlüssel, der sehr begrenzt ist und nur zum Testen einiger Aufrufe gedacht ist. Melden Sie sich für Ihren eigenen kostenlosen API-Schlüssel an und erhalten Sie täglich bis zu 1500 Anfragen für die Entwicklung.

In 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

Hier ist ein clientseitiges Beispiel, das zeigt, wie Sie das Land, die Region und die Stadt erhalten.

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

Haftungsausschluss;

Ich habe den Service aufgebaut.

Beispiele in mehreren Sprachen finden Sie in den Dokumenten

Sehen Sie sich auch diese detaillierte Analyse der besten IP-Geolocation-APIs an.


5

Falls jemand auf diesen Thread stößt, ist hier eine andere Lösung. Bei timezoneapi.io können Sie eine IP-Adresse anfordern und mehrere Objekte zurückerhalten (ich habe den Dienst erstellt). Es wurde erstellt, weil ich wissen musste, in welcher Zeitzone sich meine Benutzer befanden, wo auf der Welt und wie spät es derzeit ist.

In PHP - gibt Ort, Zeitzone und Datum / Uhrzeit zurück:

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

}

Verwenden von 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

Das Folgende ist eine modifizierte Version eines gefundenen Snippets, das http://ipinfodb.com/ip_locator.php verwendet , um seine Informationen abzurufen . Beachten Sie, dass Sie bei ihnen auch einen API-Schlüssel beantragen und die API direkt verwenden können, um die bereitgestellten Informationen zu erhalten, wie Sie es für richtig halten.

Snippet

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

Benutzen

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

Wenn Sie den Standort von einer IP-Adresse abrufen möchten, können Sie einen zuverlässigen Geo-IP-Dienst verwenden. Weitere Informationen erhalten Sie hier . Es unterstützt IPv6.

Als Bonus kann überprüft werden, ob es sich bei der IP-Adresse um einen Tor-Knoten, einen öffentlichen Proxy oder einen Spammer handelt.

Sie können Javascript oder PHP wie unten verwenden.

Javascript Code:

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

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

Ausgabe:

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

Ich habe einen Wrapper für ipinfo.io erstellt . Sie können es mit Composer installieren.

Sie können es folgendermaßen verwenden:

$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

Sie können auch den Dienst "smart-ip" verwenden:

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

2

Ich habe eine Reihe von Tests mit IP-Adressdiensten durchgeführt und hier einige Möglichkeiten, wie ich es selbst mache. Zunächst eine Reihe von Links zu nützlichen Websites, die ich verwende:

https://db-ip.com/db Verfügt über einen kostenlosen IP-Suchdienst und einige kostenlose CSV-Dateien, die Sie herunterladen können. Dies verwendet einen kostenlosen API-Schlüssel, der an Ihre E-Mail angehängt ist. Es ist auf 2000 Abfragen pro Tag begrenzt.

http://ipinfo.io/ Kostenloser IP-Suchdienst ohne PHP-Funktionen mit API-Schlüssel:

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

Am Ende bekommst du so etwas:

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/ Etwas älter, aber dieser Service bietet Ihnen eine Reihe zusätzlicher nützlicher Informationen wie die Landeswährung, den Kontinentcode, den Längengrad und vieles mehr.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Bietet eine Reihe herunterladbarer Dateien mit Anweisungen zum Importieren in Ihre Datenbank. Sobald Sie eine dieser Dateien in Ihrer Datenbank haben, können Sie die Daten ziemlich einfach auswählen.

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

Verwenden Sie die PHP-Funktion ip2long (); um die IP-Adresse in einen numerischen Wert umzuwandeln. Beispiel: 1.1.1.1 wird zu 16843009. Auf diese Weise können Sie nach den IP-Bereichen suchen, die Ihnen von der Datenbankdatei zugewiesen wurden.

Um herauszufinden, wo 1.1.1.1 zu allem gehört, führen wir diese Abfrage aus:

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

Dies gibt diese Daten als Beispiel zurück.

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

2

Es gibt zwei allgemeine Ansätze für die Durchführung der IP-Geolokalisierung: Einer besteht darin, ein Dataset herunterzuladen, es in Ihrer Infrastruktur zu hosten und es auf dem neuesten Stand zu halten. Dies erfordert Zeit und Mühe, insbesondere wenn Sie eine große Anzahl von Anforderungen unterstützen müssen. Eine andere Lösung besteht darin, einen vorhandenen API-Dienst zu verwenden, der die gesamte Arbeit für Sie und mehr verwaltet.

Es gibt viele API-Geolocation-Dienste: Maxmind, Ip2location, Ipstack, IpInfo usw. Vor kurzem hat das Unternehmen, für das ich arbeite, auf Ipregistry ( https://ipregistry.co ) umgestellt und war am Entscheidungs- und Implementierungsprozess beteiligt. Hier sind einige Elemente, die Sie bei der Suche nach einer IP-Geolocation-API berücksichtigen sollten:

  • Ist der Service korrekt? Verwenden sie eine einzige Informationsquelle?
  • Können sie wirklich mit Ihrer Ladung umgehen?
  • Bieten sie weltweit konsistente und schnelle Antwortzeiten (außer wenn Ihre Benutzer länderspezifisch sind)?
  • Was ist ihr Preismodell?

Hier ist ein Beispiel zum Abrufen von IP-Geolokalisierungsinformationen (aber auch Bedrohungs- und Benutzeragentendaten mit einem Anruf):

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

Hinweis: Ich bin nicht hier, um für Ipregistry zu werben und zu sagen, dass es das Beste ist, aber ich habe lange Zeit damit verbracht, vorhandene Lösungen zu analysieren, und ihre Lösung ist wirklich vielversprechend.


-1

Wenn Sie nach einer aktualisierten / genauen Datenbank suchen, empfehle ich diese hier zu verwenden, da sie meinen genauen Standort anzeigt, der beim Testen nicht in vielen anderen Diensten enthalten war.
(Meine Stadt war Rashtund mein Land war Iranmit dieser IP-Adresse: 2.187.21.235als ich testete.)

Ich empfehle, anstelle von API-Methoden eine Datenbank zu verwenden, da diese lokal viel schneller verarbeitet wird.


-1

Ok, Leute, danke für eure Vorschläge; Während ich mehr als 6.000 IPs habe, sind einige Dienste aufgrund einiger Einschränkungen bei meinen Anforderungen fehlgeschlagen. Sie können sie also alle im Fallback-Modus verwenden.

Wenn wir eine Quelldatei mit folgendem Format haben:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

als Sie diesen einfachen Expample-Befehl (PoC) für Yii verwenden könnten:

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

}

Dies ist eine Art Shitty-Code, aber es funktioniert. Verwendung:

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

Fühlen Sie sich frei, es zu verwenden, zu modifizieren und es besser zu machen)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.