web-dev-qa-db-ja.com

PHPを使用してIPアドレスの国を取得する

理想的には、任意のWebブラウザーから照会できるPHPスクリプトを作成しようとしており、PHPスクリプトにアクセスしたIPアドレスの国を返します。

これは可能ですか、またはより良い解決策はありますか?

90
Tristan

次のような、無料で簡単に使用できるAPIがあります。

どれが最も信頼できるように見えるかはあなた次第です:)

それ以外の場合は、サーバー上のローカルデータベースに基づいたスクリプトがあります。ただし、データベースデータは定期的に更新する必要があります。これをチェックしてください:

HTH!

編集:そしてもちろん、プロジェクトによっては HTML5の場所 の機能を見たいかもしれません。 Internet Explorerではまだ使用できません(IE9がサポートしていますので、まだまだ先の話です)が、視聴者が主にモバイルデバイスを使用している場合やSafari/Firefoxを使用している場合は、ぜひご覧ください。

座標を取得したら、国コードに逆ジオコーディングできます。この場合も、次のようなAPIがあります。

2013年4月更新
今日は Geocoder 、PHPライブラリを使用することをお勧めします。これにより、IPアドレスと郵便住所データのジオコーディングが非常に簡単になります。

*** 2016年9月更新
Googleのプライバシーポリシーが変更されたため、サーバーにHTPPS証明書がない場合、またはユーザーが場所の確認を許可していない場合、HTML5 Geolocation APIを使用できません。したがって、ユーザーのIPを使用してPHPにチェックインするか、HTTPS証明書を取得できます。

88
sprain

これを行うためのさまざまなWeb APIがあります。以下に、私のサービス http://ipinfo.io を使用した例を示します。

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $details->country; // -> "US"

Web APIは素晴らしく迅速で簡単な解決策ですが、多くのルックアップを行う必要がある場合は、IP->国データベースを自分のマシンに持つ方がより良い解決策です。 MaxMindは、 GeoIP を含むさまざまなPHPライブラリで使用できる 無料データベース を提供します。

54
Ben Dowling

MaxMindからip-tablesをダウンロードできます。

http://www.maxmind.com/app/geolite

CSVをデータベースにインポートします(ip_long_from + ip_long_toのインデックスを作成してください)。それからあなたは単にすることができます:

$iplong = ip2long($_SERVER['REMOTE_ADDR']);

// should use mysqli with prepared statements etc, but just an example
mysql_query("
    SELECT country
    FROM ip_table
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to
    LIMIT 1
");
25
quano

http://www.geoplugin.net/json.gp を使用した例を次に示します

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
10
channasmcs

これでIPアドレスから国を取得できます location API

コード

    echo file_get_contents('https://ipapi.co/8.8.8.8/country/');

応答

   US 

フィドル です。特定のフィールドをクエリしたときの応答はtextです。 countryこちら。デコードは不要で、コードにプラグインするだけです。

追伸すべてのフィールドが必要な場合(例: https://ipapi.co/8.8.8.8/json/、応答はJSONです。

6
Francis

たくさんの答えがありますが、誰も言及していません https://freegeoip.net/

15,000 queries per hourまで許可されています。ほとんどの場合、これで十分だと思います。それ以外の場合は、 MaxMind GeoIP のローカルデータベースの使用を検討する必要があります。

Freegeoipはopen-sourceであり、 github でソースを見つけて、ローカルに展開し、クエリの制限を取り除きます。

また、サービスは緯度/経度/タイムゾーンおよびその他の有用なものを提供します。

5
ivan.mylyanyk

「その他の基本的な拡張機能」の下のGeoIP機能を見てください。 http://php.net/manual/en/book.geoip.php

5
John Franklin
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))

国コードを取得します。

4
Mohammad Anini

可能であれば PHPのGeoIP拡張機能 をインストールして使用します。 debian lennyの場合:

Sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
Sudo gunzip GeoLiteCity.dat.gz
Sudo mkdir -v /usr/share/GeoIP
Sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

Sudo apt-get install php5-geoip
# or Sudo apt-get install php-geoip for PHP7

次に、PHPで試してください。

$ip = $_SERVER['REMOTE_ADDR'];
$country = geoip_country_name_by_name($ip);
echo 'The current user is located in: ' . $country;

返却値:

The current user is located in: Cameroon
2
che-azeh

IPLocate.io でサービスを実行します。これは、1つの簡単な呼び出しで無料でフックできます。

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

$resオブジェクトには、countrycityなどのジオロケーションフィールドが含まれます。

詳細については docs をご覧ください。

1
ttarik

https://ip-api.io/ を使用して、国名、都市名、緯度と経度を取得できます。 IPv6をサポートしています。

おまけとして、IPアドレスがtorノード、パブリックプロキシ、またはスパマーであるかどうかがわかります。

PHPコード:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

出力:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"Zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}
1

パフォーマンスを向上させ、Webサイトから外部サービスを要求しないために、適切で更新されたデータベースが必要な場合、 here 更新された正確なデータベースをダウンロードするのに適した場所があります。

私の経験では、他のほとんどのデータベース/ APIが私の場所を含める/報告することができなかった私のIPの都市と国の場所を含めても優れた動作をしていたため、これをお勧めします このサービス このデータベース。
(私のIPロケーションは、テスト中に「イラン」の「Rasht」市からで、IPは2.187.21.23545815275と同じでした)

したがって、どのサービスがより正確かわからない場合は、これらのサービスを使用することをお勧めします。

データベース: http://lite.ip2location.com/databases

APIサービス: http://ipinfodb.com/ip_location_api.php

1

ジオロケーションリクエスト用の別の無料APIは次のとおりです。 http://geoip.nekudo.com

応答はJSON形式です。さらに、独自のAPIをセットアップする必要がある場合に備えて、githubでAPIソースコードを利用できます。

1
nekudo

Ipdata.co は、これを行うためのスケーラブルなAPIを提供します。 10個のグローバルエンドポイントがそれぞれ8億件以上のリクエストを毎日処理できます!

また、任意のIPv4またはIPv6アドレスからの組織、通貨、タイムゾーン、呼び出しコード、フラグ、およびTor Exit Nodeステータスデータも提供します。

PHPで

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->location;
37.405991,-122.078514

免責事項

このサービスを構築しました。

1
Jonathan

このブログ投稿は非常に役に立ちました。それは私の一日を救った。 http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

基本的に、IPデータベーステーブルをインストールしてから、場所のIPに対してmysqlクエリを実行する必要があります。

<?php
include 'config.php';
mysql_connect(DB_Host, DB_USER, DB_PASSWORD) OR die(mysql_error());
mysql_select_db(DB_NAME) OR die(mysql_error());
$ip =  $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";
$result = mysql_query($sql) OR die(mysql_error());
$ip_detail = mysql_fetch_assoc($result);
if($ip_detail){
    echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city'];
}
else{
    //Something wrong with IP
}
1
Webby

ウィジェット www.feedsalive.com を使用して、国情報と最終ページ情報も取得します。

0
Sha

https://www.geoip-db.com のサービスを試すことができます。これらはJSONまたはJSONPコールバックソリューションを提供します。

<?php

    $json = file_get_contents("https://www.geoip-db.com/json");
    $data = json_decode($json);

    print $data->country_code . "<br>";
    print $data->country_name . "<br>";
    print $data->state . "<br>";
    print $data->city . "<br>";
    print $data->postal . "<br>";
    print $data->latitude . "<br>";
    print $data->longitude . "<br>";
    print $data->IPv4 . "<br>";

?>