我正在寻找有助于将IP地址转换为邮政编码和城市的开放API或3D聚会产品的建议,以制作地理特定的网站内容。
答案 0 :(得分:12)
我使用的是ip2nation:http://www.ip2nation.com
这是一个完全免费的MySQL数据库,可以将IP映射到国家/地区。它们在其站点上包含一些示例PHP脚本。
我在我的WordPress博客上使用它和Ozh的免费IP to Nation WordPress Plugin
即使你没有使用WordPress,也要下载插件,因为它会为你提供一套很好的PHP代码来访问数据库。他甚至还有一组漂亮的小国旗,你可以在旁边显示,或者代替国家名称,这就是我在博客的评论者姓名旁边自动显示标志的行为。
实际上,您不需要API。您所需要的只是数据库以及编写PHP和SQL代码以访问它的能力。
我不推荐ip2location供临时使用。他们为他们的数据库收取了很多费用,他们的数据库非常庞大,并且比大多数人需要更多的细节。
但ip2nation只会进入国家/地区级别。如果你确实需要城市和邮政编码(尽管其他答案/评论已经说明它们可能是错误的),那么除了ip2location,you can try GeoBytes。它们具有特别适用于特定于地理位置的网站内容的组件,例如GeoSelect:http://www.geobytes.com/GeoSelect.htm
答案 1 :(得分:10)
我找到的最好的(意思是易于集成和免费)方式here。该服务是完全免费的,不需要任何本地安装,也不会强迫您在您的网站上放置横幅(而不是IP2Location)。它们的唯一限制是查询限制,这是非常合理的:您可以每2秒触发一次查询,即使您进行更频繁的查询,您也会得到稍微慢一点的结果。享受!
答案 2 :(得分:8)
IP2Location
答案 3 :(得分:2)
我希望所有想要从IP地址获取位置的用户都可以使用这个小代码获得正确的解决方案。
$ip_addr = $_SERVER['REMOTE_ADDR'];
$geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_addr) );
if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) {
$lat = $geoplugin['geoplugin_latitude'];
$long = $geoplugin['geoplugin_longitude'];
}
答案 4 :(得分:1)
Geocoder.ca提供了大量的ip地址信息(仅限北美) 例如, http://geocoder.ca/99.229.2.190?geoit=xml(也支持geoit = json和jsonp)
<result>
<geodata>
<latt>43.623262</latt>
<longt>-79.749543</longt>
<city>MISSISSAUGA</city>
<prov>ON</prov>
<postal>L5N7Z9</postal>
<stnumber>1837</stnumber>
<staddress>Samuelson CIR</staddress>
<TimeZone>America/Toronto</TimeZone>
<AreaCode>289</AreaCode>
<confidence>1</confidence>
<intersection>
<street1>Samuelson Cir</street1>
<street2>Stockbridge Crt</street2>
<lattx>43.622696</lattx>
<longtx>-79.748706</longtx>
<city>MISSISSAUGA</city>
<prov>ON</prov>
<distance>0.179</distance>
</intersection>
</geodata>
</result>
答案 5 :(得分:0)
以下是我发现使用http://ipinfodb.com/ip_locator.php获取其信息的代码段的修改版本。请注意,您也可以使用它们申请API密钥,并直接使用API获取您认为合适的信息。正如您所看到的http://ipinfodb.com/ip_location_api.php,它们包含从PHP到JavaScript到ASP.Net的所有示例。如上所述,下面不需要密钥,因为它通过页面提取其公共页面和正则表达式来获取指定信息。钥匙是免费的。
function detect_location($ip=NULL, $asArray=FALSE) {
if (empty($ip)) {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
else { $ip = $_SERVER['REMOTE_ADDR']; }
}
elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
$ip = '8.8.8.8';
}
$url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
$i = 0; $content; $curl_info;
while (empty($content) && $i < 5) {
$ch = curl_init();
$curl_opt = array(
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_TIMEOUT => 1,
CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
);
if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
curl_setopt_array($ch, $curl_opt);
$content = curl_exec($ch);
if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
curl_close($ch);
}
$araResp = array();
if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);
$strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';
return $asArray ? $araResp : $strResp;
}
detect_location();
// returns "CITY, STATE" based on user IP
detect_location('xxx.xxx.xxx.xxx');
// returns "CITY, STATE" based on IP you provide
detect_location(NULL, TRUE); // based on user IP
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
detect_location('xxx.xxx.xxx.xxx', TRUE); // based on IP you provide
// returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }
答案 6 :(得分:0)
在Ruby中......这些是步骤
gem install geocoder
在ruby脚本中,有这些行。
require "geocoder"
puts Geocoder.address('76.95.251.102');
//相应地更改IP地址。
output:
Bellflower, CA 90706, United States