Ziyaretçilerin IP adreslerinden ülke alması


220

IP üzerinden ziyaretçi ülkesi almak istiyorum ... Şu anda bunu kullanıyorum ( http://api.hostip.info/country.php?ip= ......)

İşte benim kod:

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

?>

Peki, düzgün çalışıyor, ama şey şu ki, ABD veya Kanada gibi ülke kodunu döndürür ve ABD veya Kanada gibi tüm ülke adını döndürmez.

Peki, hostip.info'ya bunu sunan iyi bir alternatif var mı?

Sonunda bu iki harfi tüm ülke adına çevirecek bazı kodlar yazabileceğimi biliyorum, ama tüm ülkeleri içeren bir kod yazmak için çok tembelim ...

Not: Bazı nedenlerden dolayı, herhangi bir hazır CSV dosyası veya bu bilgiyi benim için yakalayacak herhangi bir kod, ip2country hazır kod ve CSV gibi bir şey kullanmak istemiyorum.


20
Tembel olmayın, pek çok ülke yok ve ülke adlarına FIPS 2 harf kodları için bir çeviri tablosu elde etmek çok zor değil.
Chris Henry

Maxmind geoip özelliğini kullanın. Sonuçlara ülke adını dahil edecektir. maxmind.com/app/php
Tchoupi

İçin ilk atamanız $real_ip_addressher zaman yok sayılır. Her neyse, X-Forwarded-ForHTTP üstbilgisinin kolayca taklit edilebileceğini ve www.hidemyass.com
Walter Tross

5
IPLocate.io ücretsiz bir API sağlar: https://www.iplocate.io/api/lookup/8.8.8.8- Yasal Uyarı: Bu hizmeti çalıştırın.
ttarik

Ipregistry denemenizi öneririm : api.ipregistry.co/… (feragatname: Hizmeti çalıştırıyorum).
Laurent

Yanıtlar:


495

Bu basit PHP işlevini deneyin.

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

?>

Nasıl kullanılır:

Örnek1: Ziyaretçinin IP adresi ayrıntılarını alın

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

?>

Örnek 2: Herhangi bir IP adresinin ayrıntılarını alın. [IPV4 ve IPV6 desteği]

<?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
neden her ip ile her zaman bilinmeyen alıyorum? , aynı kodu kullandı.
echo_Me

1
Muhtemelen sunucunuz izin vermediği için "Bilinmiyor" alıyorsunuz file_get_contents(). Sadece error_log dosyanızı kontrol edin. Çözüm: cevabımı görün.
Kai Noack

3
ayrıca u
yerel olarak

1
Sonuçları belirli bir süre için önbelleğe almayı unutmayın. Ayrıca, not olarak, herhangi bir veri almak için başka bir web sitesine güvenmemelisiniz, web sitesi kapanabilir, hizmet durabilir, vb. Ve web sitenizde daha fazla ziyaretçi alırsanız, bu hizmet sizi yasaklayabilir.
machineaddict

1
İzleyin: Bu, bir siteyi localhost üzerinde test ederken bir sorundur. Test amacıyla düzeltmenin herhangi bir yolu var mı? Standart 127.0.0.1 localhost IP'sini kullanır
Nick

54

Http://www.geoplugin.net/ adresinden basit bir API kullanabilirsiniz.

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

Kullanılan İşlev

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

Çıktı

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

İle oynayabileceğiniz birçok seçeneğiniz var

Teşekkürler

:)


1
Bu gerçekten havalı. Ancak burada test yaparken aşağıdaki alanlarda değer yoktur "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. Sebebi nedir? Herhangi bir çözümü var mı? Şimdiden teşekkürler
WebDevRon

31

Chandra'nın cevabını denedim ama sunucu yapılandırmam file_get_contents () işlevine izin vermiyor

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

Chandra'nın kodunu değiştirdim, böylece cURL kullanarak böyle sunucular için de çalışır:

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

?>

Umarım yardımcı olur ;-)


2
Sitedeki dokümanlara göre: "Eğer geoplugin.net mükemmel yanıt veriyorsa, o zaman durdu, o zaman dakikada 120 istek ücretsiz arama sınırını aştınız."
Rick Hellewell

Güzel çalıştı. Teşekkürler!
Najeeb


11

MaxMind GeoIP (veya ödemeye hazır değilseniz GeoIPLite) kullanın.

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

@Joyce: Maxmind API ve DB'yi kullanmaya çalıştım, ama neden benim için çalışmadığını bilmiyorum, aslında genel olarak çalışıyor, ancak örneğin bu $ _SERVER ['REMOTE_ADDR'] çalıştırdığımda; bu ip: 10.48.44.43, ama geoip_country_code_by_addr ($ gi, $ ip) içinde kullandığımda, hiçbir şey, herhangi bir fikir döndürür?
mOna

Ayrılmış bir ip adresidir (yerel ağınızdaki dahili ip adresi). Kodu uzak bir sunucuda çalıştırmayı deneyin.
Joyce Babu


10

Code.google'dan php-ip-2-country'a göz atın . Sağladıkları veritabanı günlük olarak güncellenir, bu nedenle kendi SQL sunucunuzu barındırıp barındırmadığınızı kontrol etmek için bir dış sunucuya bağlanmak gerekmez. Yani kodu kullanarak sadece şunu yazmanız gerekir:

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

Örnek Kod (kaynaktan)

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

Çıktı

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
çalışmak için veritabanı bilgileri sağlamalıyız? iyi görünmüyor.
echo_Me

10

Kullanıcı IP adresini kullanarak konumu almak için geobytes.com'u kullanabiliriz

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

bunun gibi veriler döndürür

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
)

Kullanıcı IP'sini alma işlevi

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

Kodunuzu denedim, bu benim için döndürür: Array ([bilinen] => yanlış)
mOna

bunu denediğimde: $ ip = $ _SERVER ["REMOTE_ADDR"]; echo $ ip; döndürür: 10.48.44.43, sorunun ne olduğunu biliyor musunuz? Alspo maxmind geoip kullandım ve geoip_country_name_by_addr ($ gi, $ ip) kullandığımda bana hiçbir şey
döndürmedi

mOna, ip adresinizi döndürür. daha fazla bilgi için pls, kodunuzu paylaşın.
Ram Sharma

Özel ağ için olduğu için bu sorun benim IP ile ilgili bulundu. sonra ifconfig içinde benim gerçek ip fuond ve benim programda kullanılır. o zaman işe yaradı :) Şimdi, benim sorum bu kullanıcılar bana benzer durumda gerçek ip almak nasıl? (yerel ip kullanıyorlarsa) .. Kodumu buraya yazdım: stackoverflow.com/questions/25958564/…
mOna

9

Bu basit bir satır kodunu deneyin, IP uzak adreslerinden ziyaretçi ve ülke ziyaretçileri alacaksınız.

$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

Şuradan bir web hizmeti kullanabilirsiniz:
Php kodunuzda http://ip-api.com adresinden , aşağıdaki işlemleri gerçekleştirin:

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

sorguda başka bilgiler de var:

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',
)

IP-api.com kullanıldı çünkü ISS adını da veriyorlar!
Richard Tinkler

1
Timezone
Roy Shoa

8

Per- topluluğu tarafından tutulan ip-> country veritabanının bakımlı bir düz dosya sürümü var. CPAN

Bu dosyalara erişim bir veri sunucusu gerektirmez ve verilerin kabaca 515k

Higemaru bu verilerle konuşmak için bir PHP sarmalayıcısı yazdı: php-ip-country-fast


6

Bunu yapmanın birçok farklı yolu ...

Çözüm # 1:

Kullanabileceğiniz bir üçüncü taraf hizmeti http://ipinfodb.com'dur . Ana bilgisayar adı, coğrafi konum ve ek bilgiler sağlarlar.

Bir API anahtarı için buraya kaydolun: http://ipinfodb.com/register.php . Bu, kendi sunucularından sonuçları almanıza izin verir, bu olmadan işe yaramaz.

Aşağıdaki PHP kodunu kopyalayın ve yapıştırın:

$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'];

Dezavantaj:

Web sitelerinden alıntılar:

Ücretsiz API'miz, daha düşük doğruluk sağlayan IP2Location Lite sürümünü kullanıyor.

Çözüm # 2:

Bu işlev, http://www.netip.de/ hizmetini kullanarak ülke adını döndürür .

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

Çıktı:

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

3
Web sitelerinden alıntılar: "Günde 1.000 API isteğiyle sınırlısınız. Daha fazla istekte bulunmanız veya SSL desteğine ihtiyacınız varsa, ücretli planlarımıza bakın."
Walter Tross

Kişisel web sitemde kullandım, bu yüzden yayınladım. Bilgi için teşekkür ederim ... fark etmedi.
Gönderiye

@imbondbaby: Merhaba, kodunuzu denedim, ama benim için bunu döndürüyor: Array ([country] => -), bunu yazdırmaya çalıştığımdan beri sorunu anlamıyorum: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; bana bu ipi gösterir: 10.48.44.43, bu ipin neden çalışmadığını anlayamıyorum! Demek istediğim, bu numarayı nereye eklesem, hiçbir ülke geri dönmüyor !!! bana yardım eder misin?
mOna

5

Benim hizmet ipdata.co 5 dilde ülke adını sağlar! Herhangi bir IPv4 veya IPv6 adresinden kuruluş, para birimi, saat dilimi, arama kodu, bayrak, Mobil Operatör verileri, Proxy verileri ve Tor Çıkış Düğümü durum verileri.

Bu cevap, ç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.

Ayrıca her biri saniyede 10.000'den fazla isteği işleyebilen 10 bölge ile son derece ölçeklenebilir!

Seçenekler arasında; İngilizce (en), Almanca (de), Japonca (ja), Fransızca (fr) ve Basitleştirilmiş Çince (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
Allah razı olsun dostum! İstediğimden daha fazlasını aldım! Hızlı soru: bunu eşya için kullanabilir miyim? Demek istediğim, yakın zamanda bırakmayacaksın, değil mi?
Sayed

1
Hiç de değil :) Aslında daha fazla bölge ve daha fazla cila ekliyorum. Sevindim bunu yardım için buldum :)
Jonathan

Çok yardımcı, özel ek params ile, benim için birden fazla sorun çözüldü!
Sayed

3
Olumlu geribildirim için teşekkürler! Böyle bir araç için en yaygın kullanımları etrafında inşa ettim, amaç, coğrafi konum belirlendikten sonra herhangi bir ek işlem yapmak zorunda kalmamaktı, kullanıcılar için bu ödemeyi görmekten mutluluk duyuyordu
Jonathan

4

Bu yeni bir hizmet olup olmadığından emin değilim ama şimdi (2016) php'de en kolay yol geoplugin'in php web hizmetini kullanmaktır: http://www.geoplugin.net/php.gp :

Temel kullanım:

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

Ayrıca hazır bir sınıf sağlarlar: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache


Bir kullanılan elseSONRA elsehataya neden olur. Neyi önlemeye çalıştınız? REMOTE_ADDR her zaman kullanılabilir mi?
AlexioVay

@Vaia - Belki de olmalı ama asla bilemezsin.
billynoah

Bildiğiniz bir durum yok mu?
AlexioVay

2
@Vaia - PHP belgelerinden $_SERVER: "Her web sunucusunun bunlardan herhangi birini sağlayacağının garantisi yoktur; sunucular bazılarını atlayabilir veya burada listelenmeyen diğerlerini sağlayabilir."
billynoah

1
İsteklerde bir sınır olduğunu unutmayın; "geoplugin.net mükemmel yanıt verdiyse, sonra durduysanız, o zaman dakikada 120 istek ücretsiz arama sınırını aştınız."
Rick Hellewell

2

Ben kullanıyorum ipinfodb.comAPI ve tam olarak aradığınızı alıyorum.

Tamamen ücretsiz, sadece api anahtarınızı almak için onlarla kayıt olmanız gerekir. Web sitelerinden indirerek php sınıflarını dahil edebilir veya bilgi almak için url biçimini kullanabilirsiniz.

İşte yaptığım şey:

Ben onların php sınıf benim komut dosyası ve aşağıdaki kodu kullanarak dahil:

$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'];

Bu kadar.


2

ip adresi ayrıntılarını almak için http://ipinfo.io/ kullanabilirsiniz Kullanımı kolay.

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

127.0.0.1Ziyaretçiler değiştirin IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Kurulum talimatları burada ve Şehir, Eyalet, Ülke, Boylam, Enlem, vb.


Lütfen yalnızca sabit bağlantılardan daha fazla gerçek kod sağlayın.
Bram Vanroy

Bağlantıdan sonraki haberler: "2 Ocak 2019 itibariyle Maxmind, tüm bu örneklerde kullandığımız orijinal GeoLite veritabanlarını durdurdu. Duyurunun tamamını buradan okuyabilirsiniz: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell


2

Bir projede kullandığım kısa bir cevabım var. Cevabımda, ziyaretçi IP adresiniz olduğunu düşünüyorum.

$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

Bunun eski olduğunu biliyorum, ama burada birkaç başka çözüm denedim ve eski ya da sadece null dönüyor gibi görünüyor. İşte böyle yaptım.

http://www.geoplugin.net/json.gp?ip=Bunu kullanmak , herhangi bir kayıt veya hizmet için herhangi bir ödeme gerektirmez.

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

Ve bu konuda ek bilgi istiyorsanız, Json'un tam dönüşü:

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

"Chandra Nakka" cevabına dayalı bir ders yazdım. İnşallah insanların bilgiyi geoplugin'den bir oturuma kaydetmesine yardımcı olabilir, böylece bilgileri hatırlarken yük çok daha hızlıdır. Ayrıca değerleri özel bir diziye kaydeder, böylece aynı kodda geri çağırma olabildiğince hızlıdır.

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

'Op' sorusunu bu sınıfla cevaplayarak arayabilirsiniz

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

Ve mevcut diğer özellikler:

$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'));

Geri dönen

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

Kullanıcı Ülke API tam olarak neye ihtiyacınız vardır. Başlangıçta yaptığınız gibi file_get_contents () yöntemini kullanan örnek bir kod:

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

1
Bu API günde 100 (ücretsiz) API çağrısına izin verir.
reform

0

İpstack geo API'sını kullanarak ziyaretçilerin ülke ve şehir bilgilerini alabilirsiniz. Kendi ipstack API'nizi almanız ve ardından aşağıdaki kodu kullanmanız gerekir:

<?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 ."";
?>

Kaynak: ipstack API'sını kullanarak ziyaretçileri PHP'de ülke ve şehir edinin


0

Bu, yalnızcaget_client_ip() buradaki yanıtların çoğunun ana işlevinin içine dahil edildiğinin işlevselliği hakkında bir güvenlik notudur .get_geo_info_for_this_ip() .

Gibi istek başlıklarına İP verilerinin çok fazla itimat etmeyin Client-IPveya X-Forwarded-Forancak aslında bizim sunucu ile istemci arasındaki kurulur TCP bağlantısının kaynağı IP güvenmek gerektiğini, bunlar çok kolay taklit edilebilir, çünkü $_SERVER['REMOTE_ADDR']olarak 'elinden sahte olmak

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

Sahte IP'nin ülkesini almakta sorun yoktur, ancak bu IP'yi herhangi bir güvenlik modelinde kullanmanın (örneğin: sık istek gönderen IP'nin yasaklanması) tüm güvenlik modelini yok edeceğini unutmayın. IMHO Proxy sunucusunun IP'si olsa bile gerçek istemci IP'sini kullanmayı tercih ederim.


0

Deneyin

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

  ?>

İf-else bölümü size ziyaretçinin IP adresini verir ve sonraki bölüm ülke kodunu döndürür. Api.wipmania.com adresini ve ardından api.wipmania.com/[your_IP_address]
Dipanshu Mahla

0

Herhangi bir IP adresinin tam ülke adlarını ve şehir adlarını sağlayan hizmetimi kullanabilirsiniz: https://SmartIP.io . Ayrıca zaman dilimleri, para birimi, proxy algılama, TOR düğümleri algılama ve Kripto algılama özelliklerini de açığa çıkarıyoruz.

Kaydolmanız ve ayda 250.000 istek sağlayan ücretsiz bir API anahtarı almanız yeterlidir.

Resmi PHP kütüphanesini kullanarak, API çağrısı şöyle olur:

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

Daha fazla bilgi için API belgelerine bakın: https://smartip.io/docs


0

2019 itibariyle, MaxMind country DB aşağıdaki gibi kullanılabilir:

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

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


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.