Das Land der Besucher von ihrem geistigen Eigentum abrufen


220

Ich möchte das Land der Besucher über ihre IP erhalten ... Im Moment benutze ich dies ( http://api.hostip.info/country.php?ip= ......)

Hier ist mein Code:

<?php

if (isset($_SERVER['HTTP_CLIENT_IP']))
{
    $real_ip_adress = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $real_ip_adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
    $real_ip_adress = $_SERVER['REMOTE_ADDR'];
}

$cip = $real_ip_adress;
$iptolocation = 'http://api.hostip.info/country.php?ip=' . $cip;
$creatorlocation = file_get_contents($iptolocation);

?>

Nun, es funktioniert einwandfrei, aber die Sache ist, dass dies den Ländercode wie USA oder CA zurückgibt und nicht den gesamten Ländernamen wie USA oder Kanada.

Gibt es eine gute Alternative zu hostip.info?

Ich weiß, dass ich nur einen Code schreiben kann, der diese beiden Buchstaben schließlich in einen ganzen Ländernamen umwandelt, aber ich bin einfach zu faul, um einen Code zu schreiben, der alle Länder enthält ...

PS: Aus irgendeinem Grund möchte ich keine vorgefertigte CSV-Datei oder keinen Code verwenden, der diese Informationen für mich abruft, so etwas wie vorgefertigten ip2country-Code und CSV.


20
Seien Sie nicht faul, es gibt nicht so viele Länder, und es ist nicht allzu schwierig, eine Übersetzungstabelle für FIPS 2-Buchstabencodes zu Ländernamen zu erhalten.
Chris Henry

Verwenden Sie die Maxmind-Geoip-Funktion. Der Ländername wird in die Ergebnisse aufgenommen. maxmind.com/app/php
Tchoupi

Ihre erste Zuordnung zu $real_ip_addresswird immer ignoriert. Denken Sie jedoch daran, dass der X-Forwarded-ForHTTP-Header extrem leicht gefälscht werden kann und dass es Proxys wie www.hidemyass.com
Walter Tross gibt,

5
IPLocate.io bietet eine kostenlose API: https://www.iplocate.io/api/lookup/8.8.8.8- Haftungsausschluss: Ich führe diesen Dienst aus.
Ttarik

Ich schlage vor, Ipregistry auszuprobieren : api.ipregistry.co/… (Haftungsausschluss: Ich führe den Dienst aus).
Laurent

Antworten:


495

Probieren Sie diese einfache PHP-Funktion aus.

<?php

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

?>

Wie benutzt man:

Beispiel 1: Abrufen der IP-Adressdaten des Besuchers

<?php

echo ip_info("Visitor", "Country"); // India
echo ip_info("Visitor", "Country Code"); // IN
echo ip_info("Visitor", "State"); // Andhra Pradesh
echo ip_info("Visitor", "City"); // Proddatur
echo ip_info("Visitor", "Address"); // Proddatur, Andhra Pradesh, India

print_r(ip_info("Visitor", "Location")); // Array ( [city] => Proddatur [state] => Andhra Pradesh [country] => India [country_code] => IN [continent] => Asia [continent_code] => AS )

?>

Beispiel 2: Details zu einer beliebigen IP-Adresse abrufen. [IPV4 & IPV6 unterstützen]

<?php

echo ip_info("173.252.110.27", "Country"); // United States
echo ip_info("173.252.110.27", "Country Code"); // US
echo ip_info("173.252.110.27", "State"); // California
echo ip_info("173.252.110.27", "City"); // Menlo Park
echo ip_info("173.252.110.27", "Address"); // Menlo Park, California, United States

print_r(ip_info("173.252.110.27", "Location")); // Array ( [city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA )

?>

1
Warum werde ich die ganze Zeit mit jeder IP unbekannt? , verwendete den gleichen Code.
echo_Me

1
Sie erhalten wahrscheinlich "Unbekannt", weil Ihr Server dies nicht zulässt file_get_contents(). Überprüfen Sie einfach Ihre error_log-Datei. Problemumgehung: Siehe meine Antwort.
Kai Noack

3
es könnte auch sein, dass du es lokal überprüfst (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni

1
Denken Sie daran, die Ergebnisse für einen definierten Zeitraum zwischenzuspeichern. Außerdem sollten Sie sich niemals auf eine andere Website verlassen, um Daten zu erhalten, die Website könnte ausfallen, der Dienst könnte eingestellt werden usw. Und wenn Sie eine erhöhte Anzahl von Besuchern auf Ihrer Website erhalten, könnte dieser Dienst Sie verbieten.
Machineaddict

1
Folgen Sie: Dies ist ein Problem beim Testen einer Site auf localhost. Gibt es eine Möglichkeit, dies zu Testzwecken zu beheben? Verwendet die Standard 127.0.0.1 localhost IP
Nick

54

Sie können eine einfache API von http://www.geoplugin.net/ verwenden.

$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".getRealIpAddr());
echo $xml->geoplugin_countryName ;


echo "<pre>";
foreach ($xml as $key => $value)
{
    echo $key , "= " , $value ,  " \n" ;
}
echo "</pre>";

Verwendete Funktion

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

Ausgabe

United States
geoplugin_city= San Antonio
geoplugin_region= TX
geoplugin_areaCode= 210
geoplugin_dmaCode= 641
geoplugin_countryCode= US
geoplugin_countryName= United States
geoplugin_continentCode= NA
geoplugin_latitude= 29.488899230957
geoplugin_longitude= -98.398696899414
geoplugin_regionCode= TX
geoplugin_regionName= Texas
geoplugin_currencyCode= USD
geoplugin_currencySymbol= $
geoplugin_currencyConverter= 1

Sie haben so viele Möglichkeiten, mit denen Sie herumspielen können

Vielen Dank

:) :)


1
Das ist wirklich cool. Beim Testen werden hier jedoch keine Werte in den folgenden Feldern angezeigt: "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName". Was ist der Grund? Gibt es eine Lösung? Vielen Dank im Voraus
WebDevRon

31

Ich habe Chandras Antwort versucht, aber meine Serverkonfiguration erlaubt file_get_contents () nicht

PHP Warning: file_get_contents() URL file-access is disabled in the server configuration

Ich habe Chandras Code so geändert, dass er auch für solche Server mit cURL funktioniert:

function ip_visitor_country()
{

    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    $country  = "Unknown";

    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $ip_data_in = curl_exec($ch); // string
    curl_close($ch);

    $ip_data = json_decode($ip_data_in,true);
    $ip_data = str_replace('&quot;', '"', $ip_data); // for PHP 5.2 see stackoverflow.com/questions/3110487/

    if($ip_data && $ip_data['geoplugin_countryName'] != null) {
        $country = $ip_data['geoplugin_countryName'];
    }

    return 'IP: '.$ip.' # Country: '.$country;
}

echo ip_visitor_country(); // output Coutry name

?>

Hoffentlich hilft das ;-)


1
Laut den Dokumenten auf ihrer Website: "Wenn geoplugin.net perfekt reagiert und dann gestoppt hat, haben Sie das kostenlose Suchlimit von 120 Anfragen pro Minute überschritten."
Rick Hellewell

Hat wunderbar funktioniert. Vielen Dank!
Najeeb


11

Verwenden Sie MaxMind GeoIP (oder GeoIPLite, wenn Sie nicht bereit sind zu zahlen).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);

@Joyce: Ich habe versucht, Maxmind API und DB zu verwenden, aber ich weiß nicht, warum es bei mir nicht funktioniert, eigentlich funktioniert es im Allgemeinen, aber zum Beispiel, wenn ich dieses $ _SERVER ['REMOTE_ADDR'] ausführe; es zeigt mir diese IP: 10.48.44.43, aber wenn ich sie in geoip_country_code_by_addr ($ gi, $ ip) verwende, gibt sie nichts zurück, irgendeine Idee?
Montag,

Es ist eine reservierte IP-Adresse (interne IP-Adresse von Ihrem lokalen Netzwerk). Versuchen Sie, den Code auf einem Remote-Server auszuführen.
Joyce Babu


10

Schauen Sie sich php-ip-2-country von code.google an. Die von ihnen bereitgestellte Datenbank wird täglich aktualisiert, sodass keine Verbindung zu einem externen Server hergestellt werden muss, um zu überprüfen, ob Sie Ihren eigenen SQL Server hosten. Mit dem Code müssten Sie also nur Folgendes eingeben:

<?php
$ip = $_SERVER['REMOTE_ADDR'];

if(!empty($ip)){
        require('./phpip2country.class.php');

        /**
         * Newest data (SQL) avaliable on project website
         * @link http://code.google.com/p/php-ip-2-country/
         */
        $dbConfigArray = array(
                'host' => 'localhost', //example host name
                'port' => 3306, //3306 -default mysql port number
                'dbName' => 'ip_to_country', //example db name
                'dbUserName' => 'ip_to_country', //example user name
                'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
                'tableName' => 'ip_to_country', //example table name
        );

        $phpIp2Country = new phpIp2Country($ip,$dbConfigArray);
        $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
        echo $country;
?>

Beispielcode (aus der Ressource)

<?
require('phpip2country.class.php');

$dbConfigArray = array(
        'host' => 'localhost', //example host name
        'port' => 3306, //3306 -default mysql port number
        'dbName' => 'ip_to_country', //example db name
        'dbUserName' => 'ip_to_country', //example user name
        'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
        'tableName' => 'ip_to_country', //example table name
);

$phpIp2Country = new phpIp2Country('213.180.138.148',$dbConfigArray);

print_r($phpIp2Country->getInfo(IP_INFO));
?>

Ausgabe

Array
(
    [IP_FROM] => 3585376256
    [IP_TO] => 3585384447
    [REGISTRY] => RIPE
    [ASSIGNED] => 948758400
    [CTRY] => PL
    [CNTRY] => POL
    [COUNTRY] => POLAND
    [IP_STR] => 213.180.138.148
    [IP_VALUE] => 3585378964
    [IP_FROM_STR] => 127.255.255.255
    [IP_TO_STR] => 127.255.255.255
)

4
müssen wir Datenbankinformationen bereitstellen, um zu arbeiten? scheint nicht gut zu sein.
Echo_Me

10

Wir können geobytes.com verwenden, um den Standort mithilfe der Benutzer-IP-Adresse abzurufen

$user_ip = getIP();
$meta_tags = get_meta_tags('http://www.geobytes.com/IPLocator.htm?GetLocation&template=php3.txt&IPAddress=' . $user_ip);
echo '<pre>';
print_r($meta_tags);

Es werden Daten wie diese zurückgegeben

Array(
    [known] => true
    [locationcode] => USCALANG
    [fips104] => US
    [iso2] => US
    [iso3] => USA
    [ison] => 840
    [internet] => US
    [countryid] => 254
    [country] => United States
    [regionid] => 126
    [region] => California
    [regioncode] => CA
    [adm1code] =>     
    [cityid] => 7275
    [city] => Los Angeles
    [latitude] => 34.0452
    [longitude] => -118.2840
    [timezone] => -08:00
    [certainty] => 53
    [mapbytesremaining] => Free
)

Funktion zum Abrufen der Benutzer-IP

function getIP(){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $pattern = "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/";
    if(preg_match($pattern, $_SERVER["HTTP_X_FORWARDED_FOR"])){
            $userIP = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }else{
            $userIP = $_SERVER["REMOTE_ADDR"];
    }
}
else{
  $userIP = $_SERVER["REMOTE_ADDR"];
}
return $userIP;
}

Ich habe Ihren Code ausprobiert, er gibt dies für mich zurück: Array ([bekannt] => false)
mOna

wenn ich das versuche: $ ip = $ _SERVER ["REMOTE_ADDR"]; echo $ ip; es gibt es zurück: 10.48.44.43, wissen Sie, was das Problem ist? Ich habe alspo maxmind geoip verwendet, und als ich geoip_country_name_by_addr ($ gi, $ ip) wieder verwendet habe, hat es mir nichts zurückgegeben ...
mOna

@mOna, es gibt Ihre IP-Adresse zurück. Für weitere Informationen teilen Sie bitte Ihren Code.
Ram Sharma

Ich habe festgestellt, dass das Problem auf meine IP übertragen wird, da es sich um ein privates Netzwerk handelt. dann habe ich meine echte ip in ifconfig gefunden und in meinem programm verwendet. dann hat es geklappt :) Nun ist meine Frage, wie man bei ähnlichen Benutzern, die mir ähnlich sind, eine echte IP-Adresse erhält. (wenn sie lokale IP verwenden) .. Ich schrieb meinen Code hier: stackoverflow.com/questions/25958564/…
mOna

9

Probieren Sie diesen einfachen einzeiligen Code aus. Sie erhalten Land und Stadt der Besucher von ihrer IP-Remote-Adresse.

$tags = get_meta_tags('http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=' . $_SERVER['REMOTE_ADDR']);
echo $tags['country'];
echo $tags['city'];

9

Sie können einen Webdienst von http://ip-api.com
in Ihrem PHP-Code verwenden, gehen Sie wie folgt vor:

<?php
$ip = $_REQUEST['REMOTE_ADDR']; // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
  echo 'Hello visitor from '.$query['country'].', '.$query['city'].'!';
} else {
  echo 'Unable to get location';
}
?>

Die Abfrage enthält viele weitere Informationen:

array (
  'status'      => 'success',
  'country'     => 'COUNTRY',
  'countryCode' => 'COUNTRY CODE',
  'region'      => 'REGION CODE',
  'regionName'  => 'REGION NAME',
  'city'        => 'CITY',
  'zip'         => ZIP CODE,
  'lat'         => LATITUDE,
  'lon'         => LONGITUDE,
  'timezone'    => 'TIME ZONE',
  'isp'         => 'ISP NAME',
  'org'         => 'ORGANIZATION NAME',
  'as'          => 'AS NUMBER / NAME',
  'query'       => 'IP ADDRESS USED FOR QUERY',
)

Verwendet ip-api.com, weil sie auch ISP-Namen liefern!
Richard Tinkler

1
Ich habe verwendet, weil sie auch die Zeitzone liefern
Roy Shoa

8

Es gibt eine gut gepflegte Flat-File-Version der IP-> Länderdatenbank, die von der Perl-Community bei CPAN verwaltet wird

Für den Zugriff auf diese Dateien ist kein Datenserver erforderlich, und die Daten selbst sind ungefähr 515 KB groß

Higemaru hat einen PHP-Wrapper geschrieben, um mit diesen Daten zu kommunizieren: php-ip-country-fast


6

Viele verschiedene Möglichkeiten ...

Lösung 1:

Ein Drittanbieter-Service, den Sie verwenden können, ist http://ipinfodb.com . Sie bieten Hostnamen, Geolocation und zusätzliche Informationen.

Registrieren Sie sich hier für einen API-Schlüssel: http://ipinfodb.com/register.php . Auf diese Weise können Sie Ergebnisse von ihrem Server abrufen, ohne dies funktioniert es nicht.

Kopieren Sie den folgenden PHP-Code und fügen Sie ihn ein:

$ipaddress = $_SERVER['REMOTE_ADDR'];
$api_key = 'YOUR_API_KEY_HERE';

$data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ipaddress&format=json");
$data = json_decode($data);
$country = $data['Country'];

Nachteil:

Zitat von ihrer Website:

Unsere kostenlose API verwendet die IP2Location Lite-Version, die eine geringere Genauigkeit bietet.

Lösung 2:

Diese Funktion gibt den Ländernamen über den Dienst http://www.netip.de/ zurück.

$ipaddress = $_SERVER['REMOTE_ADDR'];
function geoCheckIP($ip)
{
    $response=@file_get_contents('http://www.netip.de/search?query='.$ip);

    $patterns=array();
    $patterns["country"] = '#Country: (.*?)&nbsp;#i';

    $ipInfo=array();

    foreach ($patterns as $key => $pattern)
    {
        $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
    }

        return $ipInfo;
}

print_r(geoCheckIP($ipaddress));

Ausgabe:

Array ( [country] => DE - Germany )  // Full Country Name

3
Zitat von ihrer Website: "Sie sind auf 1.000 API-Anfragen pro Tag beschränkt. Wenn Sie weitere Anfragen stellen müssen oder SSL-Unterstützung benötigen, lesen Sie unsere kostenpflichtigen Pläne."
Walter Tross

Ich habe es auf meiner persönlichen Website verwendet, deshalb habe ich es veröffentlicht. Danke für die Info ... habe es nicht bemerkt. Ich habe viel mehr Mühe auf den Beitrag gelegt, also siehe den aktualisierten Beitrag :)
imbondbaby

@imbondbaby: Hallo, ich habe Ihren Code ausprobiert, aber für mich gibt er Folgendes zurück: Array ([country] => -), ich verstehe das Problem nicht, da ich versuche, dies zu drucken: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; es zeigt mir diese IP: 10.48.44.43, ich kann nicht verstehen, warum diese IP nicht funktioniert! Ich meine, wo immer ich diese Nummer eingebe, gibt es kein Land zurück !!! Counld u PLZ mir helfen?
Montag,

5

Mein Dienst ipdata.co bietet den Ländernamen in 5 Sprachen! Ebenso wie Organisation, Währung, Zeitzone, Anrufcode, Flagge, Mobilfunkanbieter-Daten, Proxy-Daten und Statusdaten des Tor-Exit-Knotens von einer beliebigen IPv4- oder IPv6-Adresse.

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.

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

Die Optionen umfassen; Englisch (en), Deutsch (de), Japanisch (ja), Französisch (fr) und vereinfachtes Chinesisch (za-CH)

$ip = '74.125.230.195';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
echo $details->country_name;
//United States
echo $details->city;
//Mountain View
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test/zh-CN"));
echo $details->country_name;
//美国

1
Gott segne dich, Mann! Ich habe mehr als ich verlangt habe! Kurze Frage: Kann ich es für Produkte verwenden? Ich meine, du wirst es nicht so schnell ablegen, oder?
Sagte

1
Überhaupt nicht :) Ich füge tatsächlich mehr Regionen und mehr Politur hinzu. Ich bin froh, dass Sie dies als hilfreich empfunden haben :)
Jonathan

Sehr hilfreich, besonders mit den zusätzlichen Parametern, hat mehr als ein Problem für mich gelöst!
Sagte

3
Danke für das positive Feedback! Ich habe mich um die häufigsten Verwendungszwecke für ein solches Tool gekümmert. Das Ziel war es, zu vermeiden, dass nach der Geolokalisierung zusätzliche Verarbeitungen durchgeführt werden müssen. Ich bin froh, dass sich dies für die Benutzer auszahlt
Jonathan,

4

Ich bin mir nicht sicher, ob dies ein neuer Dienst ist, aber jetzt (2016) ist der einfachste Weg in PHP, den PHP-Webdienst von Geoplugin zu verwenden: http://www.geoplugin.net/php.gp :

Grundlegende Verwendung:

// GET IP ADDRESS
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (!empty($_SERVER['REMOTE_ADDR'])) {
    $ip = $_SERVER['REMOTE_ADDR'];
} else {
    $ip = false;
}

// CALL THE WEBSERVICE
$ip_info = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip));

Sie bieten auch eine vorgefertigte Klasse: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache


Sie haben ein verwendet, elsenach elsedem ein Fehler verursacht wird. Was haben Sie versucht zu verhindern? REMOTE_ADDR sollte jederzeit verfügbar sein?
AlexioVay

@ Vaia - Vielleicht sollte es sein, aber du weißt es nie.
Billynoah

Gibt es einen Fall, in dem es nicht verfügbar ist, von dem Sie wissen?
AlexioVay

2
@Vaia - aus den PHP-Dokumenten $_SERVER: "Es gibt keine Garantie dafür, dass jeder Webserver diese bereitstellt. Server können einige weglassen oder andere bereitstellen, die hier nicht aufgeführt sind."
Billynoah

1
Beachten Sie, dass Anfragen begrenzt sind. von ihrer Website: "Wenn geoplugin.net perfekt reagiert und dann gestoppt hat, haben Sie das kostenlose Suchlimit von 120 Anfragen pro Minute überschritten."
Rick Hellewell

2

Ich benutze ipinfodb.comAPI und bekomme genau das, wonach Sie suchen.

Es ist völlig kostenlos, Sie müssen sich nur bei ihnen registrieren, um Ihren API-Schlüssel zu erhalten. Sie können ihre PHP-Klasse durch Herunterladen von ihrer Website einschließen oder das URL-Format verwenden, um Informationen abzurufen.

Folgendes mache ich:

Ich habe ihre PHP-Klasse in mein Skript aufgenommen und den folgenden Code verwendet:

$ipLite = new ip2location_lite;
$ipLite->setKey('your_api_key');
if(!$_COOKIE["visitorCity"]){ //I am using cookie to store information
  $visitorCity = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
  if ($visitorCity['statusCode'] == 'OK') {
    $data = base64_encode(serialize($visitorCity));
    setcookie("visitorCity", $data, time()+3600*24*7); //set cookie for 1 week
  }
}
$visitorCity = unserialize(base64_decode($_COOKIE["visitorCity"]));
echo $visitorCity['countryName'].' Region'.$visitorCity['regionName'];

Das ist es.


2

Sie können http://ipinfo.io/ verwenden , um Details zur IP-Adresse zu erhalten. Es ist einfach zu bedienen.

<?php
    function ip_details($ip)
    {
    $json = file_get_contents("http://ipinfo.io/{$ip}");
    $details = json_decode($json);
    return $details;
    }

    $details = ip_details(YoUR IP ADDRESS); 

    echo $details->city;
    echo "<br>".$details->country; 
    echo "<br>".$details->org; 
    echo "<br>".$details->hostname; /

    ?>

2

Durch 127.0.0.1Besucher ersetzen IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Installationsanweisungen finden Sie hier . Lesen Sie diese, um zu erfahren, wie Sie Stadt, Bundesland, Land, Längengrad, Breitengrad usw. erhalten.


Bitte geben Sie mehr aktuellen Code als nur Hardlinks an.
Bram Vanroy

Spätere Nachrichten aus dem Link: "Am 2. Januar 2019 hat Maxmind die ursprünglichen GeoLite-Datenbanken eingestellt, die wir in all diesen Beispielen verwendet haben. Die vollständige Ankündigung finden Sie hier: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell


2

Ich habe eine kurze Antwort, die ich in einem Projekt verwendet habe. In meiner Antwort gehe ich davon aus, dass Sie eine Besucher-IP-Adresse haben.

$ip = "202.142.178.220";
$ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
//get ISO2 country code
if(property_exists($ipdat, 'geoplugin_countryCode')) {
    echo $ipdat->geoplugin_countryCode;
}
//get country full name
if(property_exists($ipdat, 'geoplugin_countryName')) {
    echo $ipdat->geoplugin_countryName;
}

1

Ich weiß, dass dies alt ist, aber ich habe hier ein paar andere Lösungen ausprobiert und sie scheinen veraltet zu sein oder geben einfach null zurück. So habe ich es gemacht.

Für die Verwendung http://www.geoplugin.net/json.gp?ip=ist keine Anmeldung oder Bezahlung des Dienstes erforderlich.

function get_client_ip_server() {
  $ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
  $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
  $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
  $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
  $ipaddress = $_SERVER['REMOTE_ADDR'];
else
  $ipaddress = 'UNKNOWN';

  return $ipaddress;
}

$ipaddress = get_client_ip_server();

function getCountry($ip){
    $curlSession = curl_init();
    curl_setopt($curlSession, CURLOPT_URL, 'http://www.geoplugin.net/json.gp?ip='.$ip);
    curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

    $jsonData = json_decode(curl_exec($curlSession));
    curl_close($curlSession);

    return $jsonData->geoplugin_countryCode;
}

echo "County: " .getCountry($ipaddress);

Und wenn Sie zusätzliche Informationen darüber wünschen, ist dies eine vollständige Rückgabe von Json:

{
  "geoplugin_request":"IP_ADDRESS",
  "geoplugin_status":200,
  "geoplugin_delay":"2ms",
  "geoplugin_credit":"Some of the returned data includes GeoLite data created by MaxMind, available from <a href='http:\/\/www.maxmind.com'>http:\/\/www.maxmind.com<\/a>.",
  "geoplugin_city":"Current City",
  "geoplugin_region":"Region",
  "geoplugin_regionCode":"Region Code",
  "geoplugin_regionName":"Region Name",
  "geoplugin_areaCode":"",
  "geoplugin_dmaCode":"650",
  "geoplugin_countryCode":"US",
  "geoplugin_countryName":"United States",
  "geoplugin_inEU":0,
  "geoplugin_euVATrate":false,
  "geoplugin_continentCode":"NA",
  "geoplugin_continentName":"North America",
  "geoplugin_latitude":"37.5563",
  "geoplugin_longitude":"-99.9413",
  "geoplugin_locationAccuracyRadius":"5",
  "geoplugin_timezone":"America\/Chicago",
  "geoplugin_currencyCode":"USD",
  "geoplugin_currencySymbol":"$",
  "geoplugin_currencySymbol_UTF8":"$",
  "geoplugin_currencyConverter":1
}

1

Ich habe eine Klasse geschrieben, die auf der Antwort "Chandra Nakka" basiert. Hoffentlich kann es den Leuten helfen, die Informationen von Geoplugin in einer Sitzung zu speichern, sodass das Laden beim Abrufen der Informationen viel schneller ist. Außerdem werden die Werte in einem privaten Array gespeichert, sodass das Abrufen im selben Code am schnellsten ist.

class Geo {
private $_ip = null;
private $_useSession = true;
private $_sessionNameData = 'GEO_SESSION_DATA';
private $_hasError = false;
private $_geoData = [];

const PURPOSE_SUPPORT = [
    "all", "*", "location",
    "request",
    "latitude", 
    "longitude",
    "accuracy",
    "timezonde",
    "currencycode",
    "currencysymbol",
    "currencysymbolutf8",
    "country", 
    "countrycode", 
    "state", "region", 
    "city", 
    "address",
    "continent", 
    "continentcode"
];
const CONTINENTS = [
    "AF" => "Africa",
    "AN" => "Antarctica",
    "AS" => "Asia",
    "EU" => "Europe",
    "OC" => "Australia (Oceania)",
    "NA" => "North America",
    "SA" => "South America"
];

function __construct($ip = null, $deepDetect = true, $useSession = true)
{
    // define the session useage within this class
    $this->_useSession = $useSession;
    $this->_startSession();

    // define a ip as far as possible
    $this->_ip = $this->_defineIP($ip, $deepDetect);

    // check if the ip was set
    if (!$this->_ip) {
        $this->_hasError = true;
        return $this;
    }

    // define the geoData
    $this->_geoData = $this->_fetchGeoData();

    return $this;
}

function get($purpose)
{
    // making sure its lowercase
    $purpose = strtolower($purpose);

    // makeing sure there are no error and the geodata is not empty
    if ($this->_hasError || !count($this->_geoData) && !in_array($purpose, self::PURPOSE_SUPPORT)) {
        return 'error';
    }

    if (in_array($purpose, ['*', 'all', 'location']))  {
        return $this->_geoData;
    }

    if ($purpose === 'state') $purpose = 'region';

    return (isset($this->_geoData[$purpose]) ? $this->_geoData[$purpose] : 'missing: '.$purpose);
}

private function _fetchGeoData()
{
    // check if geo data was set before
    if (count($this->_geoData)) {
        return $this->_geoData;
    }

    // check possible session
    if ($this->_useSession && ($sessionData = $this->_getSession($this->_sessionNameData))) {
        return $sessionData;
    }

    // making sure we have a valid ip
    if (!$this->_ip || $this->_ip === '127.0.0.1') {
        return [];
    }

    // fetch the information from geoplusing
    $ipdata = @json_decode($this->curl("http://www.geoplugin.net/json.gp?ip=" . $this->_ip));

    // check if the data was fetched
    if (!@strlen(trim($ipdata->geoplugin_countryCode)) === 2) {
        return [];
    }

    // make a address array
    $address = [$ipdata->geoplugin_countryName];
    if (@strlen($ipdata->geoplugin_regionName) >= 1)
        $address[] = $ipdata->geoplugin_regionName;
    if (@strlen($ipdata->geoplugin_city) >= 1)
        $address[] = $ipdata->geoplugin_city;

    // makeing sure the continentCode is upper case
    $continentCode = strtoupper(@$ipdata->geoplugin_continentCode);

    $geoData = [
        'request' => @$ipdata->geoplugin_request,
        'latitude' => @$ipdata->geoplugin_latitude,
        'longitude' => @$ipdata->geoplugin_longitude,
        'accuracy' => @$ipdata->geoplugin_locationAccuracyRadius,
        'timezonde' => @$ipdata->geoplugin_timezone,
        'currencycode' => @$ipdata->geoplugin_currencyCode,
        'currencysymbol' => @$ipdata->geoplugin_currencySymbol,
        'currencysymbolutf8' => @$ipdata->geoplugin_currencySymbol_UTF8,
        'city' => @$ipdata->geoplugin_city,
        'region' => @$ipdata->geoplugin_regionName,
        'country' => @$ipdata->geoplugin_countryName,
        'countrycode' => @$ipdata->geoplugin_countryCode,
        'continent' => self::CONTINENTS[$continentCode],
        'continentcode' => $continentCode,
        'address' => implode(", ", array_reverse($address))
    ];

    if ($this->_useSession) {
        $this->_setSession($this->_sessionNameData, $geoData);
    }

    return $geoData;
}

private function _startSession()
{
    // only start a new session when the status is 'none' and the class
    // requires a session
    if ($this->_useSession && session_status() === PHP_SESSION_NONE) {
        session_start();
    }
}

private function _defineIP($ip, $deepDetect)
{
    // check if the ip was set before
    if ($this->_ip) {
        return $this->_ip;
    }

    // check if the ip given is valid
    if (filter_var($ip, FILTER_VALIDATE_IP)) {
        return $ip;
    }

    // try to get the ip from the REMOTE_ADDR
    $ip = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);

    // check if we need to end the search for a IP if the REMOTE_ADDR did not
    // return a valid and the deepDetect is false
    if (!$deepDetect) {
        return $ip;
    }

    // try to get the ip from HTTP_X_FORWARDED_FOR
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    // try to get the ip from the HTTP_CLIENT_IP
    if (($ip = filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP', FILTER_VALIDATE_IP))) {
        return $ip;
    }

    return $ip;
}

private function _hasSession($key, $filter = FILTER_DEFAULT) 
{
    return (isset($_SESSION[$key]) ? (bool)filter_var($_SESSION[$key], $filter) : false);
}

private function _getSession($key, $filter = FILTER_DEFAULT)
{
    if ($this->_hasSession($key, $filter)) {
        $value = filter_var($_SESSION[$key], $filter);

        if (@json_decode($value)) {
            return json_decode($value, true);
        }

        return filter_var($_SESSION[$key], $filter);
    } else {
        return false;
    }
}

private function _setSession($key, $value) 
{
    if (is_array($value)) {
        $value = json_encode($value);
    }

    $_SESSION[$key] = $value;
}

function emptySession($key) {
    if (!$this->_hasSession($key)) {
        return;
    }

    $_SESSION[$key] = null;
    unset($_SESSION[$key]);

}

function curl($url) 
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
}

Beantworten Sie die 'op'-Frage mit dieser Klasse, die Sie anrufen können

$country = (new \Geo())->get('country'); // United Kingdom

Und die anderen verfügbaren Eigenschaften sind:

$geo = new \Geo('185.35.50.4');
var_dump($geo->get('*')); // allias all / location
var_dump($geo->get('country'));
var_dump($geo->get('countrycode'));
var_dump($geo->get('state')); // allias region
var_dump($geo->get('city')); 
var_dump($geo->get('address')); 
var_dump($geo->get('continent')); 
var_dump($geo->get('continentcode'));   
var_dump($geo->get('request'));
var_dump($geo->get('latitude'));
var_dump($geo->get('longitude'));
var_dump($geo->get('accuracy'));
var_dump($geo->get('timezonde'));
var_dump($geo->get('currencyCode'));
var_dump($geo->get('currencySymbol'));
var_dump($geo->get('currencySymbolUTF8'));

Rückkehr

array(15) {
  ["request"]=>
  string(11) "185.35.50.4"
  ["latitude"]=>
  string(7) "51.4439"
  ["longitude"]=>
  string(7) "-0.1854"
  ["accuracy"]=>
  string(2) "50"
  ["timezonde"]=>
  string(13) "Europe/London"
  ["currencycode"]=>
  string(3) "GBP"
  ["currencysymbol"]=>
  string(2) "£"
  ["currencysymbolutf8"]=>
  string(2) "£"
  ["city"]=>
  string(10) "Wandsworth"
  ["region"]=>
  string(10) "Wandsworth"
  ["country"]=>
  string(14) "United Kingdom"
  ["countrycode"]=>
  string(2) "GB"
  ["continent"]=>
  string(6) "Europe"
  ["continentcode"]=>
  string(2) "EU"
  ["address"]=>
  string(38) "Wandsworth, Wandsworth, United Kingdom"
}
string(14) "United Kingdom"
string(2) "GB"
string(10) "Wandsworth"
string(10) "Wandsworth"
string(38) "Wandsworth, Wandsworth, United Kingdom"
string(6) "Europe"
string(2) "EU"
string(11) "185.35.50.4"
string(7) "51.4439"
string(7) "-0.1854"
string(2) "50"
string(13) "Europe/London"
string(3) "GBP"
string(2) "£"
string(2) "£"

0

Die User Country API hat genau das, was Sie brauchen. Hier ist ein Beispielcode, der file_get_contents () wie ursprünglich verwendet:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need

1
Diese API ermöglicht 100 (kostenlose) API-Aufrufe pro Tag.
Reformiert

0

Mit der ipstack-Geo-API können Sie Land und Stadt der Besucher ermitteln. Sie müssen Ihre eigene ipstack-API erwerben und dann den folgenden Code verwenden:

<?php
 $ip = $_SERVER['REMOTE_ADDR']; 
 $api_key = "YOUR_API_KEY";
 $freegeoipjson = file_get_contents("http://api.ipstack.com/".$ip."?access_key=".$api_key."");
 $jsondata = json_decode($freegeoipjson);
 $countryfromip = $jsondata->country_name;
 echo "Country: ". $countryfromip ."";
?>

Quelle: Holen Sie sich Besucher Land und Stadt in PHP mit der ipstack API


0

Dies ist nur ein Sicherheitshinweis zur Funktionalität get_client_ip(), da die meisten Antworten hier in der Hauptfunktion von enthalten sind get_geo_info_for_this_ip().

Verlassen Sie sich nicht zu sehr auf den IP - Daten in den Request - Header wie Client-IPoder X-Forwarded-Forweil sie sehr leicht gefälscht werden können, aber Sie sollten auf dem Quell - IP der TCP - Verbindung angewiesen , die tatsächlich zwischen unserem Server und dem Client eingerichtet wird , $_SERVER['REMOTE_ADDR']wie er kann‘ nicht gefälscht werden

$_SERVER['HTTP_CLIENT_IP'] // can be spoofed 
$_SERVER['HTTP_X_FORWARDED_FOR'] // can be spoofed 
$_SERVER['REMOTE_ADDR']// can't be spoofed 

Es ist in Ordnung, das Land der gefälschten IP zu ermitteln. Beachten Sie jedoch, dass die Verwendung dieser IP in einem Sicherheitsmodell (z. B. Verbot der IP, die häufige Anforderungen sendet) das gesamte Sicherheitsmodell zerstört. IMHO Ich bevorzuge es, die tatsächliche Client-IP zu verwenden, auch wenn es die IP des Proxyservers ist.


0

Versuchen

  <?php
  //gives you the IP address of the visitors
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
      $ip = $_SERVER['HTTP_CLIENT_IP'];}
  else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
      $ip = $_SERVER['REMOTE_ADDR'];
  }

  //return the country code
  $url = "http://api.wipmania.com/$ip";
  $country = file_get_contents($url);
  echo $country;

  ?>

Der if-else-Teil gibt Ihnen die IP-Adresse des Besuchers und der nächste Teil gibt den Ländercode zurück. Versuchen Sie, api.wipmania.com und dann api.wipmania.com/[your_IP_address]
Dipanshu Mahla

0

Sie können meinen Dienst nutzen: https://SmartIP.io , der vollständige Ländernamen und Städtenamen aller IP-Adressen enthält. Wir legen auch Zeitzonen, Währung, Proxy-Erkennung, TOR-Knoten-Erkennung und Krypto-Erkennung offen.

Sie müssen sich nur anmelden und einen kostenlosen API-Schlüssel erhalten, der 250.000 Anfragen pro Monat ermöglicht.

Unter Verwendung der offiziellen PHP-Bibliothek wird der API-Aufruf zu:

$apiKey = "your API key";
$smartIp = new SmartIP($apiKey);
$response = $smartIp->requestIPData("8.8.8.8");

echo "\nstatus code: " . $response->{"status-code"};
echo "\ncountry name: " . $response->country->{"country-name"};

Weitere Informationen finden Sie in der API-Dokumentation: https://smartip.io/docs


0

Ab 2019 kann die MaxMind-Länder-DB wie folgt verwendet werden:

<?php
require_once 'vendor/autoload.php';
use MaxMind\Db\Reader;
$databaseFile = 'GeoIP2-Country.mmdb';
$reader = new Reader($databaseFile);
$cc = $reader->get($_SERVER['REMOTE_ADDR'])['country']['iso_code'] # US/GB...
$reader->close();

Quelle: https://github.com/maxmind/MaxMind-DB-Reader-php


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.