Maison >développement back-end >tutoriel php >php获取ip地理信息几种方法

php获取ip地理信息几种方法

WBOY
WBOYoriginal
2016-07-25 09:12:531219parcourir

方法一,利用纯真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接口:

  1. <script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>
  2. //腾讯API的PHP调用方法
  3. function getIpPlace(){
  4. $ip=file_get_contents("http://fw.qq.com/ipaddress");
  5. $ip=str_replace('"',' ',$ip);
  6. $ip2=explode("(",$ip);
  7. $a=substr($ip2[1],0,-2);
  8. $b=explode(",",$a);
  9. return $b;
  10. }
  11. $ip=getIpPlace();
  12. print_r($ip);
  13. //调用查询接口需要抓取网页,有三种方法,第一种是curl,第二种是
  14. //file_get_contents,第三种fopen->fread->fclose,推荐第二种方法
  15. /*
  16. *根据腾讯IP分享计划的地址获取IP所在地,比较精确
  17. */
  18. function getIPLoc($queryIP){
  19. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
  20. $ch = curl_init($url);
  21. curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
  22. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  23. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
  24. $result = curl_exec($ch);
  25. $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
  26. curl_close($ch);
  27. preg_match("@(.*)@iU",$result,$ipArray);
  28. $loc = $ipArray[1];
  29. return $loc;
  30. }
  31. //根据腾讯接口查询ip地址,使用file_get_contents抓去网页

  32. function getIPLoc($queryIP){
  33. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
  34. $result = file_get_contents($url);
  35. $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
  36. preg_match("@(.*)@iU",$result,$ipArray);
  37. $loc = $ipArray[1];
  38. return $loc;
  39. }
  40. //根据腾讯接口查询ip地址,使用fopen->fread->fclose抓去网页
  41. function getIPLoc($queryIP){
  42. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
  43. $handle = fopen ("$url", "rb");
  44. $result = "";
  45. do {
  46. $data = fread($handle, 1024);
  47. if (strlen($data) == 0) {
  48. break;
  49. }
  50. $result .= $data;
  51. } while(true);
  52. $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码
  53. preg_match("@(.*)@iU",$result,$ipArray);
  54. $loc = $ipArray[1];
  55. return $loc;
  56. }
复制代码

/********注: 1,使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。 2,使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而 且需要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl

  1. 扩展*****/
  2. //新浪查询ip接口 第五个第六个是地理信息
  3. function getiploc($IP_ip){
  4. $IP_str = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip='.$IP_ip);
  5. if(!empty($IP_str)){
  6. $IP_tmp = explode(" ", $IP_str);
  7. $IP_city = iconv("GBK", "UTF-8", $IP_tmp[5]);
  8. return $IP_city;
  9. }
  10. //有道API的PHP调用方法
  11. $url = "http:www.youdao.com/smartresult-xml/search.s?type=ip&q=".$ip;
  12. $doc = new DOMDocument();
  13. $doc->load($url);
  14. $smartresult = $doc->getElementsByTagName("product");
  15. foreach($smartresult as $product)
  16. {
  17. $locations = $product->getElementsByTagName("location");
  18. $location = $locations->item(0)->nodeValue;
  19. }
  20. if($location != "")
  21. {
  22. echo $i.".".$ip;
  23. echo " 来自".$location."的网友";
  24. }
  25. else
  26. {
  27. echo $i.".".$ip;
  28. echo " 来自火星的网友";
  29. }
  30. public function sinaIPApi($ip){
  31. $str = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);
  32. $str = iconv("gbk", "utf-8//IGNORE", $str);
  33. preg_match_all("/[\x{4e00}-\x{9fa5}]+/u",$str,$get);
  34. $add = implode('',$get[0]);
  35. return $add;
  36. }
  37. //$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) "中国地质大学" } },而函数输出的结果则是“中国北京北京教育网学校中国地质大学”,希望我的思路和方法能对别人有用。



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn