560

JavaScript を使用してクライアントの IP アドレスを取得する必要があります。サーバー側のコードはなく、SSI もありません。

ただし、無料のサードパーティのスクリプト/サービスを使用することに反対しているわけではありません。

4

48 に答える 48

305

2021年更新:

最近、新しい Github リポジトリwebrtc-ipで示されているように、WebRTC を使用してユーザーのパブリックIP アドレスをリークできるようになりました。残念ながら、mDNS への段階的な移行 (少なくとも WebRTC の場合) により、このリークはプライベート IP では機能しません。ここで完全に説明されています。ただし、動作するデモは次のとおりです。

getIPs().then(res => document.write(res.join('\n')))
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js"></script>

このリポジトリ用にコンパイルされたソース コードは、ここにあります。




(以前)最終更新

ブラウザーが webrtc リークを修正しているため、このソリューションは機能しなくなります。詳細については、この他の質問をお読みください: RTCIceCandidate が IP を返さなくなりました


更新:私は常にコードの最小/醜いバージョンを作成したかったので、ES6 Promise コードは次のとおりです。

var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})

/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e))

注:この新しい縮小コードは、ユーザーのすべての IP が必要な場合(ネットワークによってはさらに多くなる可能性があります)、単一の IP のみを返します。元のコードを使用してください...


WebRTCのおかげで、WebRTC がサポートされているブラウザーでローカル IP を取得するのは非常に簡単です (少なくとも今のところ)。ソース コードを変更し、行を減らしました。パブリック IP ではなくローカル IP のみが必要なため、スタン リクエストは行いません。以下のコードは最新の Firefox と Chrome で動作します。スニペットを実行して自分で確認してください。

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
  var pc = new myPeerConnection({iceServers: []}),
    noop = function() {},
    localIPs = {},
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
    key;

  function ipIterate(ip) {
    if (!localIPs[ip]) onNewIP(ip);
    localIPs[ip] = true;
  }
  pc.createDataChannel(""); //create a bogus data channel
  pc.createOffer(function(sdp) {
    sdp.sdp.split('\n').forEach(function(line) {
      if (line.indexOf('candidate') < 0) return;
      line.match(ipRegex).forEach(ipIterate);
    });
    pc.setLocalDescription(sdp, noop, noop);
  }, noop); // create offer and set local description
  pc.onicecandidate = function(ice) { //listen for candidate events
    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
  };
}



var ul = document.createElement('ul');
ul.textContent = 'Your IPs are: '
document.body.appendChild(ul);

function addIP(ip) {
  console.log('got ip: ', ip);
  var li = document.createElement('li');
  li.textContent = ip;
  ul.appendChild(li);
}

findIP(addIP);
<h1> Demo retrieving Client IP using WebRTC </h1>

ここで何が起こっているかというと、ダミーのピア接続を作成していて、リモート ピアが私たちに連絡するために、通常はお互いに氷の候補を交換しています。そして、氷の候補 (ローカル セッションの説明と onIceCandidateEvent から) を読み取ると、ユーザーの IP がわかります。

コードを取得した場所 -->ソース

于 2015-09-29T10:03:00.370 に答える
174

JSONPを使用してサーバー側を介して中継できます

そして、グーグルで検索しているときに、ここで見つけましたSO Can I perform a DNS lookup (hostname to IP address) using client-side Javascript?

<script type="application/javascript">
    function getip(json){
      alert(json.ip); // alerts the ip address
    }
</script>

<script type="application/javascript" src="http://www.telize.com/jsonip?callback=getip"></script>

注: telize.com API は、2015 年 11 月 15 日に完全に終了しました

于 2009-05-01T07:02:03.670 に答える
112

ここでの回答のほとんどは、サーバー側のコードの必要性を「回避」することで...他の誰かのサーバーにヒットします。サーバーにアクセスせずに実際にIP アドレスを取得する必要がない限り、これは完全に有効な手法です。

従来、これは何らかのプラグインなしでは不可能でした (それでも、NAT ルーターの背後にいる場合は間違ったIP アドレスを取得する可能性があります) が、WebRTC の出現により、実際にこれを行うことが可能になりました.. . WebRTC をサポートするブラウザー(現在: Firefox、Chrome、Opera)をターゲットにしている場合。

WebRTC を使用して有用なクライアント IP アドレスを取得する方法の詳細については、 mido の回答をお読みください。

于 2008-12-24T18:25:00.650 に答える
92

できません。サーバーに問い合わせる必要があります。

于 2015-04-09T03:09:47.510 に答える
82

hostip.info または同様のサービスへの ajax 呼び出しを行うことができます...

function myIP() {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.open("GET","http://api.hostip.info/get_html.php",false);
    xmlhttp.send();

    hostipInfo = xmlhttp.responseText.split("\n");

    for (i=0; hostipInfo.length >= i; i++) {
        ipAddress = hostipInfo[i].split(":");
        if ( ipAddress[0] == "IP" ) return ipAddress[1];
    }

    return false;
}

おまけとして、ジオローカリゼーション情報が同じ呼び出しで返されます。

于 2011-03-08T22:21:18.237 に答える
21

このコードをページに含めます:<script type="text/javascript" src="http://l2.io/ip.js"></script>

ここでより多くのドキュメント

于 2012-06-16T13:56:39.073 に答える
16

チャドとマルタには素晴らしい答えがあると思います。しかし、それらは複雑です。だから私は国のプラグインによる広告から見つけたこのコードを提案します

<script>
<script language="javascript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="javascript">
mmjsCountryCode = geoip_country_code();
mmjsCountryName = geoip_country_name();

</script>

アヤックスなし。ただのJavaScriptです。:D

http://j.maxmind.com/app/geoip.jsにアクセスすると、含まれていることがわかります。

function geoip_country_code() { return 'ID'; }
function geoip_country_name() { return 'Indonesia'; }
function geoip_city()         { return 'Jakarta'; }
function geoip_region()       { return '04'; }
function geoip_region_name()  { return 'Jakarta Raya'; }
function geoip_latitude()     { return '-6.1744'; }
function geoip_longitude()    { return '106.8294'; }
function geoip_postal_code()  { return ''; }
function geoip_area_code()    { return ''; }
function geoip_metro_code()   { return ''; }

まだ質問に答えていないので、

http://j.maxmind.com/app/geoip.jsには IP が含まれていません (国を取得するために IP を使用していると思いますが)。

しかし、次のようなポップアップを表示する PhP スクリプトを作成するのはとても簡単です。

function visitorsIP()   { return '123.123.123.123'; }

それを作る。http://yourdomain.com/yourip.phpに置きます。

それからする

<script language="javascript" src="http://yourdomain.com/yourip.php"></script>

質問では、サードパーティのスクリプトを使用しないように特に言及しています。他に方法はありません。Javascript はあなたの IP を知ることができません。ただし、javascript を介してアクセスできる他のサーバーは問題なく動作します。

于 2012-09-07T09:01:37.087 に答える
14

何らかの外部サービスを使用しない限り、一般的には不可能です。

于 2008-12-24T18:25:06.280 に答える
14

さて、私は質問から逸脱していますが、今日も同様のニーズがあり、Javascriptを使用してクライアントからIDを見つけることができませんでしたが、次のことを行いました.

サーバー側: -

<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>

Javascript の使用

var ip = $get("uip").innerHTML;

ASP.Net Ajax を使用していますが、$get() の代わりに getElementById を使用できます。

何が起こっているのかというと、サーバーからレンダリングされたユーザーの IP を持つページに非表示の div 要素があります。Javascript よりも、その値をロードするだけです。

これは、あなたのような同様の要件を持つ一部の人々に役立つかもしれません (私がこれを理解していなかったときのように)。

乾杯!

于 2009-01-04T12:07:52.470 に答える
13

訪問者に許可を求めない、より簡単で無料のアプローチがあります。

非常に単純な Ajax POST リクエストをhttp://freegeoip.net/jsonに送信するだけです。JSON で位置情報を受け取ったら、それに応じてページを更新するか、新しいページにリダイレクトします。

位置情報のリクエストを送信する方法は次のとおりです。

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );
于 2015-12-03T11:50:59.463 に答える
13

Smart-IP.net Geo-IP APIを使用して。たとえば、jQuery を使用すると、次のようになります。

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});
于 2012-02-27T23:00:00.777 に答える
11

api.ipify.orgHTTP と HTTPS の両方をサポートしているので、とても気に入っています。

api.ipify.orgjQuery を使用して IP を取得する例を次に示します。

HTTPS 経由の JSON 形式

https://api.ipify.org?format=json

$.getJSON("https://api.ipify.org/?format=json", function(e) {
    alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

HTTP 経由の JSON 形式

http://api.ipify.org?format=json

$.getJSON("http://api.ipify.org/?format=json", function(e) {
    alert(e.ip);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

HTTPS 経由のテキスト形式

JSON にしたくない場合は、HTTPS を介したプレーンテキストの応答もあります

https://api.ipify.org

HTTP 経由のテキスト形式

また、HTTP 経由のプレーンテキスト応答もあります。

http://api.ipify.org
于 2016-03-25T16:26:11.917 に答える
10

userinfo.io JavaScript ライブラリを使用できます。

<script type="text/javascript" src="userinfo.0.0.1.min.js"></script>

UserInfo.getInfo(function(data) {
  alert(data.ip_address);
}, function(err) {
  // Do something with the error
});

また、requirejs を使用してスクリプトをロードすることもできます。

訪問者の IP アドレスと、その場所 (国、都市など) に関するいくつかのデータが提供されます。maxmind geoip データベースに基づいています。

免責事項:私はこのライブラリを書きました

于 2014-09-21T05:37:10.077 に答える
9

jQuery で IP を取得する

JSの1行でパブリックIPアドレスを取得できますか? これを提供する無料のサービスがあり、get リクエストを実行するだけで済みます。

   $.get('http://jsonip.com/', function(r){ console.log(r.ip); });

上記のスニペットが機能するには、ブラウザーが CORS (クロスオリジン要求共有) をサポートしている必要があります。そうしないと、セキュリティ例外がスローされます。古いブラウザでは、JSON-P リクエストを使用するこのバージョンを使用できます。

   $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });
于 2014-03-11T06:38:26.437 に答える
8

クライアント コンピュータの IP アドレスを取得する確実な方法はありません。

これにはいくつかの可能性があります。ユーザーが複数のインターフェースを持っている場合、Java を使用するコードは機能しなくなります。

http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html

ここで他の回答を見ると、クライアントのパブリック IP アドレスを取得する必要があるように思えます。これは、おそらくインターネットへの接続に使用しているルーターのアドレスです。ここでの他の多くの回答がそれについて語っています。引き続き機能するかどうかにかかわらず、他の誰かのサービスに依存するのではなく、リクエストを受信して​​ IP アドレスで応答するための独自のサーバー サイド ページを作成してホストすることをお勧めします。

于 2008-12-24T18:28:50.423 に答える
8

Javascript / jQueryはクライアントのIPアドレスと場所(国、都市)を取得します

サーバーへの「src」リンクを含むタグを埋め込むだけです。サーバーは「codehelper_ip」を Object / JSON として返すので、すぐに使用できます。

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?js"></script>
// You can use it
<script language="Javascript">
    alert(codehelper_ip.IP);
    alert(codehelper_ip.Country);
</script>

詳細については、Javascript Detect Real IP Address Plus Country を参照してください。

jQuery を使用している場合は、次を試すことができます。

console.log(codehelper_ip); 

返されたオブジェクトに関する詳細情報が表示されます。

コールバック関数が必要な場合は、これを試してください:

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?callback=yourcallback"></script>
// You can use it
<script language="Javascript">
    function yourcallback(json) {
       alert(json.IP);
     }
</script>
于 2013-07-22T23:56:13.977 に答える
8

HTMLページに情報を保存したいときによく使用するメソッドを提供し、JavaScriptにパラメーターを実際に渡すことなくJavaScriptに情報を読み取らせます。これは、スクリプトがインラインではなく外部から参照される場合に特に便利です。

ただし、「サーバー側スクリプトなし」の基準を満たしていません。しかし、HTML にサーバー側スクリプトを含めることができる場合は、次のようにします。

HTML ページの下部、body タグのすぐ上に非表示のラベル要素を作成します。

ラベルは次のようになります。

<label id="ip" class="hiddenlabel"><?php echo $_SERVER['REMOTE_ADDR']; ?></label>

という名前のクラスを作成し、実際にラベルが表示されないようhiddenlabelに設定してください。visibility:hiddenこの方法で、隠しラベルに多くのものを保存できます。

JavaScript で、ラベルに保存されている情報 (この場合はクライアントの IP アドレス) を取得するには、次のようにします。

var ip = document.getElementById("ip").innerHTML;

これで、変数「ip」が IP アドレスと等しくなります。これで、IP を API リクエストに渡すことができます。

* 2 年後に編集 * 2 つのマイナーな改良:

class="data"私は日常的にこのメソッドを使用していますが、実際にはデータを保存する方法であるため、label を呼び出します。クラス名 "hiddenlabel" はちょっとばかげた名前です。

2 番目の変更は、次の代わりにスタイル シートにありvisibility:hiddenます。

.data{
    display:none;
}

...それを行うより良い方法です。

于 2012-07-09T14:34:07.547 に答える
8

Appspot.com コールバックのサービスは利用できません。ipinfo.io は機能しているようです。

追加の手順を実行し、AngularJS を使用してすべての地理情報を取得しました。(Ricardo さんに感謝) 見てください。

<div ng-controller="geoCtrl">
  <p ng-bind="ip"></p>
  <p ng-bind="hostname"></p>
  <p ng-bind="loc"></p>
  <p ng-bind="org"></p>
  <p ng-bind="city"></p>
  <p ng-bind="region"></p>
  <p ng-bind="country"></p>
  <p ng-bind="phone"></p>
</div>
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular-route.min.js"></script>
<script>
'use strict';
var geo = angular.module('geo', [])
.controller('geoCtrl', ['$scope', '$http', function($scope, $http) {
  $http.jsonp('http://ipinfo.io/?callback=JSON_CALLBACK')
    .success(function(data) {
    $scope.ip = data.ip;
    $scope.hostname = data.hostname;
    $scope.loc = data.loc; //Latitude and Longitude
    $scope.org = data.org; //organization
    $scope.city = data.city;
    $scope.region = data.region; //state
    $scope.country = data.country;
    $scope.phone = data.phone; //city area code
  });
}]);
</script>

ここの作業ページ: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

于 2014-02-12T00:06:47.997 に答える
7

どこかで NGINX を使用している場合は、このスニペットを追加して、任意の AJAX ツールを介して独自のサーバーに問い合わせることができます。

location /get_ip {
    default_type text/plain;
    return 200 $remote_addr;
}
于 2016-12-07T14:23:22.403 に答える
7

まず、実際の答え:純粋にクライアント側で実行されるコードを使用して、自分の IP アドレスを見つけることはできません。

ただし、 https: //api.muctool.de/whois に対して GET を実行するだけで、クライアントの IP アドレスを取得するようなものを受け取ることができます。

{
"ip": "88.217.152.15",
"city": "Munich",
"isp": "M-net Telekommunikations GmbH",
"country": "Germany",
"countryIso": "DE",
"postalCode": "80469",
"subdivisionIso": "BY",
"timeZone": "Europe/Berlin",
"cityGeonameId": 2867714,
"countryGeonameId": 2921044,
"subdivisionGeonameId": 2951839,
"ispId": 8767,
"latitude": 48.1299,
"longitude": 11.5732,
"fingerprint": "61c5880ee234d66bded68be14c0f44236f024cc12efb6db56e4031795f5dc4c4",
"session": "69c2c032a88fcd5e9d02d0dd6a5080e27d5aafc374a06e51a86fec101508dfd3",
"fraud": 0.024,
"tor": false
}
于 2018-04-15T13:47:22.257 に答える
5

js が呼び出すことができる Flash オブジェクトを使用して、これを完全にクライアント側で、ほとんど JavaScript で行うことができます。Flashはローカル マシンの IP アドレスにアクセスできますが、これはあまり役に立ちません。

于 2014-07-14T20:23:32.883 に答える
4

次のような Web サービスを使用できます: http://ip-api.com/

例:

<script type="text/javascript" src="http://ip-api.com/json/?callback=foo">
<script>
    function foo(json) {
        alert(json.query)
    }
</script>

additional example: http://whatmyip.info    
于 2014-05-28T12:51:40.533 に答える
3
<script type="text/javascript" src="http://l2.io/ip.js?var=myip"></script>
    <script>
        function systemip(){
        document.getElementById("ip").value = myip
        console.log(document.getElementById("ip").value)
        }
    </script>
于 2014-12-30T17:09:26.750 に答える
2

ここで見た他のサービスの問題の 1 つは、それらが IPv6 をサポートしていないか、IPv6 の存在下で予期しない動作をすることです。

デュアル スタック環境でこの機能が必要だったので、独自の IP アドレス サービスを作成しました。これはhttp://myip.addr.space/にあります。/helpにもクイック リファレンスがあります。

jQuery で使用するには、/ipエンドポイントを使用します。使用するサブドメインに応じて、IP アドレスを含むプレーン テキストが返されます。

$.get("http://myip.addr.space/ip")システムで利用できるものに応じて、IPv6 または IPv4 のいずれかを返します。( JSFiddle )

$.get("http://ipv4.myip.addr.space/ip")常に IPv4 を返します (IPv4 がない場合は失敗します)。

$.get("http://ipv6.myip.addr.space/ip")常に IPv6 を返します (IPv6 がない場合は失敗します)。

于 2015-11-18T08:49:11.917 に答える
2

上記のすべての回答には、純粋なクライアント部分ではなく、サーバー部分があります。これは、Web ブラウザーによって提供される必要があります。現在、これをサポートする Web ブラウザはありません。

ただし、Firefox 用のアドオン: https://addons.mozilla.org/en-US/firefox/addon/ip-address/ ユーザーにこのアドオンをインストールするように依頼する必要があります。(第三者の私からでも結構です)。

ユーザーがインストールしたかどうかをテストできます。

var installed=window.IP!==undefined;

インストールされている場合は、javascriptで取得できます。その後、 var ip=IP.getClient(); var IPclient=ip.IP; //一方、ip.url は URL です

ip=IP.getServer();
var IPserver=ip.IP;
var portServer=ip.port;
//while ip.url is the url

//or you can use IP.getBoth();

詳細はこちら: http://www.jackiszhp.info/tech/addon.IP.html

于 2013-02-12T04:46:12.827 に答える
1
$.getJSON("http://jsonip.com?callback=?", function (data) {
    alert("Your ip: " + data.ip);
});
于 2014-06-16T09:23:12.933 に答える
1

私は JavaScript の第一人者ではありませんが、可能であれば、http: //www.whatismyip.com/automation/n09230945.asp をソースとして iframe を開き、フレームの内容を読み取ることができます。

編集:クロスドメインセキュリティのため、これは機能しません。

于 2008-12-24T18:38:51.730 に答える
-1
<script type="application/javascript">
  function getip(json)
  {
     alert(json.ip); 
  }

 <script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>

上記のスクリプトを実行ここをクリック

于 2013-11-13T12:10:25.040 に答える
-1

HTMLでスクリプトをインポートすると...

<script type="text/javascript" src="//stier.linuxfaq.org/ip.php"></script>

その後、変数 userIP (訪問者の IP アドレス) をページのどこでも使用できます。

リダイレクトするには:

<script>
if (userIP == "555.555.555.55") {window.location.replace("http://192.168.1.3/flex-start/examples/navbar-fixed-top/");}
</script>

または、ページに表示するには:document.write (userIP);

免責事項: 私はインポートすると言ったスクリプトの作成者です。スクリプトは、PHP を使用して IP を取得します。スクリプトのソースコードは以下です。

<?php 
//Gets the IP address
$ip = getenv("REMOTE_ADDR") ; 
Echo "var userIP = '" . $ip . "';"; 
?>
于 2015-02-18T18:22:19.387 に答える
-3

telizeの api サービスを使用できます

クライアントのパブリック IP だけが必要な場合は、次のようにします。

var ip = "http://www.telize.com/ip";
var response = http.request({url: ip});

場所などの詳細が必要な場合は、次のようにします。

var ipAndGeoDetails = "http://www.telize.com/geoip/"
var response = http.request({url: ipAndGeoDetails});

: telize のパブリック API は、2015 年 11 月 15 日に完全にシャットダウンされます。

于 2015-09-15T00:03:44.647 に答える