Mendapatkan negara pengunjung dari IP mereka

220

Saya ingin mendapatkan pengunjung negara melalui IP mereka ... Saat ini saya sedang menggunakan ini ( http://api.hostip.info/country.php?ip= ......)

Ini kode saya:

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

?>

Yah, itu berfungsi dengan baik, tetapi masalahnya, ini mengembalikan kode negara seperti AS atau CA, dan bukan seluruh nama negara seperti Amerika Serikat atau Kanada.

Jadi, apakah ada alternatif yang bagus untuk hostip.info menawarkan ini?

Saya tahu bahwa saya hanya dapat menulis beberapa kode yang pada akhirnya akan mengubah dua huruf ini menjadi nama seluruh negara, tetapi saya terlalu malas untuk menulis kode yang berisi semua negara ...

PS: Untuk beberapa alasan saya tidak ingin menggunakan file CSV siap pakai atau kode apa pun yang akan mengambil informasi ini untuk saya, sesuatu seperti ip2country kode siap pakai dan CSV.

Alex C.
sumber
20
Jangan malas, tidak banyak negara, dan tidak terlalu sulit untuk mendapatkan tabel terjemahan untuk kode huruf FIPS 2 ke nama negara.
Chris Henry
Gunakan fitur geoip Maxmind. Ini akan memasukkan nama negara dalam hasil. maxmind.com/app/php
Tchoupi
Tugas pertama Anda untuk $real_ip_addressselalu diabaikan. X-Forwarded-ForNgomong-ngomong , ingatlah bahwa tajuk HTTP bisa dengan sangat mudah dipalsukan, dan ada proxy seperti www.hidemyass.com
Walter Tross
5
IPLocate.io menyediakan API gratis: https://www.iplocate.io/api/lookup/8.8.8.8- Penafian: Saya menjalankan layanan ini.
ttarik
Saya sarankan mencoba Ipregistry : api.ipregistry.co/… (disclaimer: Saya menjalankan layanan).
Laurent

Jawaban:

495

Coba fungsi PHP sederhana ini.

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

?>

Cara Penggunaan:

Contoh1: Dapatkan detail alamat IP pengunjung

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

?>

Contoh 2: Dapatkan detail alamat IP apa pun. [Mendukung IPV4 & IPV6]

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

?>
Chandra Nakka
sumber
1
mengapa saya mendapatkan ketidaktahuan setiap saat dengan setiap ip? , menggunakan kode yang sama.
echo_Me
1
Anda mendapatkan "Tidak Dikenal" mungkin karena server Anda tidak mengizinkan file_get_contents(). Periksa saja file error_log Anda. Penanganan masalah: lihat jawaban saya.
Kai Noack
3
juga mungkin karena Anda memeriksanya di tempat (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni
1
Ingatlah untuk menyimpan hasil untuk periode yang ditentukan. Juga, sebagai catatan, Anda tidak boleh bergantung pada situs web lain untuk mendapatkan data apa pun, situs web mungkin turun, layanan bisa berhenti, dll. Dan jika Anda mendapatkan peningkatan jumlah pengunjung di situs web Anda, layanan ini dapat mencekal Anda.
machineaddict
1
Ikuti pada: ini adalah masalah ketika menguji situs di localhost. Adakah cara untuk memperbaikinya untuk tujuan pengujian? Menggunakan localhost IP standar 127.0.0.1
Nick
54

Anda dapat menggunakan API sederhana dari http://www.geoplugin.net/

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

Fungsi yang digunakan

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

Keluaran

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

Itu membuat Anda memiliki begitu banyak opsi yang dapat Anda mainkan

Terima kasih

:)

Baba
sumber
1
Itu keren sekali. Tetapi sementara pengujian di sini tidak ada nilai dalam bidang berikut "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName" .. Apa alasannya? Apakah ada solusi? Terima kasih sebelumnya
WebDevRon
31

Saya mencoba jawaban Chandra tetapi konfigurasi server saya tidak mengizinkan file_get_contents ()

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

Saya memodifikasi kode Chandra sehingga juga berfungsi untuk server seperti itu menggunakan cURL:

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

?>

Semoga itu bisa membantu ;-)

Kai Noack
sumber
2
Menurut dokumen di situs mereka: "Jika geoplugin.net merespons dengan sempurna, lalu berhenti, maka Anda telah melampaui batas pencarian gratis sebanyak 120 permintaan per menit."
Rick Hellewell
Bekerja dengan indah. Terima kasih!
Najeeb
11

Gunakan MaxMind GeoIP (atau GeoIPLite jika Anda belum siap membayar).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
Joyce Babu
sumber
@Joyce: Saya mencoba menggunakan Maxmind API dan DB, tapi saya tidak tahu mengapa itu tidak bekerja untuk saya, sebenarnya itu bekerja secara umum, tetapi misalnya ketika saya menjalankan $ _SERVER ['REMOTE_ADDR'] ini; ini menunjukkan kepada saya ip ini: 10.48.44.43, tetapi ketika saya menggunakannya di geoip_country_code_by_addr ($ gi, $ ip), ia tidak menghasilkan apa-apa, ada ide?
mOna
Ini adalah alamat ip yang dicadangkan (alamat ip internal dari jaringan lokal Anda). Coba jalankan kode pada server jarak jauh.
Joyce Babu
10

Lihat php-ip-2-negara dari code.google. Database yang mereka sediakan diperbarui setiap hari, jadi tidak perlu untuk terhubung ke server luar untuk memeriksa apakah Anda meng-host server SQL Anda sendiri. Jadi dengan menggunakan kode Anda hanya perlu mengetik:

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

Kode Contoh (dari sumber)

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

Keluaran

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
)
AbsoluteƵERØ
sumber
4
kita harus memberikan informasi basis data agar berfungsi? sepertinya tidak baik.
echo_Me
10

Kita dapat menggunakan geobytes.com untuk mendapatkan lokasi menggunakan alamat IP pengguna

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

itu akan mengembalikan data seperti ini

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
)

Berfungsi untuk mendapatkan IP pengguna

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;
}
Ram Sharma
sumber
Saya mencoba kode Anda, mengembalikan ini untuk saya: Array ([dikenal] => salah)
mOna
ketika saya mencoba ini: $ ip = $ _SERVER ["REMOTE_ADDR"]; gema $ ip; mengembalikannya: 10.48.44.43, apakah Anda tahu apa masalahnya ?? Saya menggunakan alspo maxmind geoip, dan ketika saya menggunakan geoip_country_name_by_addr ($ gi, $ ip) lagi tidak mengembalikan apa-apa ...
mOna
@mOna, itu mengembalikan alamat ip Anda. untuk lebih jelasnya, bagikan kode Anda.
Ram Sharma
Saya menemukan masalah yang berkaitan dengan ip saya karena itu untuk jaringan pribadi. lalu saya menyembunyikan ip asli saya di ifconfig dan menggunakannya dalam program saya. kemudian berhasil :) Sekarang, pertanyaan saya adalah bagaimana cara mendapatkan ip nyata jika ada pengguna yang mirip dengan saya? (jika mereka menggunakan ip lokal) .. Saya menulis kode saya di sini: stackoverflow.com/questions/25958564/…
mOna
9

Coba kode satu baris sederhana ini, Anda akan mendapatkan negara dan kota pengunjung dari alamat ip jarak jauh mereka.

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

Anda dapat menggunakan layanan web dari http://ip-api.com
dalam kode php Anda, lakukan sebagai berikut:

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

pertanyaan memiliki banyak informasi lain:

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',
)
Halayem Anis
sumber
Digunakan ip-api.com karena mereka juga menyediakan nama ISP!
Richard Tinkler
1
Saya Digunakan karena mereka juga memasok Timezone
Roy Shoa
8

Ada versi flat-file terpelihara dengan baik dari database ip-> country yang dikelola oleh komunitas Perl di CPAN

Akses ke file-file itu tidak memerlukan server data, dan data itu sendiri kira-kira 515k

Higemaru telah menulis bungkus PHP untuk berbicara dengan data itu: php-ip-country-fast

djsadinoff
sumber
6

Banyak cara berbeda untuk melakukannya ...

Solusi # 1:

Satu layanan pihak ketiga yang dapat Anda gunakan adalah http://ipinfodb.com . Mereka memberikan nama host, geolokasi dan informasi tambahan.

Daftarkan kunci API di sini: http://ipinfodb.com/register.php . Ini akan memungkinkan Anda untuk mengambil hasil dari server mereka, tanpa ini tidak akan berfungsi.

Salin dan lewati kode PHP berikut:

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

Kelemahan:

Mengutip dari situs web mereka:

API gratis kami menggunakan versi IP2Location Lite yang memberikan akurasi lebih rendah.

Solusi # 2:

Fungsi ini akan mengembalikan nama negara menggunakan layanan http://www.netip.de/ .

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

Keluaran:

Array ( [country] => DE - Germany )  // Full Country Name
imbondbaby
sumber
3
Mengutip dari situs web mereka: "Anda dibatasi hingga 1.000 permintaan API per hari. Jika Anda perlu membuat lebih banyak permintaan, atau memerlukan dukungan SSL, lihat paket berbayar kami."
Walter Tross
Saya menggunakannya di situs web pribadi saya jadi itu sebabnya saya mempostingnya. Terima kasih atas informasinya ... tidak menyadarinya. Saya berusaha lebih keras pada posting, jadi silakan lihat posting yang diperbarui :)
imbondbaby
@imbondbaby: Hai, saya mencoba kode Anda, tetapi bagi saya itu mengembalikan ini: Array ([negara] => -), saya tidak mengerti masalah karena ketika saya mencoba untuk mencetak ini: $ ipaddress = $ _SERVER ['REMOTE_ADDR' ]; ini menunjukkan ip ini kepada saya: 10.48.44.43, saya tidak mengerti mengapa ip ini tidak berfungsi! Maksud saya di mana pun saya memasukkan nomor ini, itu tidak mengembalikan negara mana pun !!! bisa tolong bantu saya?
mOna
5

Layanan saya ipdata.co memberikan nama negara dalam 5 bahasa! Serta organisasi, mata uang, zona waktu, kode panggilan, bendera, data Operator Seluler, data proksi dan data status Tor Exit Node dari alamat IPv4 atau IPv6.

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

Ini juga sangat terukur dengan 10 wilayah di dunia yang masing-masing mampu menangani> 10.000 permintaan per detik!

Pilihannya meliputi; Bahasa Inggris (en), Jerman (de), Jepang (ja), Prancis (fr) dan Cina Sederhana (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;
//美国
Jonathan
sumber
1
Tuhan memberkatimu, kawan! Saya mendapat lebih dari yang saya minta! Pertanyaan cepat: dapatkah saya menggunakannya untuk prod? Maksudku, kamu tidak akan meletakkannya dalam waktu dekat, kan?
Sayed
1
Tidak sama sekali :) Saya sebenarnya menambahkan lebih banyak wilayah dan lebih banyak polandia. Senang Anda menemukan ini membantu :)
Jonathan
Sangat membantu, khususnya dengan params tambahan, memecahkan lebih dari satu masalah bagi saya!
Sayed
3
Terima kasih atas umpan balik positif! Saya membangun di sekitar usecases paling umum untuk alat seperti itu, tujuannya adalah untuk menghilangkan keharusan melakukan pemrosesan tambahan setelah geolokasi, senang melihat ini membayar untuk pengguna
Jonathan
4

Tidak yakin apakah ini layanan baru tapi sekarang (2016) cara termudah di php adalah menggunakan layanan web php geoplugin: http://www.geoplugin.net/php.gp :

Penggunaan dasar:

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

Mereka juga menyediakan kelas siap pakai: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache

billynoah
sumber
Anda menggunakan elsesetelah elseyang menyebabkan kesalahan. Apa yang Anda coba cegah? REMOTE_ADDR harus tersedia setiap saat?
AlexioVay
@Vaia - Mungkin seharusnya begitu tetapi Anda tidak pernah tahu.
billynoah
Apakah ada kasus di mana itu tidak tersedia, Anda tahu?
AlexioVay
2
@Vaia - dari dokumen PHP pada $_SERVER: "Tidak ada jaminan bahwa setiap server web akan menyediakan semua ini; server dapat menghilangkan sebagian, atau menyediakan yang lain yang tidak tercantum di sini."
billynoah
1
Perhatikan ada batas permintaan; dari situs mereka: "Jika geoplugin.net merespons dengan sempurna, lalu berhenti, maka Anda telah melampaui batas pencarian gratis sebanyak 120 permintaan per menit."
Rick Hellewell
2

Saya menggunakan ipinfodb.comapi dan mendapatkan apa yang Anda cari.

Benar-benar gratis, Anda hanya perlu mendaftar dengan mereka untuk mendapatkan kunci api Anda. Anda dapat memasukkan kelas php mereka dengan mengunduh dari situs web mereka atau Anda dapat menggunakan format url untuk mengambil informasi.

Inilah yang saya lakukan:

Saya menyertakan kelas php mereka dalam skrip saya dan menggunakan kode di bawah ini:

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

Itu dia.

Miraj
sumber
2

Anda dapat menggunakan http://ipinfo.io/ untuk mendapatkan detail alamat ip. Mudah digunakan.

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

    ?>
Aqib1604
sumber
2

Ganti 127.0.0.1dengan pengunjung IpAddress.

$country = geoip_country_name_by_name('127.0.0.1');

Petunjuk pemasangan ada di sini , dan baca ini untuk mengetahui cara memperoleh Kota, Negara, Negara, Bujur, Latitude, dll ...

Jack M.
sumber
Berikan lebih banyak kode aktual daripada hanya tautan keras.
Bram Vanroy
Berita selanjutnya dari tautan: "Pada 2 Januari 2019 Maxmind menghentikan basis data GeoLite asli yang telah kami gunakan dalam semua contoh ini. Anda dapat membaca pengumuman lengkap di sini: support.maxmind.com/geolite-legacy-discontinuation-notice "
Rick Hellewell
2

Saya punya jawaban singkat yang saya gunakan dalam sebuah proyek. Dalam jawaban saya, saya menganggap Anda memiliki alamat IP pengunjung.

$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;
}
Shahbaz
sumber
1

Saya tahu ini sudah tua, tetapi saya mencoba beberapa solusi lain di sini dan mereka tampaknya sudah usang atau hanya mengembalikan nol. Jadi ini yang saya lakukan.

Menggunakan http://www.geoplugin.net/json.gp?ip=yang tidak memerlukan segala jenis mendaftar atau membayar layanan.

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

Dan jika Anda ingin informasi tambahan tentang itu, ini adalah pengembalian penuh 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
}
Jayce
sumber
1

Saya telah menulis sebuah kelas berdasarkan jawaban "Chandra Nakka". Mudah-mudahan ini dapat membantu orang-orang menyimpan informasi dari geoplugin ke sesi sehingga beban lebih cepat ketika mengingat informasi. Ini juga menyimpan nilai-nilai ke array pribadi sehingga mengingat kode yang sama adalah yang tercepat.

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

Menjawab pertanyaan 'op' dengan kelas ini dapat Anda hubungi

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

Dan properti lain yang tersedia adalah:

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

Kembali

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) "£"
royalwebs
sumber
0

The Pengguna Negara API memiliki apa yang Anda butuhkan. Berikut adalah contoh kode menggunakan file_get_contents () seperti yang Anda lakukan:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need
byl83
sumber
1
API ini memungkinkan 100 (gratis) panggilan API per hari.
direformasi
0

Anda bisa mendapatkan pengunjung negara dan kota menggunakan ipstack geo API. Anda harus mendapatkan ipstack API Anda sendiri dan kemudian menggunakan kode di bawah ini:

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

Sumber: Dapatkan pengunjung negara dan kota dalam PHP menggunakan ipstack API

Faruque Ahamed Mollick
sumber
0

Ini hanya catatan keamanan pada fungsionalitas get_client_ip()yang sebagian besar jawaban di sini telah dimasukkan ke dalam fungsi utama get_geo_info_for_this_ip().

Jangan terlalu mengandalkan data IP di header permintaan seperti Client-IPatau X-Forwarded-Forkarena mereka dapat dipalsukan dengan sangat mudah, namun Anda harus mengandalkan sumber IP dari koneksi TCP yang sebenarnya dibuat antara server kami dan klien $_SERVER['REMOTE_ADDR']karena dapat ' t akan dipalsukan

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

Tidak apa-apa untuk mendapatkan negara IP palsu itu tetapi perlu diingat bahwa menggunakan IP ini dalam model keamanan apa pun (misalnya: melarang IP yang mengirim permintaan yang sering) akan menghancurkan seluruh model keamanan. IMHO Saya lebih suka menggunakan IP klien yang sebenarnya bahkan jika itu adalah IP dari server proxy.

Akuntan م
sumber
0

Mencoba

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

  ?>
Dipanshu Mahla
sumber
Bagian if-else akan memberi Anda alamat IP pengunjung dan bagian berikutnya akan mengembalikan kode negara. Coba kunjungi api.wipmania.com dan kemudian api.wipmania.com/[your_IP_address]
Dipanshu Mahla
0

Anda dapat menggunakan layanan saya: https://SmartIP.io , yang memberikan nama negara lengkap dan nama kota dari alamat IP apa pun. Kami juga mengekspos zona waktu, mata uang, deteksi proxy, deteksi node TOR dan deteksi Crypto.

Anda hanya perlu mendaftar dan mendapatkan kunci API gratis yang memungkinkan 250.000 permintaan per bulan.

Menggunakan perpustakaan PHP resmi, panggilan API menjadi:

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

Periksa dokumentasi API untuk info lebih lanjut: https://smartip.io/docs

kevinj
sumber
0

Pada 2019, MaxMind country DB dapat digunakan sebagai berikut:

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

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

HUBUNGI19
sumber