如何使用geoplugin在php中获取国家名称?

Posted

技术标签:

【中文标题】如何使用geoplugin在php中获取国家名称?【英文标题】:How to get country name in php with geoplugin? 【发布时间】:2018-05-02 06:12:09 【问题描述】:

您好,我遇到了这个问题,我不知道发生了什么。我正在使用 google geo plugin api 使用 IP 地址获取国家/地区名称。下面是我的代码:-

$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
$result  = array('country'=>'', 'city'=>'');
if(filter_var($client, FILTER_VALIDATE_IP))
    $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP))
    $ip = $forward;
else
    $ip = $remote;

$ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));    
if($ip_data && $ip_data->geoplugin_countryName != null)
    $result['country'] = $ip_data->geoplugin_countryCode;
    $result['city'] = $ip_data->geoplugin_city;

echo "<pre>"; print_r($result); die;

我来自印度。有时当我访问该网站时,它会显示印度或有时会显示新加坡。但我只位于印度。任何人都可以建议我们我做错了什么并提供一些替代方案,以便我们获得正确的结果。

【问题讨论】:

如果您回显您的 3 个 ip,它们中的任何一个都来自新加坡吗? 我是防火墙或代理设置,或者可能是您浏览器中的任何 *** 扩展导致问题 @Joseph_J 我已经测试了来自不同国家/地区的虚拟 IP,它工作正常,但是当我们使用实际 IP 时,它也不工作 @AlivetoDie 当我们访问加拿大的网站时,它没有显示国家/地区名称 那真的没有回答我的问题。回显您的客户端、转发和远程 IP。它可能会提供有关您从服务器获得什么的线索。可能会帮助您排除故障。只是输入一个已知的 ip 是不一样的。 【参考方案1】:

这可能是因为您正在检索 IP。您可以使用以下方式获取客户的 IP 地址:

function get_client_ip() 
$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;

然后使用您收到的 ip 查找国家/地区名称:

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;


有时您不会使用我之前提到的功能获取客户端 ip,在这种情况下,就像您使用过的一样,您可以使用以下方法获取他们的公共 ip:

file_get_contents("http://ipecho.net/plain")

并再次使用您收到的公共 ip 调用 ip_info 函数。

【讨论】:

请在代码中添加解释,这将使答案更有用。 Stack Overflow 与用户复制粘贴 code-sn-ps 无关,即使它们运行良好。

以上是关于如何使用geoplugin在php中获取国家名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中使用ip地址获取移动国家代码

无法从地理位置获取城市名称

在PHP中按IP地址获取国家

如何使用php获取域的托管IP和国家名称

使用 Geoplugin 基于国家/地区的自动下拉

从 php 中的谷歌地图获取国家名称