第一种是利用纯真ip数据库,这个可以在网上找到很多,缺点是更新有点慢。
 
第二种是利用门户网站的接口
 
目前已知的有腾讯、新浪、网易、搜狐和Google提供IP地址查询API,但是找得到的只有腾讯、新浪和网易的,Google的貌似要用Google Maps所以没有研究。看了下国内的几个腾讯提供的是JavaScript的,网易提供的是XML,而新浪的有多种格式可以用,注意非XML的数据源都是GBK格式的,不管是JavaScript调用还是PHP调用都要转换一下编码,不然得到的是乱码。而更需要注意的是,如果一次性查询多个IP,使用门户网站的API来查询会非常缓慢,我大概写了个for循环试了下,不管是用PHP解析XML还是file_get_contents()函数获取内容,查询10次以上会变得非常缓慢,甚至可能超时。
 
腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress,返回的是数据格式为:var IPData = new Array("123.124.2.85","","北京市","");,一个JavaScript的对象,目前还不知道如何输入IP查询。
 
新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
 
新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=123.124.2.85
 
网易有道的IP地址查询接口:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=123.124.2.85

使用JS代码进行调取腾讯的api接口:
 查看源代码打印帮
 <script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script>
 <script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
 //腾讯API的PHP调用方法
 function getIpPlace(){
  $ip=file_get_contents("http://fw.qq.com/ipaddress");
  $ip=str_replace('"',' ',$ip);
  $ip2=explode("(",$ip);
  $a=substr($ip2[1],0,-2);
  $b=explode(",",$a);
  return $b;
 }
 $ip=getIpPlace();
 print_r($ip);
 //调用查询接口需要抓取网页,有三种方法,第一种是curl,第二种是
 //file_get_contents,第三种fopen->fread->fclose,推荐第二种方法
 
 function getIPLoc($queryIP){
 $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
 $ch = curl_init($url);
 curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
 curl_setopt($ch, CURLOPT_TIMEOUT, 10);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
 $result = curl_exec($ch);
 $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
    curl_close($ch);
 preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
 $loc = $ipArray[1];
 return $loc;
 }
 
//根据腾讯接口查询ip地址,使用file_get_contents抓去网页
 function getIPLoc($queryIP){
 $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
 $result = file_get_contents($url);
 $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
 preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
 $loc = $ipArray[1];
 return $loc;
 }
 //根据腾讯接口查询ip地址,使用fopen->fread->fclose抓去网页
 function getIPLoc($queryIP){
 $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
 $handle = fopen ("$url", "rb");
 $result = "";
 do {
    $data = fread($handle, 1024);
    if (strlen($data) == 0) {
    break;
    }
    $result .= $data;
 } while(true);
 $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
 preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
 $loc = $ipArray[1];
 return $loc;
 }

//新浪查询ip接口  第五个第六个是地理信息
 function getiploc($IP_ip){
 $IP_str = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip='.$IP_ip);
         if(!empty($IP_str)){   
             $IP_tmp = explode("    ", $IP_str);
             $IP_city = iconv("GBK", "UTF-8", $IP_tmp[5]);
 return  $IP_city;
 }

//有道API的PHP调用方法
 $url = "http:www.youdao.com/smartresult-xml/search.s?type=ip&q=".$ip;
 $doc = new DOMDocument();
    $doc->load($url);
    $smartresult = $doc->getElementsByTagName_r("product");
    foreach($smartresult as $product)
    {
       $locations = $product->getElementsByTagName_r("location");
       $location = $locations->item(0)->nodeValue;
    }
    if($location != "")
    {
        echo $i.".".$ip;
        echo "  来自".$location."的网友";
    }
    else
    {
        echo $i.".".$ip;
        echo "  来自火星的网友";
    }
 public function sinaIPApi($ip){
    $str = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);
    $str = iconv("gbk", "utf-8//IGNORE", $str);
    preg_match_all("/[\x{4e00}-\x{9fa5}]+/u",$str,$get);
    $add = implode('',$get[0]);
    return $add;
 }
 //$get是一个非常棒的二维数组
 
新浪API也可以像腾讯API那样用file_get_contents()函数获取完地址后使用一连串的字符串函数处理,我写的函数使用正则表达式从新浪的返回结果中提供包含中文的字符串,并且分段存入一个二维数组,这个可能只是针对新浪的API有用并且存在bug。举个例子查询学校分配给我的IP地址后var_dump()一下函数里面的$get变量得到以下结果: array(1) { [0]=> array(6) { [0]=> string(6) "中国" [1]=> string(6) "北京" [2]=> string(6) "北京" [3]=> string(9) "教育网" [4]=> string(6) "学校" [5]=> string(18) "中国地质大学" } },而函数输出的结果则是“中国北京北京教育网学校中国地质大学”。

几种获取IP 根据IP获取地址的方法 JS,第三方 新浪 网易 腾讯的更多相关文章

  1. JS 利用新浪接口通过IP地址获取当前所在城市

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...

  2. js获取IP地址多种方法实例教程

    js获取IP地址方法总结   js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...

  3. PHP获取ip与ip所在城市

    1获取真实ip,本地测试总是::1 或者127.0.0.1 或者局域网的ip /** * 获取用户真实 IP */ function getIP() { static $realip; if (iss ...

  4. 客户端程序获取自己的ip、isp、地理位置等信息

    @ 比如说你需要收集用户信息,又或者要通过这些信息让用户登陆合适的服务器(北京联通用户登陆北京联通服务器). @ 淘宝和新浪都提供了类似的API,你只需要发送一个http请求,它就返回一个json格式 ...

  5. Java获取客户端真实IP地址的两种方法

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. 获取本机IP地址

    这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

  7. CDN下nginx获取用户真实IP地址

    随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户 ...

  8. 腾讯新浪通过IP地址获取当前地理位置(省份)的接口

    腾讯新浪通过IP地址获取当前地理位置(省份)的接口  腾讯的接口是 ,返回数组 http://fw.qq.com/ipaddress 返回值 var IPData = new Array(" ...

  9. java获取本机IP地址

    转载自:http://blog.csdn.net/thunder09/article/details/5360251 在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一 ...

随机推荐

  1. OGG-01820 Could not enable workspace

    状况: OGG replicat进程abend了,查看report显示如下问题: 2016-11-01 16:11:47  ERROR   OGG-01820  Could not enable wo ...

  2. HDU 2545 树上战争 (并查集+YY)

    题意:给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,lxh总是先移动 ,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜 比较有意思的 ...

  3. JAVA Day9

    1.StringBuffer类 优点: 内存的管理! StringBuffer: String 增强版 StringBuffer sb = new StringBuffer(); StringBuff ...

  4. 动态添加LinearLayout的高度

    WindowManager wm = (WindowManager) getContext() .getSystemService(Context.WINDOW_SERVICE); int width ...

  5. Android 自动化测试—robotium(十一) robotium实现微博绑定

    利用robotium实现微博的自动绑定 android应用进行微博绑定主要有两种方式,一种客户端实现个webView,请求微博默认的授权页,另一种则是直接调用微博客户端,这里实现的为前一种,即进和微博 ...

  6. Codeforces632E Thief in a Shop(NTT + 快速幂)

    题目 Source http://codeforces.com/contest/632/problem/E Description A thief made his way to a shop. As ...

  7. 向nginx发送reopen信号以重新打开日志文件

    先移动日志文件 mv /usr/local/openresty/nginx/logs/access.log /usr/local/openresty/nginx/logs/access.log.201 ...

  8. uva10375 Choose and Divide(唯一分解定理)

    uva10375 Choose and Divide(唯一分解定理) 题意: 已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s ...

  9. [转]Flash Player、AIR、Flex SDK 大全

    平时不断看到有朋友在各种论坛.空间.知道.群里求 Flash 平台各种版本的运行时(Flash Player)和SDK(Flex.AIR).今天就看到不下10次!所以决定把 Macromedia.Ad ...

  10. C# 内嵌其他程序到自己程序

    写一xxx聊天机器人啊什么的可能会用到这种技术.比如把QQ窗体嵌入自己的winform中其实很简单,调用两个API函数即可. [DllImport("User32.dll ", E ...