从他们的知识产权访问国家
我想通过他们的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提供这个?
我知道我可以写一些代码,最终将这两个字母全国名称,但我懒得写一个代码,包含所有国家…
PS:出于某种原因,我不想使用任何现成的CSV文件或任何代码,将抓住这些信息,像ip2country现成的代码和CSV。
试试这个简单的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 ) ?>
你可以使用一个简单的API从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>";
使用的function
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
它使你有很多select,你可以玩
谢谢
🙂
我试过钱德拉的答案,但我的服务器configuration不允许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('"', '"', $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) http://api.hostip.info/get_html.php?ip=12.215.42.19
2)
$json = file_get_contents('http://freegeoip.appspot.com/json/66.102.13.106'); $expression = json_decode($json); print_r($expression);
使用MaxMind GeoIP(或GeoIPLite,如果您还没有准备好付款)。
$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE); $country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']); geoip_close($gi);
我们可以使用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 )
function获取用户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; }
试试这个简单的一行代码,你将得到他们的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'];
从code.google检查出php-ip-2-country 。 他们提供的数据库是每天更新的,所以如果您托pipe自己的SQL服务器,则不需要连接到外部服务器进行检查。 所以使用代码,你只需input:
<?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 )
在CPAN的Perl社区维护着一个维护良好的平面文件版本的ip-> country数据库
访问这些文件不需要dataserver,数据本身大约是515k
Higemaru已经写了一个PHP包装器来跟这些数据: php-ip-country-fast
许多不同的方式来做到这一点…
解决scheme#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版本的准确性较低。
解决scheme2:
该function将使用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: (.*?) #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
您可以使用http://ip-api.com提供的networking服务;
在你的php代码,做如下:
<?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', )
不知道这是一个新的服务,但现在(2016年)最简单的方法是使用geoplugin的PHP Web服务: 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
对于我在一个项目中使用的这个问题,我有一个简短的回答。 在我的回答中,我认为你有访问者的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; }
如果它帮助你投票我的答案。
我正在使用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'];
而已。
你可以使用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; / ?>
将127.0.0.1
replace为访问者IpAddress。
$country = geoip_country_name_by_name('127.0.0.1');
安装说明在这里 , 阅读这个知道如何获得城市,州,国家,经度,纬度等…
用户国家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
我的服务https://ipdata.co提供5种语言的国家名称!; 以及其他几个数据点。
选项包括; 英文(en),德文(de),日文(ja),法文(fr)和简体中文(za-CH)
$ip = '74.125.230.195'; $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}")); echo $details->country_name; //United States echo $details->city; //Mountain View $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}/zh-CN")); echo $details->country_name; //美国