web-dev-qa-db-ja.com

IPアドレスの位置検出技術

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)

しかし、都市はどうですか?

19
ilhan

IPアドレスを都市/国/プロバイダーにマップするデータベースなしではこれを行うことはできません。 ip2location などの商用製品があります。 ただし、このようなIPデータベースの保守は非常に手間がかかるため、無料の代替手段はありません。 無料の代替手段: GeoIP2

更新:十分な時間を費やすと、このようなデータベースを作成できるようになることがいくつかあります。

  1. 地域およびローカルレジストリ によって提供されるデータベースを使用して、IPの所有者を見つけます。
  2. 多くのISPは、ユーザーを見つけることができる命名スキーマを使用しています。 DNSの逆引き検索を行うと、都市名をプレーンテキストで読み取ることもできます。時にはそれはもっと不可解です。たとえば、私は現在p5dcf6c4a.dip.t-dialin.netを持っていますが、命名スキームが..であるかどうかわかりません。
  3. Tracerouteを使用します。ユーザーの場所を特定できない場合でも、そのアップリンクの場所を見つけることができます
9
Tim Jansen

あなたがいくつかのコピーアンドペーストソリューションを探しているなら、私はこのコードを見つけました:

    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;

}

これが誰かに役立つことを願っています。

5
eric.itzhak

IPを都市に変換するために使用できるデータベースがあります(それらのいくつかは無料です):

例: http://www.maxmind.com/app/geolitecity

3
iNPUTmice

データベースまたは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アドレスからの場所

3
Alexis

サードパーティの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`";
1
Webby

Uはこの機能を使用できます

 function ip_info(){
            return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true);
        }

関数を呼び出す

$info = ip_info();
var_dump($info);
1
shah

既存のデータベースのほとんどは、国際レジストリ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
0
Jonathan

ジオロケーション機能がプロジェクトの大きな要件ではない場合は、次のような単純なものを使用できます。

$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リクエストの制限があることを考慮に入れる必要があります。

0
MazarD

これらのデータベースをコンパイルする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>

明らかにこれはそれほど正確ではないので、より洗練された技術が使用されていると言われています。

0
fmark