从他们的IP获取国家访客

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

339457 次浏览

实际上,你可以调用http://api.hostip.info/?ip=123.125.114.144来获取信息,这些信息是用XML表示的。

使用MaxMind GeoIP(或GeoIPLite,如果你还没有准备好支付)。

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

使用以下服务

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

3) http://ipinfodb.com/ip_location_api.php

你可以使用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

它让你有很多选择可以选择

谢谢

:)

试试这个简单的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;
}


?>

使用方法:

Example1:获取访问者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 )


?>

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

我尝试了钱德拉的答案,但我的服务器配置不允许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


?>

希望能有所帮助;-)

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

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

Higemaru编写了一个PHP包装器来与这些数据进行对话:php-ip-country-fast

有很多不同的方法……

解决方案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版本,提供更低 准确性。< / p >

解决方案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

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

我们可以使用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;
}

我正在使用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; /


?>
你可以从http://ip-api.com中使用web服务
在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',
)

127.0.0.1替换为访问者的IpAddress。

$country = geoip_country_name_by_name('127.0.0.1');

安装说明为在这里阅读这篇文章,了解如何获取城市、州、国家、经度、纬度等信息…

我有一个简短的答案,我在一个项目中使用过。 在我的回答中,我认为你有访问者的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;
}

不确定这是否是一个新的服务,但现在(2016)php中最简单的方法是使用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

用户国家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

我的服务ipdata.co提供了5种语言的国家名!以及组织,货币,时区,呼叫代码,旗帜,移动运营商数据,代理数据和Tor出口节点状态数据从任何IPv4或IPv6地址。

这个答案使用了一个非常有限的“测试”API键,仅用于测试几个调用。注册为您自己的免费API密钥,每天获得多达1500个开发请求。

它还具有极强的可扩展性,全世界有10个地区,每个地区每秒可以处理>万个请求!

选项包括;英语(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;
//美国

一个带有国家IP地址 API的一行程序

echo file_get_contents('https://ipapi.co/8.8.8.8/country_name/');


> United States

例子:

https://ipapi.co/country_name/ -你的国家

https://ipapi.co/8.8.8.8/country_name/ - IP 8.8.8.8的国家

你可以使用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 ."";
?>

来源:在PHP中使用ipstack API获取访问者国家和城市

这只是一张安全提示关于get_client_ip()的功能,这里的大部分答案都包含在get_geo_info_for_this_ip()的主函数中。

不要过分依赖请求头中的IP数据,如Client-IPX-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。

我知道这是旧的,但我尝试了其他一些解决方案在这里,他们似乎是过时的或只是返回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
}

试一试

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


?>

你可以使用我的服务:https://SmartIP.io,它提供任何IP地址的完整国家名称和城市名称。我们还公开了时区、货币、代理检测、TOR节点检测和加密检测。

你只需要注册并获得一个免费的API密钥,允许每月25万次请求。

使用官方的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 < / p >

截至2022年,MaxMind国家数据库可如下使用:

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

< p >来源: https://github.com/maxmind/MaxMind-DB-Reader-php < / p >

我根据“Chandra Nakka”的答案写了一个类。希望它能帮助人们,它将信息从geoplugin保存到会话中,以便在调用信息时加载得更快。它还将值保存到一个私有数组中,因此在相同的代码中调用是最快的。

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) "£"

这可以接受吗? 纯PHP < / p >

$country = geoip_country_code_by_name($_SERVER['REMOTE_ADDR']);
print $country;

裁判:https://www.php.net/manual/en/function.geoip-country-code-by-name.php

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;

以下是使用guzzle的更清晰的工作版本:

你可以使用curl而不是guzzle,这只是一个简单的get请求。

    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, true)) {
$client = New \GuzzleHttp\Client();
$ipdat = json_decode($client->request('GET','http://www.geoplugin.net/json.gp',$params = [
'query' => [
'ip' => $ip,
]
])->getBody()->getContents(),true);
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 "region":
case "state":
$output = $ipdat['geoplugin_regionName'];
break;
case "country":
$output = $ipdat['geoplugin_countryName'];
break;
case "countrycode":
$output = $ipdat['geoplugin_countryCode'];
break;
}
}
}
return $output;
}

如果你需要尽快获得国家,我会建议geoip插件为您的web服务器。

对于nginx 在这里;

在你正确设置后,你将从$_SERVER变量中获得国家代码。

我每秒执行500(+-)次,非常快。

仅用4行代码就实现了这一点!

$user_ip = '0.0.0.0';
$user_ip = $_SERVER['REMOTE_ADDR'];
$close_url = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
$user_country = json_decode(file_get_contents("https://ipinfo.io/$user_ip/json",false,$close_url));
echo "Yes! we ship to your country: <b>" . $user_country->country . "</b>";

/ /输出是的!我们的船到你的国家我们

< p >注意: $close_url用于在内容被检索后尽快结束file_get_contents,它提高了请求的速度x5。

如果你想显示完整的国家名称,你可以点击下面,看看如何。

< a href = " https://ipinfo。Io /blog/full-country-names" rel="nofollow noreferrer">enter link description here .

//呼应“世界和平”;;

您可以使用此代码片段。

 if($a = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$_SERVER['REMOTE_ADDR']))){
$countrycode= $a['geoplugin_countryCode'];
if ($countrycode=='UK' ){
header( 'Location: https://www.example.co.uk/' ) ;exit;
}
}