ホームページ  >  記事  >  バックエンド開発  >  PHPでIP地理情報を取得するいくつかの方法

PHPでIP地理情報を取得するいくつかの方法

WBOY
WBOYオリジナル
2016-07-25 09:12:531182ブラウズ

方法 1 は、純粋な IP データベースを使用することです。欠点は、更新が少し遅いことです。 方法 2: ポータル Web サイトのインターフェイスを使用する 現在、Tencent、Sina、NetEase、Sohu、Google が IP アドレスクエリ API を提供していることがわかっていますが、Tencent、Sina、NetEase のみが Google Maps を使用しているようですので調べていません。国内の Tencent サービスをいくつか調べたところ、JavaScript が提供されており、NetEase は XML を提供しており、XML 以外のデータ ソースは JavaScript 呼び出しであるか PHP 呼び出しであるかに関係なく、すべて GBK 形式であることに注意してください。エンコーディングを変換する必要があります。そうしないと、コードが文字化けします。さらに注意が必要なのは、一度に複数の IP をクエリする場合、ポータルの API を使用してクエリを実行すると、PHP を使用して XML を解析するか、file_get_contents() 関数を使用してクエリを取得するかにかかわらず、おそらく for ループを作成して試してみたことです。コンテンツを使用すると、10 回を超えるクエリが非常に遅くなり、タイムアウトになる場合もあります。

Tencent の IP アドレス API インターフェイス アドレス: http://fw.qq.com/ipaddress、返されるデータ形式は次のとおりです: var IPData = new Array("123.124.2.85","","Beijing","" );, 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("Your IP is: "+IPData[0]+", from: "+IPData[2]);
  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. //クエリ インターフェイスを呼び出すには、Web ページをクロールする必要があります。1 つ目は、curl、2 つ目は、
  14. //file_get_contents、3 つ目は、fopen->fread-> です。 ;fclose 、2 番目の方法をお勧めします
  15. /*
  16. *Tencent 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. //Tencent インターフェイスに従って IP アドレスをクエリし、file_get_contents を使用して Web ページを取得します

  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. //Tencent インターフェイスに従って IP アドレスをクエリし、fopen->fread->fclose を使用して Web ページを取得します
  41. function getIPLoc( $queryIP){
  42. $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
  43. $handle = fopen ("$url", "rb");結果 = "";
  44. $data = fread($handle, 1024);
  45. if (strlen($data) == 0) {
  46. ブレーク;
  47. }
  48. $result .= $data; true);
  49. $result = mb_convert_encoding($result, "utf-8" , "gb2312"); // エンコーディング変換、それ以外の場合は文字化けします
  50. preg_match("@(.*)< ;/p>@iU",$result,$ipArray);
  51. $loc = $ipArray[1];
  52. return $loc;
  53. }
  54. コードをコピー

/********注記: 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: WINDOWSsystem32 にコピーします。Linux では、curl

  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 =explode(" ", $IP_str);
  7. $IP_city = iconv(" GBK" , "UTF-8", $IP_tmp[5]);
  8. return $IP_city;
  9. }
  10. //Youdao 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."." echo "火星から来たネチズン";
  28. }
  29. public function sinaIPApi($ip){
  30. $str = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php ?ip=".$ ip);
  31. $str = iconv("gbk", "utf-8//IGNORE", $str);
  32. preg_match_all("/[x{4e00}-x{9fa5}]+/ u",$str, $get);
  33. $add = implode('',$get[0]);
  34. return $add;
  35. }
  36. //$get は優れた 2 次元配列です
コードをコピーしてください
Sina API は、Tencent API と同様に file_get_contents() 関数を使用してアドレスを取得し、それを処理するために正規表現を使用して、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) "中国地質大学" } }、および関数の結果出力は「北京教育ネットワーク学校中国地質大学、北京、中国」です。私のアイデアや方法が他の人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。