IPアドレスの位置検出技術とは何ですか?
私は$_SERVER['HTTP_ACCEPT_LANGUAGE']
(正確ではありませんが、場所の検出に最も役立ちます。たとえば、IP範囲のユーザーがブラウザにフランス語を設定した場合、この範囲はフランスに属します)
そしてgethostbyaddr($_SERVER['REMOTE_ADDR'])
(国コードトップレベルドメインを検索するため)
それならwhoisgethostbyaddr($_SERVER['REMOTE_ADDR'])
かもしれません
時々:$HTTP_USER_AGENT
(Firefoxのユーザーエージェント文字列には言語コードがあり、正確ではありませんが、ほとんどの場合、場所の検出に使用できます)
また、タイムゾーンを取得する方法は知っていますが、新しいブラウザでは機能しません。さらに、訪問者の履歴を検出する css issue があり、訪問者がどのグーグルおよびウィキペディアのページにアクセスしたかを確認するために使用できます(google.co.uk、google.com.tr)
しかし、都市はどうですか?
IPアドレスを都市/国/プロバイダーにマップするデータベースなしではこれを行うことはできません。 ip2location などの商用製品があります。 ただし、このようなIPデータベースの保守は非常に手間がかかるため、無料の代替手段はありません。 無料の代替手段: GeoIP2
更新:十分な時間を費やすと、このようなデータベースを作成できるようになることがいくつかあります。
あなたがいくつかのコピーアンドペーストソリューションを探しているなら、私はこのコードを見つけました:
function countryCityFromIP($ipAddr)
{
//function to find country and city from IP address
//Developed by Roshan Bhattarai http://roshanbh.com.np
//verify the IP address for the
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
$ipDetail=array(); //initialize a blank array
//get the XML result from hostip.info
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr);
//get the city name inside the node <gml:name> and </gml:name>
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match);
//assing the city name to the array
$ipDetail['city']=$match[2];
//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);
//assign the country name to the $ipDetail array
$ipDetail['country']=$matches[1];
//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match);
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array
//return the array containing city, country and country code
return $ipDetail;
}
これが誰かに役立つことを願っています。
IPを都市に変換するために使用できるデータベースがあります(それらのいくつかは無料です):
データベースまたはAPI(ホストされたデータベース)のいずれかを使用して、IPアドレスをその場所(都市、国、郵便番号)、タイムゾーンなどにマップできます。
APIの使用例を次に示します
curl https://ipapi.co/city/
> Mountain View
curl https://ipapi.co/country/
> US
curl https://ipapi.co/timezone/
> America/Los_Angeles
詳細はこちら: IPアドレスからの場所
サードパーティのAPIを使用する代わりに、セルフホストのIPレコードを使用することをお勧めします。この投稿はあなたにもっと説明します
http://www.techsirius.com/2014/05/simple-geo-tracking-system.html
基本的に、彼らはmaxmindの国の都市のIPデータベースレコード[ http://dev.maxmind.com/geoip/geoip2/geolite2/] をほとんど変更せずに使用しています。その後、サンプルクエリ
$ip = $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";
Uはこの機能を使用できます
function ip_info(){
return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true);
}
関数を呼び出す
$info = ip_info();
var_dump($info);
既存のデータベースのほとんどは、国際レジストリARIN、AFRINIC、ANICなど、およびユーザーが送信した場所からのデータの集約を使用します。より洗練された手法には、トポロジと制約のジオロケーションが含まれます。
私は独自のAPIを実行しています ipdata.co 国、都市、地域、緯度/経度などを含むいくつかのデータポイントを提供します。
この回答では、非常に制限された「テスト」APIキーを使用しており、いくつかの呼び出しをテストすることのみを目的としています。 サインアップ 独自の無料APIキーを使用して、開発のために毎日最大1500件のリクエストを取得します。
php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211?api-key=test'),true);
php > echo $data['country_name'];
//United States
php > echo $data['city'];
//Albany
ジオロケーション機能がプロジェクトの大きな要件ではない場合は、次のような単純なものを使用できます。
$geotxt='';
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']));
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city;
echo $geotxt;
Freegeoipには1時間あたり10,000リクエストの制限があることを考慮に入れる必要があります。
これらのデータベースをコンパイルする1つの方法は、whois情報からです。たとえば、69.59.196.211の場所を特定するには、次のようにします。
fmark @ home:〜$ホスト69.59.196.211211.196.59.69.in-addr.arpaドメイン名ポインターstackoverflow.com。 fmark @ home:〜$ whois stackoverflow.com
Whoisサーバーバージョン2.0
.comおよび.netドメインのドメイン名は、多くの異なる競合するレジストラに登録できるようになりました。
<SNIP>
>登録者:stackoverflow.com llc
410 Clayton Ave El Cerrito、California 94530 United States<SNIP>
明らかにこれはそれほど正確ではないので、より洗練された技術が使用されていると言われています。