>백엔드 개발 >PHP 튜토리얼 >PHP에서 IP 지리 정보를 얻는 여러 가지 방법

PHP에서 IP 지리 정보를 얻는 여러 가지 방법

WBOY
WBOY원래의
2016-07-25 09:12:531222검색

첫 번째 방법은 인터넷에서 많이 찾을 수 있는 IP 데이터베이스를 사용하는 것입니다. 단점은 업데이트가 약간 느리다는 것입니다. 방법 2: 포털 웹사이트의 인터페이스 사용 현재는 Tencent, Sina, NetEase, Sohu, Google이 IP 주소 조회 API를 제공하는 것으로 알려져 있는데, Tencent, Sina, NetEase만 Google Maps를 사용하는 것 같아 조사해본 적은 없습니다. 국내 여러 Tencent 서비스를 살펴보면 JavaScript를 제공하고 NetEase는 XML을 제공하며 Sina는 다양한 형식을 사용할 수 있습니다. XML이 아닌 데이터 소스는 JavaScript 호출인지 PHP 호출인지에 관계없이 모두 GBK 형식입니다. 인코딩을 변환해야 합니다. 그렇지 않으면 잘못된 코드가 표시됩니다. 더 주의해야 할 점은 여러 IP를 동시에 쿼리하는 경우 포털의 API를 사용하여 쿼리하는 것이 매우 느리다는 것입니다. 아마도 PHP를 사용하여 XML을 구문 분석하거나 file_get_contents() 함수를 사용하여 for 루프를 작성하고 시도했을 것입니다. content., 10회 이상 쿼리하면 속도가 매우 느려지고 시간이 초과될 수도 있습니다.

Tencent의 IP 주소 API 인터페이스 주소: http://fw.qq.com/ipaddress, 반환되는 데이터 형식은 다음과 같습니다: var IPData = new Array("123.124.2.85","","Beijing City", "" );, JavaScript 개체이지만 IP 쿼리를 입력하는 방법은 아직 알려져 있지 않습니다.

Sina의 IP 주소 쿼리 인터페이스: http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

Sina 다중 지역 테스트 방법: http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=123.124.2.85

NetEase Youdao의 IP 주소 쿼리 인터페이스: http://www.youdao.com/smartresult-xml/search.s?type=ip&q=123.124.2.85 JS 코드를 사용하여 Tencent의 API 인터페이스를 호출하세요.

  1. <script>document.write("귀하의 IP는 " IPData[0] ", 보낸 사람: " IPData[2]);</script>
  2. //Tencent 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. //쿼리 호출 인터페이스에서는 세 가지 방법이 필요합니다. 첫 번째는 컬, 두 번째는
  14. //file_get_contents, 세 번째는 fopen->fread->fclose입니다.
  15. / *
  16. *Tencent IP Sharing Plan의 주소를 기반으로 IP 위치를 가져오는 것이 더 정확합니다.
  17. */
  18. function getIPLoc($queryIP){
  19. $url = 'http://ip .qq.com/cgi -bin/searchip?searchip1='.$queryIP;
  20. $ch = 컬_init($url);
  21. curl_setopt($ch,CURLOPT_ENCODING,'gb2312');
  22. curl_setopt( $ch, CURLOPT_TIMEOUT, 10 gb2312"); // 인코딩 변환, 그렇지 않으면 문자가 깨짐
  23. cur_close($ch);
  24. preg_match("@(.*)< /p>@iU",$ 결과,$ipArray);
  25. $loc = $ipArray[1];
  26. $loc 반환
  27. }

  28. / /Tencent 인터페이스에 따라 IP 주소 쿼리, file_get_contents를 사용하여 웹페이지 가져오기

  29. function getIPLoc($queryIP){
  30. $url = 'http://ip.qq.com/cgi-bin/searchip ?searchip1='.$queryIP;
  31. $result = file_get_contents($url);
  32. $result = mb_convert_encoding($result, "utf-8", "gb2312") // 인코딩 변환, 그렇지 않으면 코드 왜곡됩니다
  33. preg_match("@(.* )

    @iU",$result,$ipArray);
  34. $loc = $ipArray[1] ;
  35. return $loc;
  36. }
  37. // Tencent 인터페이스에 따라 IP 주소를 쿼리하고 fopen->fread->fclose를 사용하여 웹페이지를 가져옵니다
  38. 함수 getIPLoc($queryIP ){
  39. $url = 'http://ip.qq.com/cgi-bin /searchip?searchip1='.$queryIP;
  40. $handle = fopen ("$url", "rb");
  41. $result = "";
  42. do {
  43. $data = fread( $handle, 1024)
  44. if (strlen($data) == 0) {
  45. break; > }
  46. $result .= $data;
  47. } while(true);
  48. $result = mb_convert_encoding($result, "utf-8", "gb2312"); 코드가 깨집니다
  49. preg_match("@(.*)< /p>@iU",$result,$ipArray);
  50. $loc = $ipArray[1 ];
  51. return $loc;
  52. }
  53. 코드 복사

/********메모: 1. file_get_contents 및 fopen을 사용할 때,allow_url_fopen을 활성화해야 합니다. 방법: php.ini를 편집하고 Allow_url_fopen = On으로 설정하십시오.allow_url_fopen이 꺼지면 fopen이나 file_get_contents 모두 원격 파일을 열 수 없습니다. 2. 컬을 사용하기 위해서는 컬을 열어야 합니다. 방법: Windows에서 php.ini를 수정하고, Extension=php_curl.dll 앞의 세미콜론을 제거하고, Linux에서 ssleay32.dll 및 libeay32.dll을 C:WINDOWSsystem32에 복사합니다. 컬

  1. 확장*****/
  2. //5번째와 6번째 Sina 쿼리 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 = 폭발(" " , $ IP_str);
  7. $IP_city = iconv("GBK", "UTF-8", $IP_tmp[5]);
  8. return $IP_city;
  9. }
  10. //예 PHP 호출 Dao API 메소드
  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("제품");
  15. foreach($smartresult as $product)
  16. {
  17. $ 위치 = $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. 공개 함수 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은 훌륭한 2차원 배열입니다
코드 복사

Sina API는 file_get_contents를 사용한 후 Tencent와 유사할 수도 있습니다. () 함수를 사용하여 API처럼 주소를 얻고, 이를 처리하기 위해 일련의 문자열 함수를 사용하고, 정규 표현식을 사용하여 Sina의 반환 결과에서 한자가 포함된 문자열을 제공하고, 이를 세그먼트 단위로 2차원 배열에 저장할 수 있습니다. Sina의 API에만 유용하지만 버그가 있습니다.

예를 들어 학교에서 나에게 할당한 IP 주소를 쿼리한 후 var_dump() 함수의 $get 변수는 다음과 같은 결과를 얻습니다. array(1) { [0]=> array(6) { [0]=> string(6) "중국" [1]=> string(6) "베이징" [2]=> string(6) "베이징" " [3]=> string(9) "Education Network" [4]=> string(6) "School" [5]=> string(18) "China University of Geosciences" } }, 함수의 결과 출력은 "Beijing Education Network School China University of Geosciences, Beijing, China"입니다. 제 아이디어와 방법이 다른 사람들에게도 유용할 수 있기를 바랍니다.



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.