IP to location就是ip地址转为实际地址啦,近来paperen在公司的一个任务是做一个叫防同行的插件,其实就是实现网站屏蔽被某个地区ip或者城市,甚至是国家的人浏览的功能,在网页中放上一个script的调用就可以,在这个项目中paperen终于体会到大数据量的数据库是怎样一回事……嗯……多余的就不说太多了,直接说这个iptolocation算啦。(声明一下这篇文章的IP to location并不是在公司那个项目所使用的技术)?

今天为博客加上了一个接口,功能只是来获得浏览者的所在地,这个接口的实现主要难在实现ajax跨域,而数据主要是使用了www.webxml.com.cn的webservices来获得,它的接口的地址是

http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=127.0.0.1

我们要做的就是更改其中theipaddress参数吧,你可以直接访问看看,是一个xml的文档。?

其实自己这个东西也研究了两天,一开始做了一个,之后发觉不能跨域访问,然后今天再查了一些资料,并解决了跨域的问题,而这回就真的可以使用了。关于paperen这个东西,您可以访问这个页,如果想借用一下也是可以的。?

插件引用文档及例子?

还先放出在paperen研究过程中参考了哪些文档。

csdn论坛的帖子:http://topic.csdn.net/u/20090508/13/aceaa87a-8b5e-44cb-8ebf-1cbd0b8d53ff.html

javaeye:http://www.javaeye.com/topic/260647

jquery手册:http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html

php手册:http://cn2.php.net/manual/en/function.file.php

json_encode函数:http://paperen.com/demo/json_func/?

如果是你的话,你会怎去实现这个功能??

对于paperen来说,我是这样想的,因为现在已经有了webxml提供的数据,你要做的就是实现自动获得浏览者的ip然后传送到webxml.com.cn这个接口上,然后获得它的回传数据,并分析数据然后重新组织成你希望的数据,核心技术就是这样,而对于调用的时候肯定是需要用上ajax的了,当然如果你这个插件只是用在自己网站的话根本就不需要考虑跨域的问题,但是要想别人也可以使用你的插件的话你就必须解决跨域的问题,而paperen在查阅了一些资料后就用上了$.getJSON去解决这个问题。?

这个paperen在弄这个小东西时的整个流程。下面来看看具体的。?

if(isset($_SERVER['REMOTE_ADDR'])){

??$url = "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=";
??$client_ip = $_SERVER['REMOTE_ADDR'];
??$lines = file($url.$client_ip);
??$data = "";
??foreach($lines as $l => $line){
???$data .= $line;
??}
??$tmp = explode("", $data);
??$yourip = $client_ip;
??$from = str_replace(array("",""), '', $tmp[2]);
??$ipinfo = array('ip' => $client_ip, 'from' => $from);
?}else{
??$ipinfo = array('ip' => '未知', 'from' => '地球某处的…');
?}
?$jsoncallback = isset($_GET['jsoncallback']) ? $_GET['jsoncallback'] : '';
?echo $jsoncallback."(".json_encode($ipinfo).")";

使用S_SERVER['REMOTE_ADDR']获得对方的ip地址数据,然后放到url中使用file获得这个页面的数据,并重组。之后开始分割数据,而这里自己弄的比较傻,因为对于这样一个xml数据。

201004181271599201

我们要获得两个数据,一个是第一个被包着的ip地址,第二个也是被包着的地址数据,而自己使用了explode对进行了分割,然后再硬性地将一些字符替换掉,于是乎就得到了我们想要的数据……这里的方法仅供参考。?

最后用json_encode对数据进行json的转换,如果php版本不自带这个函数的话,需要手动加上,paperen我也放出来给大家了,也是自己以前在网上找的。但是这里这个需要注意一下jsoncallback这个变量,这个就是用来回传给getJSON的数据的钩子,也是重点之处。不然会接收不到数据的。你看看javaeye中那篇文章就应该会明白了,而jquery中是怎样实现的,这里就不管了,那可能也是一个很复杂的问题吧。

201004181271599885?

而js文件就就根本没什么东西的啦。

$(function(){
?$.getJSON("http://paperen.com/plugins/ip2location/?jsoncallback=?", function(data){
??var str = "我猜您是来自"+data.from+"的";
??$("#ip").html(str);
?});
});

传回来的data是一个对象,而你要做的就是获得数据中名为from的数据,所以直接data.from就是了,然后定义一个放置数据的容器,这里paperen硬性地定义了一个叫ip的容器用来放置数据。?

至于如果大家想调用的话看看那个文档就会了,其实真的没太多东西。而想起来其实真的好像不用实现对数据分割的吧,获得ip后直接送到webxml那边去处理再将整个xml数据交给js处理就可以了,貌似自己又SB了……不要紧了已经不是第一次了……大家应该能体谅的,或者自己去整个比我这个更爽的,对了还可以弄个天气预报的,嘻嘻,google有weather接口的。