PHPを使用してIPアドレスの国を取得する
理想的には、任意のWebブラウザーから照会できるPHPスクリプトを作成しようとしており、PHPスクリプトにアクセスしたIPアドレスの国を返します。
これは可能ですか、またはより良い解決策はありますか?
次のような、無料で簡単に使用できるAPIがあります。
- http://ipinfodb.com/ip_location_api.php
- http://www.ipgeo.com/api/
- http://ip2.cc/
- http://www.geobytes.com/IpLocator.htm
- https://iplocate.io/
- 他にもたくさん。
どれが最も信頼できるように見えるかはあなた次第です:)
それ以外の場合は、サーバー上のローカルデータベースに基づいたスクリプトがあります。ただし、データベースデータは定期的に更新する必要があります。これをチェックしてください:
HTH!
編集:そしてもちろん、プロジェクトによっては HTML5の場所 の機能を見たいかもしれません。 Internet Explorerではまだ使用できません(IE9がサポートしていますので、まだまだ先の話です)が、視聴者が主にモバイルデバイスを使用している場合やSafari/Firefoxを使用している場合は、ぜひご覧ください。
座標を取得したら、国コードに逆ジオコーディングできます。この場合も、次のようなAPIがあります。
- 例: http://ws.geonames.org/countryCode?lat=47.03&lng=10.2
- その他のAPI: http://www.geonames.org/export/ws-overview.html
2013年4月更新
今日は Geocoder 、PHPライブラリを使用することをお勧めします。これにより、IPアドレスと郵便住所データのジオコーディングが非常に簡単になります。
*** 2016年9月更新
Googleのプライバシーポリシーが変更されたため、サーバーにHTPPS証明書がない場合、またはユーザーが場所の確認を許可していない場合、HTML5 Geolocation APIを使用できません。したがって、ユーザーのIPを使用してPHPにチェックインするか、HTTPS証明書を取得できます。
これを行うためのさまざまな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ライブラリで使用できる 無料データベース を提供します。
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
");
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;
これで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
です。
たくさんの答えがありますが、誰も言及していません https://freegeoip.net/
15,000 queries per hour
まで許可されています。ほとんどの場合、これで十分だと思います。それ以外の場合は、 MaxMind GeoIP のローカルデータベースの使用を検討する必要があります。
Freegeoipはopen-sourceであり、 github でソースを見つけて、ローカルに展開し、クエリの制限を取り除きます。
また、サービスは緯度/経度/タイムゾーンおよびその他の有用なものを提供します。
「その他の基本的な拡張機能」の下のGeoIP機能を見てください。 http://php.net/manual/en/book.geoip.php
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
国コードを取得します。
可能であれば 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
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
オブジェクトには、country
、city
などのジオロケーションフィールドが含まれます。
詳細については docs をご覧ください。
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
}
パフォーマンスを向上させ、Webサイトから外部サービスを要求しないために、適切で更新されたデータベースが必要な場合、 here 更新された正確なデータベースをダウンロードするのに適した場所があります。
私の経験では、他のほとんどのデータベース/ APIが私の場所を含める/報告することができなかった私のIPの都市と国の場所を含めても優れた動作をしていたため、これをお勧めします このサービス このデータベース。
(私のIPロケーションは、テスト中に「イラン」の「Rasht」市からで、IPは2.187.21.235
が45815275
と同じでした)
したがって、どのサービスがより正確かわからない場合は、これらのサービスを使用することをお勧めします。
ジオロケーションリクエスト用の別の無料APIは次のとおりです。 http://geoip.nekudo.com
応答はJSON形式です。さらに、独自のAPIをセットアップする必要がある場合に備えて、githubでAPIソースコードを利用できます。
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
免責事項
このサービスを構築しました。
このブログ投稿は非常に役に立ちました。それは私の一日を救った。 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
}
ウィジェット www.feedsalive.com を使用して、国情報と最終ページ情報も取得します。
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>";
?>