我想通过他们的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);

?>

好吧,它正常工作,但问题是,这返回国家代码,如US或CA.,而不是整个国家名称,如美国或加拿大。

那么,除了hostip.info提供的这些,还有什么好的选择吗?

我知道我可以编写一些代码,最终将这两个字母转换为整个国家的名称,但我实在懒得编写包含所有国家的代码……

注:出于某种原因,我不想使用任何现成的CSV文件或任何代码,将抓取这个信息为我,像ip2country现成的代码和CSV。


当前回答

尝试这个简单的一行代码,您将从他们的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'];

其他回答

我正在使用ipinfodb.com api,并得到你正在寻找的东西。

它是完全免费的,你只需要注册他们获得你的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'];

这是它。

PHP代码获取国家,城市, 大陆等使用IP地址

    $ip = $_SERVER["REMOTE_ADDR"];
      
    // Use JSON encoded string and converts 
    // it into a PHP variable 
    $ipdat = @json_decode(file_get_contents( 
        "http://www.geoplugin.net/json.gp?ip=" . $ip)); 
       
    $country = $ipdat->geoplugin_countryName; 
    $city = $ipdat->geoplugin_city; 
    $continent_name = $ipdat->geoplugin_continentName; 
    $latitude = $ipdat->geoplugin_latitude; 
    $longitude = $ipdat->geoplugin_longitude; 
    $currency_symbol = $ipdat->geoplugin_currencySymbol; 
    $currency_code = $ipdat->geoplugin_currencyCode; 
    $timezone = $ipdat->geoplugin_timezone; 

由CPAN的Perl社区维护的ip->国家数据库有一个维护良好的平面文件版本

访问这些文件不需要数据服务器,数据本身大约是515k

Higemaru编写了一个PHP包装器来处理这些数据:PHP -ip-country-fast

你可以使用ipstack地理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中获取访问者国家和城市

这只是关于get_client_ip()功能的一个安全说明,这里的大多数答案都包含在get_geo_info_for_this_ip()的主函数中。

不要过分依赖请求头中的IP数据,如client -IP或X-Forwarded-For,因为它们很容易被欺骗,但是你应该依赖于我们的服务器和客户端$_SERVER['REMOTE_ADDR']之间实际建立的TCP连接的源IP,因为它不能被欺骗

$_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)都会破坏整个安全模型。恕我直言,我更喜欢使用实际的客户端IP,即使它是代理服务器的IP。