IP에서 방문자 국가를 가져 오기


220

나는 지금 내가 이것을 사용하고 있습니다 ... 자신의 IP를 통해 방문자 국가를 얻으려면 ( http://api.hostip.info/country.php?ip= ...)

내 코드는 다음과 같습니다.

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

?>

글쎄, 제대로 작동하지만 문제는 미국이나 캐나다와 같은 국가 코드를 반환하지만 미국이나 캐나다와 같은 국가 이름은 반환하지 않는다는 것입니다.

그래서 hostip.info가 이것을 제공하는 좋은 대안이 있습니까?

나는이 두 글자를 전체 국가 이름으로 바꾸는 코드를 작성할 수는 있지만 모든 국가를 포함하는 코드를 작성하기에는 너무 게으르다 ...

추신 : 어떤 이유로 든 기성품 CSV 파일이나 ip2country 기성품 코드 및 CSV와 같은이 정보를 얻을 수있는 코드를 사용하고 싶지 않습니다.


20
게으르지 말고, 많은 국가가 없으며, FIPS 2 문자 코드를 국가 이름으로 변환하는 테이블을 얻는 것이 어렵지 않습니다.
Chris Henry

Maxmind geoip 기능을 사용하십시오. 결과에 국가 이름이 포함됩니다. maxmind.com/app/php
Tchoupi

에 대한 첫 번째 할당 $real_ip_address은 항상 무시됩니다. 어쨌든의 기억 X-Forwarded-ForHTTP 헤더가 매우 쉽게 위조 할 수 있으며, 같은 프록시 있다는 것을 www.hidemyass.com
월터 Tross

5
IPLocate.io는 무료 API를 제공합니다 : https://www.iplocate.io/api/lookup/8.8.8.8-면책 조항 :이 서비스를 실행합니다.
ttarik

나는 Ipregistry : api.ipregistry.co/…를 시도해 볼 것을 제안합니다 (면책 조항 : 나는 서비스를 운영합니다).
Laurent

답변:


495

이 간단한 PHP 기능을 사용해보십시오.

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

?>

사용하는 방법:

예 1 : 방문자 IP 주소 세부 사항 가져 오기

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

?>

예 2 : 모든 IP 주소의 세부 사항을 가져옵니다. [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 )

?>

1
왜 모든 IP를 항상 알지 못하는 메신저입니까? 동일한 코드를 사용했습니다.
echo_Me

1
서버에서 허용하지 않기 때문에 "알 수 없음"이 표시 될 수 file_get_contents()있습니다. error_log 파일을 확인하십시오. 해결 방법 : 내 답변을 참조하십시오.
Kai Noack

3
또한 현지에서 확인했기 때문일 수도 있습니다 (192.168.1.1 / 127.0.0.1 / 10.0.0.1)
Hontoni

1
정의 된 기간 동안 결과를 캐시해야합니다. 또한 데이터를 얻기 위해 다른 웹 사이트에 의존해서는 안되며, 웹 사이트가 다운되거나 서비스가 중단 될 수 있습니다. 웹 사이트 방문자 수가 증가하면이 서비스가 귀하를 금지시킬 수 있습니다.
machineaddict

1
후속 : localhost에서 사이트를 테스트 할 때 발생하는 문제입니다. 테스트 목적으로 고칠 방법이 있습니까? 표준 127.0.0.1 로컬 호스트 IP 사용
Nick

54

http://www.geoplugin.net/ 에서 간단한 API를 사용할 수 있습니다

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

사용 된 기능

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

산출

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

그것은 당신이 놀 수있는 많은 옵션을 가지고 있습니다

감사

:)


1
정말 멋지다. 그러나 여기서 테스트하는 동안 "geoplugin_city, geoplugin_region, geoplugin_regionCode, geoplugin_regionName"필드에는 값이 없습니다. 이유는 무엇입니까? 해결책이 있습니까? 미리 감사드립니다
WebDevRon

31

Chandra의 답변을 시도했지만 서버 구성에서 file_get_contents ()를 허용하지 않습니다.

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

Chandra의 코드를 수정하여 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

?>

희망이 도움이됩니다 ;-)


1
그들의 사이트에있는 문서에 따르면 : "geoplugin.net이 완벽하게 응답하고 중지했다면 분당 120 개의 요청의 무료 조회 제한을 초과했습니다."
Rick Hellewell

아름답게 일했습니다. 감사!
Najeeb


11

MaxMind GeoIP (또는 지불 할 준비가되지 않은 경우 GeoIPLite)를 사용하십시오.

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

@Joyce : Maxmind API와 DB를 사용하려고했지만 왜 작동하지 않는지 모르겠습니다. 실제로는 일반적으로 작동하지만 예를 들어이 $ _SERVER [ 'REMOTE_ADDR']; this ip : 10.48.44.43, geoip_country_code_by_addr ($ gi, $ ip)에서 사용할 때 아무 아이디어도 반환하지 않습니까?
mOna

예약 된 IP 주소 (로컬 네트워크의 내부 IP 주소)입니다. 원격 서버에서 코드를 실행하십시오.
Joyce Babu


10

code.google에서 php-ip-2-country 를 확인하십시오 . 이들이 제공하는 데이터베이스는 매일 업데이트되므로 자체 SQL 서버를 호스팅하는지 확인하기 위해 외부 서버에 연결할 필요가 없습니다. 따라서 코드를 사용하면 다음을 입력하기 만하면됩니다.

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

예제 코드 (자원에서)

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

산출

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
작동하려면 데이터베이스 정보를 제공해야합니까? 좋지 않은 것 같습니다.
echo_Me

10

geobytes.com을 사용하여 사용자 IP 주소를 사용하여 위치를 가져올 수 있습니다

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

이 같은 데이터를 반환합니다

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
)

사용자 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;
}

나는 당신의 코드를 시도했다, 그것은 나를 위해 이것을 반환 : Array ([known] => false)
mOna

내가 시도하면 : $ ip = $ _SERVER [ "REMOTE_ADDR"]; 에코 $ ip; 그것은 그것을 반환합니다 : 10.48.44.43, 문제가 무엇인지 아십니까? 나는 alspo maxmind geoip을 사용했고, geoip_country_name_by_addr ($ gi, $ ip)를 다시 사용했을 때 아무 것도 반환하지 않았습니다 ...
mOna

@ mOna, 그것은 당신의 IP 주소를 반환합니다. 자세한 내용은 pls, 코드를 공유하십시오.
Ram Sharma

개인 네트워크를위한 것이기 때문에 문제가 내 IP에 실현된다는 것을 알았습니다. 그런 다음 ifconfig에서 실제 IP를 사용하여 프로그램에서 사용했습니다. 그런 다음 효과가있었습니다.) 이제 내 질문은 저와 비슷한 사용자의 경우 실제 IP를 얻는 방법입니다. (로컬 IP를 사용하는 경우) .. 여기에 내 코드를 작성했습니다. stackoverflow.com/questions/25958564/…
mOna

9

이 간단한 한 줄 코드를 사용해보십시오. IP 원격 주소에서 방문자의 국가 및 도시를 얻을 수 있습니다.

$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

PHP 코드 에서 http://ip-api.com 의 웹 서비스를 사용할 수 있습니다
.

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

쿼리에는 다른 많은 정보가 있습니다.

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은 ISP 이름도 제공하기 때문에 사용했습니다!
Richard Tinkler

1
그들은 또한 시간대를 제공하기 때문에 사용
Roy Shoa

8

CPAN 의 Perl 커뮤니티가 유지 보수하는 ip-> country 데이터베이스의 잘 관리 된 플랫 파일 버전이 있습니다.

해당 파일에 액세스하려면 데이터 서버가 필요하지 않으며 데이터 자체는 약 515k입니다

Higemaru는 그 데이터와 대화하기 위해 PHP 래퍼를 작성했습니다 : php-ip-country-fast


6

그것을하는 많은 다른 방법들 ...

해결책 # 1 :

사용할 수있는 타사 서비스 중 하나는 http://ipinfodb.com 입니다. 호스트 이름, 지리적 위치 및 추가 정보를 제공합니다.

: 여기에 API 키를 등록 http://ipinfodb.com/register.php . 이렇게하면 서버에서 결과를 검색 할 수 있습니다. 그렇지 않으면 작동하지 않습니다.

다음 PHP 코드를 복사하여 붙여 넣습니다.

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

단점 :

그들의 웹 사이트에서 인용 :

우리의 무료 API는 낮은 정확도를 제공하는 IP2Location Lite 버전을 사용하고 있습니다.

해결책 # 2 :

이 기능은 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));

산출:

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

3
웹 사이트에서 인용 : "하루에 1,000 건의 API 요청으로 제한됩니다. 더 많은 요청이 필요하거나 SSL 지원이 필요한 경우 유료 요금제를 참조하십시오."
Walter Tross

개인 웹 사이트에서 사용 했으므로 게시했습니다. 정보 주셔서 감사합니다 ... 그것을 몰랐습니다. 나는 게시물에 훨씬 더 많은 노력을 기울
였으므로

@imbondbaby : 안녕하세요, 코드를 시도했지만 나에게 이것을 반환합니다 : : Array ([country] =>-), 이것을 인쇄하려고 할 때 문제를 이해하지 못합니다 : $ ipaddress = $ _SERVER [ 'REMOTE_ADDR' ]; 그것은 나 에게이 ip를 보여줍니다 : 10.48.44.43, 나는이 IP가 작동하지 않는 이유를 이해할 수 없습니다! 나는이 번호를 삽입 할 때마다 어떤 나라도 반환하지 않는다는 것을 의미합니다! counld u plz 도와주세요?
mOna

5

내 서비스 ipdata.co 는 5 개 언어로 국가 이름을 제공합니다! IPv4 또는 IPv6 주소의 조직, 통화, 시간대, 통화 코드, 플래그, 이동 통신사 데이터, 프록시 데이터 및 Tor 종료 노드 상태 데이터는 물론입니다.

이 답변은 '제한된'API 키를 사용하며 매우 제한적이며 몇 번의 호출 테스트에만 사용됩니다. 가입하기자신의 무료 API 키에 하고 개발 요청을 매일 최대 1500 건 요청하십시오.

또한 전 세계 10 개 지역에서 초당 10,000 개 이상의 요청을 처리 할 수있어 확장 성이 뛰어납니다!

옵션은 다음과 같습니다. 영어 (en), 독일어 (de), 일본어 (ja), 프랑스어 (fr) 및 중국어 간체 (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
신의 축복이 있기를 내가 요청한 것보다 더 많은 것을 얻었습니다! 빠른 질문 : 자극에 사용할 수 있습니까? 제 말은, 당신은 언제라도 곧 내려 놓지 않을 것입니다.
사예드

1
전혀 :) 나는 사실 더 많은 지역과 더 많은 광택을 추가하고 있습니다. 도움이
Jonathan

특히 추가 매개 변수를 통해 매우 유용하여 두 가지 이상의 문제가 해결되었습니다.
사예드

3
긍정적 인 피드백에 감사드립니다! 이러한 도구에 대한 가장 일반적인 사용 사례를 중심으로 지리 위치를 지정한 후 추가 처리를 수행 할 필요가 없도록하는 것이 목표였습니다. 사용자에게 지불하는 것을 보게되어 기쁩니다.
Jonathan

4

이것이 새로운 서비스인지 확실하지 않지만 현재 (2016) PHP에서 가장 쉬운 방법은 geoplugin의 PHP 웹 서비스를 사용하는 것입니다 : http://www.geoplugin.net/php.gp :

기본 사용법 :

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

또한 준비된 클래스를 제공합니다. http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache


else이후 else를 사용하여 오류가 발생했습니다. 무엇을 막으려 고 했습니까? REMOTE_ADDR을 항상 사용할 수 있습니까?
AlexioVay

@Vaia는 - 아마 해야 하지만 당신은 절대 모릅니다.
billynoah

알고 있지 않은 경우가 있습니까?
AlexioVay

2
@Vaia-PHP 문서에서 $_SERVER: "모든 웹 서버가 이들 중 하나를 제공한다는 보장은 없습니다; 서버는 일부를 생략하거나 여기에 나열되지 않은 다른 서버를 제공 할 수 있습니다."
billynoah

1
요청에는 제한이 있습니다. "geoplugin.net이 완벽하게 응답하고 중지 한 경우 분당 120 회 요청의 무료 조회 제한을 초과했습니다."
Rick Hellewell

2

나는 ipinfodb.comAPI를 사용 하고 있으며 당신이 찾고있는 것을 정확하게 얻고 있습니다.

완전히 무료이므로 API 키를 얻으려면 등록해야합니다. 웹 사이트에서 다운로드하여 PHP 클래스를 포함 시키거나 URL 형식을 사용하여 정보를 검색 할 수 있습니다.

내가하고있는 일은 다음과 같습니다.

스크립트에 아래 코드를 사용하여 PHP 클래스를 포함 시켰습니다.

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

그게 다야.


2

http://ipinfo.io/ 를 사용 하여 ip 주소의 세부 정보를 얻을 수 있습니다. 사용하기 쉽습니다.

<?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.1방문자 IpAddress로 교체하십시오 .

$country = geoip_country_name_by_name('127.0.0.1');

설치 지침은 여기 에 있으며 도시, 주, 국가, 경도, 위도 등을 얻는 방법을 알아 보려면이 지침을 읽으십시오.


하드 링크보다 더 많은 실제 코드를 제공하십시오.
Bram Vanroy

링크의 최신 뉴스 : "2019 년 1 월 2 일 현재 Maxmind는이 모든 예제에서 사용했던 원래 GeoLite 데이터베이스를 중단했습니다. support.maxmind.com/geolite-legacy-discontinuation-notice 에서 전체 공지를 읽을 수 있습니다. "
Rick Hellewell


2

프로젝트에서 사용한 짧은 답변이 있습니다. 내 대답에는 방문자 IP 주소가 있다고 생각합니다.

$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

나는 이것이 오래되었다는 것을 알고 있지만 여기에 다른 몇 가지 해결책을 시도했지만 구식이거나 null을 반환합니다. 이것이 내가 한 방법입니다.

를 사용 http://www.geoplugin.net/json.gp?ip=하면 서비스에 가입하거나 비용을 지불 할 필요가 없습니다.

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

그리고 당신이 그것에 대한 추가 정보를 원한다면, 이것은 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

"Chandra Nakka"답변을 바탕으로 수업을 작성했습니다. 잘하면 사람들이 지오 플러그인에서 세션으로 정보를 저장하여 정보를 불러올 때 훨씬 빨리로드 할 수 있기를 바랍니다. 또한 값을 개인 배열에 저장하므로 동일한 코드에서 호출하는 것이 가장 빠릅니다.

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'질문에 대답하면

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

사용 가능한 다른 속성은 다음과 같습니다.

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

귀국

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

사용자 국가 API는 당신이 필요로 정확히 있습니다. 다음은 원래와 같이 file_get_contents ()를 사용하는 샘플 코드입니다.

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

1
이 API는 하루에 100 (무료) API 호출을 허용합니다.
개편

0

ipstack geo API를 사용하여 국가 및 도시 방문자를 확보 할 수 있습니다. 자신의 ipstack API를 가져 와서 아래 코드를 사용해야합니다.

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

출처 : ipstack API를 사용하여 방문자에게 국가 및 도시를 PHP로 가져 오기


0

이것은get_client_ip() 대부분의 답변이의 주요 기능에 포함 된 기능에 대한 보안 정보 일뿐 입니다 get_geo_info_for_this_ip().

같은 요청 헤더의 IP 데이터에 너무 많이 의존하지 않는 Client-IP또는 X-Forwarded-For그러나 실제로 우리의 서버와 클라이언트 사이에 확립 된 TCP 연결의 소스 IP에 의존해야, 그들은 아주 쉽게 스푸핑 할 수 있기 때문 $_SERVER['REMOTE_ADDR']으로 '그것을 할 수있는 속이지 않는다

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

스푸핑 된 IP의 국가를 확보하는 것은 좋지만 모든 보안 모델에서이 IP를 사용하면 (예 : 빈번한 요청을 보내는 IP 금지) 전체 보안 모델이 손상됩니다. IMHO 프록시 서버의 IP 인 경우에도 실제 클라이언트 IP를 사용하는 것이 좋습니다.


0

시험

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

  ?>

if-else 부분은 방문자의 IP 주소를 제공하고 다음 부분은 국가 코드를 반환합니다. api.wipmania.com을 방문한 다음 api.wipmania.com/[your_IP_address]
Dipanshu Mahla

0

내 서비스를 사용할 수 있습니다 : https://SmartIP.io , IP 주소의 전체 국가 이름과 도시 이름을 제공합니다. 또한 시간대, 통화, 프록시 감지, TOR 노드 감지 및 암호화 감지를 노출합니다.

한 달에 250,000 건의 요청을 허용하는 무료 API 키를 등록하고 받으면됩니다.

공식 PHP 라이브러리를 사용하면 API 호출은 다음과 같습니다.

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

자세한 내용은 API 설명서를 확인하십시오. https://smartip.io/docs


0

2019 년 현재 MaxMind 국가 DB는 다음과 같이 사용할 수 있습니다.

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.