訪問者の都市、州、国などの情報を IP アドレスから取得して、場所に応じて Web ページをカスタマイズできるようにしたいと考えています。PHPでこれを行うための適切で信頼できる方法はありますか? クライアント側のスクリプトには JavaScript、サーバー側のスクリプトには PHP、データベースには MySQL を使用しています。
20 に答える
無料の GeoIP データベースをダウンロードして IP アドレスをローカルで検索するか、サード パーティのサービスを使用してリモート検索を実行することができます。これはセットアップが不要なため、より単純なオプションですが、追加のレイテンシが発生します。
使用できるサードパーティ サービスの 1 つは、私のhttp://ipinfo.ioです。ホスト名、位置情報、ネットワーク所有者、および追加情報を提供します。例:
$ curl ipinfo.io/8.8.8.8
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}
PHP の例を次に示します。
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"
クライアント側でも使用できます。簡単な jQuery の例を次に示します。
$.get("https://ipinfo.io/json", function (response) {
$("#ip").html("IP: " + response.ip);
$("#address").html("Location: " + response.city + ", " + response.region);
$("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>
<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>
誰もこの特定の API に関する情報を提供していないように見えるので投稿したいと思いましたが、それは私が求めているものとまったく同じものを返し、複数の形式で返すことができますjson, xml and csv
.
$location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
print_r($location);
これにより、必要になる可能性のあるすべてのものが得られます。
{
"ip": "77.99.179.98",
"country_code": "GB",
"country_name": "United Kingdom",
"region_code": "H9",
"region_name": "London, City of",
"city": "London",
"zipcode": "",
"latitude": 51.5142,
"longitude": -0.0931,
"metro_code": "",
"areacode": ""
}
https://geolocation-db.comのサービスを使用した純粋な Javascript の例。JSON および JSONP コールバック ソリューションを提供します。
- JSON: https://geolocation-db.com/json
- JSONP コールバック: https://geolocation-db.com/jsonp
jQuery不要!
<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
<div>Country: <span id="country"></span></div>
<div>State: <span id="state"></span></div>
<div>City: <span id="city"></span></div>
<div>Postal: <span id="postal"></span></div>
<div>Latitude: <span id="latitude"></span></div>
<div>Longitude: <span id="longitude"></span></div>
<div>IP address: <span id="ipv4"></span></div>
</body>
<script>
var country = document.getElementById('country');
var state = document.getElementById('state');
var city = document.getElementById('city');
var postal = document.getElementById('postal');
var latitude = document.getElementById('latitude');
var longitude = document.getElementById('longitude');
var ip = document.getElementById('ipv4');
function callback(data)
{
country.innerHTML = data.country_name;
state.innerHTML = data.state;
city.innerHTML = data.city;
postal.innerHTML = data.postal;
latitude.innerHTML = data.latitude;
longitude.innerHTML = data.longitude;
ip.innerHTML = data.IPv4;
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
var h = document.getElementsByTagName('script')[0];
h.parentNode.insertBefore(script, h);
</script>
</html>
Google API の使用:
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>
ipapi.coの API を使用してボットを作成しました。IP アドレス (例: 1.2.3.4
)の場所を で取得する方法は次のphp
とおりです。
ヘッダーを設定:
$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);
JSON レスポンスを取得する
echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);
特定のフィールドを取得する (国、タイムゾーンなど)
echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);
http://www.hostip.info/などの外部サービスを使用する必要があります。「geo-ip」を Google 検索すると、さらに多くの結果が得られます。
Host-IP API は HTTP ベースであるため、必要に応じて PHP または JavaScript で使用できます。
この質問は保護されており、私は理解しています。しかし、私はここで答えを見ません。私が見ているのは、多くの人が同じ質問から何を思いついたかを示していることです.
現在、IP 所有権に関する最初の連絡先として機能するさまざまな程度の機能を備えた 5 つの地域インターネット レジストリがあります。プロセスは流動的であるため、ここでのさまざまなサービスが機能する場合と機能しない場合があります。
Who Is は (明らかに) 古代の TCP プロトコルですが、元の動作方法はポート 43 への接続によるものでした。
現時点では、ほとんどの Who Is は RESTful HTTP と ARIN、RIPE、および APNIC で機能する RESTful サービスを介して行われます。LACNIC は 503 を返し、AfriNIC にはそのような API がないようです。(ただし、すべてオンライン サービスがあります。)
IP の登録所有者のアドレスを取得しますが、クライアントの場所ではありません。クライアントから取得する必要があり、また、それを要求する必要があります。また、発信者であると思われる IP を検証する際に、プロキシは最も心配する必要がありません。
人々は自分が追跡されているという考えを理解していないので、私の考えでは、クライアントから直接、許可を得てそれを取得し、多くの人がその考えに躊躇することを期待しています.
Maxmindの無料のGeoLite Cityが気に入っています。これは、ほとんどのアプリケーションで機能し、精度が不十分な場合は有料バージョンにアップグレードできます。他の言語と同様に、PHP APIが含まれています。また、Lighttpd を Web サーバーとして実行している場合は、必要に応じてモジュールを使用して、各訪問者の SERVER 変数の情報を取得することもできます。
無料のGeolite Country (IP の送信元の都市を特定する必要がない場合は高速です) と Geolite ASN (IP の所有者を知りたい場合) もあり、最終的にこれらはすべて独自のサーバーにダウンロード可能で、毎月更新され、提供されている API を使用すると、「1 秒あたり数千回のルックアップ」と記載されているため、非常に迅速にルックアップできます。
hostip.info の API を見てください。多くの情報が提供されています。
PHP での例:
$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"
$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...
hostip.info を信用すれば、とても便利な API になりそうです。
Ben Dowling の応答のサービスが変更されたため、よりシンプルになりました。場所を見つけるには、次のようにします。
// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city
座標は「31,-80」のような単一の文字列で返されるため、そこから次のようにします。
$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude
他のプロバイダーに依存せずに自分でやりたいと仮定すると、IP2Nationはマッピングの MySQL データベースを提供します。これは、地域のレジストリが変化するにつれて更新されます。
誰かがこのスレッドに出くわした場合に備えて、別の解決策があります。timezoneapi.ioでは、IP アドレスを要求し、その見返りとしていくつかのオブジェクトを取得できます (私はサービスを作成しました)。ユーザーがどのタイムゾーンにいて、世界のどこにいて、現在何時かを知る必要があったために作成されました。
PHP の場合 - 場所、タイムゾーン、日付/時刻を返します:
// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');
// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);
// Decode
$data = json_decode($jsondata, true);
// Request OK?
if($data['meta']['code'] == '200'){
// Example: Get the city parameter
echo "City: " . $data['data']['city'] . "<br>";
// Example: Get the users time
echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";
}
jQuery の使用:
// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){
// Request OK?
if(data.meta.code == '200'){
// Log
console.log(data);
// Example: Get the city parameter
var city = data.data.city;
alert(city);
// Example: Get the users time
var time = data.data.datetime.date_time_txt;
alert(time);
}
});
PHP にはそのための拡張機能があります。
PHP.net から:
GeoIP 拡張機能を使用すると、IP アドレスの場所を見つけることができます。都市、州、国、経度、緯度、および ISP や接続タイプなどのその他の情報はすべて、GeoIP を使用して取得できます。
例えば:
$record = geoip_record_by_name($ip);
echo $record['city'];
私は IP アドレス サービスを使ってたくさんのテストを行ってきました。まず、私が使用している便利な Web サイトへのリンクをいくつか紹介します。
https://db-ip.com/db 無料の ip-lookup サービスがあり、ダウンロードできる無料の csv ファイルがいくつかあります。これは、メールに添付されている無料の API キーを使用します。1 日あたり 2000 クエリに制限されています。
http://ipinfo.io/ API キーなしの無料の IP ルックアップ サービス PHP 関数:
//uses http://ipinfo.io/.
function ip_visitor_country($ip){
$ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
$ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use
//this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
return false;
}else{
return $ip_data;
}
}
function get_web_page($url){
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';
$options = array(
CURLOPT_CUSTOMREQUEST =>"GET", //set request type post or get
CURLOPT_POST =>false, //set to GET
CURLOPT_USERAGENT => $user_agent, //set user agent
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
$httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
curl_close( $ch );
$header['errno'] = $err; //curl error code
$header['errmsg'] = $errmsg; //curl error message
$header['content'] = $content; //the webpage result (In this case the ip data in json array form)
$header['httpcode'] = $httpCode; //the webpage response code
return $header; //return the collected data and response codes
}
最終的に、次のようなものが得られます。
Array
(
[ip] => 1.1.1.1
[hostname] => No Hostname
[city] =>
[country] => AU
[loc] => -27.0000,133.0000
[org] => AS15169 Google Inc.
)
http://www.geoplugin.com/ 少し古いですが、このサービスは、国外の通貨、大陸コード、経度など、さらに役立つ情報を提供します。
http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude データベースにインポートするための手順が記載されたダウンロード可能なファイルが多数提供されています。データベースにこれらのファイルが 1 つあれば、かなり簡単にデータを選択できます。
SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to
PHP 関数 ip2long(); を使用します。IP アドレスを数値に変換します。たとえば、1.1.1.1 は 16843009 になります。これにより、データベース ファイルによって指定された IP 範囲をスキャンできます。
したがって、1.1.1.1 がどこに属しているかを調べるには、次のクエリを実行するだけです。
SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;
これは、例としてこのデータを返します。
FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809
「スマート IP」サービスを使用することもできます。
$.getJSON("http://smart-ip.net/geoip-json?callback=?",
function (data) {
alert(data.countryName);
alert(data.city);
}
);
IP 地理位置情報を実行するには、2 つの広範なアプローチがあります。1 つは、データセットをダウンロードし、インフラストラクチャでホストして、最新の状態に維持することです。これには、特に多数のリクエストをサポートする必要がある場合に、時間と労力がかかります。もう 1 つの解決策は、すべての作業を管理する既存の API サービスを使用することです。
Maxmind、Ip2location、Ipstack、IpInfo など、多くの API Geolocation サービスが存在します。最近、私が勤務する会社がIpregistry ( https://ipregistry.co ) に切り替えられ、決定と実装プロセスに関与しました。IP ジオロケーション API を探す際に考慮すべき要素を次に示します。
- サービスは正確ですか?単一の情報源を使用していますか?
- 彼らは本当にあなたの負荷を処理できますか?
- 世界中で一貫した迅速な応答時間を提供していますか (ユーザーが特定の国に限定されている場合を除く)?
- 彼らの価格モデルは何ですか?
IP ジオロケーション情報を取得する例を次に示します (ただし、1 回の呼び出しを使用して脅威とユーザー エージェント データも取得します)。
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;
注: 私は Ipregistry を宣伝し、それが最高であると言うためにここにいるわけではありませんが、既存のソリューションの分析に長い時間を費やしましたが、そのソリューションは本当に有望です。