web-dev-qa-db-ja.com

IPアドレスから郵便番号と都市を特定する方法は?

地域固有のWebサイトコンテンツを作成するために、IPアドレスを郵便番号と都市に変換するのに役立つオープンAPIまたはサードパーティ製品のアドバイスを探しています。

52
Irena

私が使用しているのはip2nation: http://www.ip2nation.com

これは、IPから国へのマッピングの完全に無料のMySQLデータベースです。彼らのサイトにはいくつかのサンプルPHPスクリプトが含まれています。

WordPress=ブログとOzhの無料 IP to Nation WordPressプラグイン

WordPressを使用していない場合でも、プラグインをダウンロードすると、データベースにアクセスするためのPHPコードの適切なセットが提供されます。国名の横に、または国名の代わりに表示します。これは、ブログのコメント投稿者の名前の横に自動的にフラグを表示するために行います。

本当に、このためのAPIは必要ありません。必要なのは、データベースと、それにアクセスするためのPHPとSQLコードを記述する機能のみです。

カジュアルな使用にはip2locationをお勧めしません。彼らはデータベースに多くの費用をかけており、データベースは非常に大きく、ほとんどの人が必要とするよりも詳細になっています。

ただし、ip2nationは国レベルにのみ移動します。都市と郵便番号が必要な場合(他の回答/コメントが述べているように間違っている可能性があるという事実にもかかわらず)、ip2locationに加えて、 GeoBytesを試すことができます 。 GeoSelectなど、地理固有のWebサイトコンテンツに特に適したコンポーネントがあります。 http://www.geobytes.com/GeoSelect.htm

Googleで「ip to zipcode」を検索

12
lkessler

私が見つけた最良の(統合が簡単で無料の)方法が利用可能です こちら 。このサービスは完全に無料で、ローカルインストールを必要とせず、サイトにバナーを配置することを強制しません(IP2Locationとは異なります)。唯一の制限であるクエリ制限は非常に合理的です。2秒ごとにクエリを実行でき、より頻繁にクエリを実行しても、結果が少し遅くなります。楽しい!

10
7
BobbyShaftoe

IPアドレスから場所を取得したいすべてのユーザーが、この小さなコードを使用して適切なソリューションを得られることを願っています。

$ip_addr = $_SERVER['REMOTE_ADDR'];
$geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip_addr) );

if ( is_numeric($geoplugin['geoplugin_latitude']) && is_numeric($geoplugin['geoplugin_longitude']) ) {
    $lat = $geoplugin['geoplugin_latitude'];
    $long = $geoplugin['geoplugin_longitude'];
}
3
Kapil

Geocoder.ca は、IPアドレスに関する多くの情報を提供します(北米のみ)。例 http://geocoder.ca/99.229.2.190?geoit=xml (サポートgeoit = jsonおよびjsonp)

<result>
<geodata>
  <latt>43.623262</latt>
  <longt>-79.749543</longt>
  <city>MISSISSAUGA</city>
  <prov>ON</prov>
  <postal>L5N7Z9</postal>
  <stnumber>1837</stnumber>
  <staddress>Samuelson CIR</staddress>
  <TimeZone>America/Toronto</TimeZone>
  <AreaCode>289</AreaCode>
  <confidence>1</confidence>
  <intersection>
    <street1>Samuelson Cir</street1>
    <street2>Stockbridge Crt</street2>
    <lattx>43.622696</lattx>
    <longtx>-79.748706</longtx>
    <city>MISSISSAUGA</city>
    <prov>ON</prov>
    <distance>0.179</distance>
  </intersection>
 </geodata>
 </result>
1
Ervin Ruci

以下は、 http://ipinfodb.com/ip_locator.php を使用して情報を取得するスニペットの修正版です。 APIキーを一緒に申請し、APIを直接使用して、必要に応じて提供された情報を取得することもできます。 http://ipinfodb.com/ip_location_api.php を見るとわかるように、PHPからJavaScript、ASP.Netまで、すべてにサンプルがあります。以下はキーを必要としません。公開ページと正規表現がページを介してプルされ、指定された情報を取得します。キーは無料です。

スニペット

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_Host'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['Zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

使用する

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["Zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.Host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["Zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.Host.name.net" }
0
SpYk3HH

Rubyで...これらは手順です

  1. Gem geocoderをインストールする_gem install geocoder_
  2. Rubyスクリプトでは、これらの行があります。

    _require "geocoder"_

    puts Geocoder.address('76.95.251.102'); // IPアドレスを適宜変更します。

  3. スクリプトを実行して、都市、州、郵便番号、国を取得します

_output: Bellflower, CA 90706, United States_

0