如何使用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中获取国家名称?的主要内容,如果未能解决你的问题,请参考以下文章