私はどういうわけかJavaScriptを使ってクライアントのIPアドレスを取得する必要があります。サーバー側のコードはなく、SSIもありません。
しかし、私は無料のサードパーティスクリプト/サービスを使用することに反対していません。
私は(物事を簡単にするためにjQueryと共に)JSONを返すことができるWebサービスを使用します。以下は私が見つけることができるすべてのfree active IP検索サービスとそれらが返す情報です。あなたがもうこれ以上知っているならば、それからコメントを加えてください、そして、私はこの答えを更新します。
試してみてくださいhttp://api.db-ip.com/addrinfo?api_key=<あなたのapiキー>&addr = <ip address>
戻り値:
{
"address": "116.12.250.1",
"country": "SG",
"stateprov": "Central Singapore",
"city": "Singapore"
}
制限:
試してみてくださいhttp://Gd.geobytes.com/GetCityDetails
$.getJSON('http://Gd.geobytes.com/GetCityDetails?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"geobytesforwarderfor": "",
"geobytesremoteip": "116.12.250.1",
"geobytesipaddress": "116.12.250.1",
"geobytescertainty": "99",
"geobytesinternet": "SA",
"geobytescountry": "Saudi Arabia",
"geobytesregionlocationcode": "SASH",
"geobytesregion": "Ash Sharqiyah",
"geobytescode": "SH",
"geobyteslocationcode": "SASHJUBA",
"geobytescity": "Jubail",
"geobytescityid": "13793",
"geobytesfqcn": "Jubail, SH, Saudi Arabia",
"geobyteslatitude": "27.004999",
"geobyteslongitude": "49.660999",
"geobytescapital": "Riyadh ",
"geobytestimezone": "+03:00",
"geobytesnationalitysingular": "Saudi Arabian ",
"geobytespopulation": "22757092",
"geobytesnationalityplural": "Saudis",
"geobytesmapreference": "Middle East ",
"geobytescurrency": "Saudi Riyal",
"geobytescurrencycode": "SAR",
"geobytestitle": "Saudi Arabia"
}
制限:
試してみてくださいhttps://json.geoiplookup.io/api
$.getJSON('https://json.geoiplookup.io/api?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"isp": "SGPOST",
"org": "Singapore Post Ltd",
"hostname": "116.12.250.1",
"longitude": "103.807",
"latitude": "1.29209",
"postal_code": "",
"city": "Singapore",
"country_code": "SG",
"country_name": "Singapore",
"continent_code": "AS",
"region": "Central Singapore",
"district": "",
"timezone_name": "Asia\/Singapore",
"connection_type": "",
"asn": "AS3758 SingNet",
"currency_code": "SGD",
"currency_name": "Singapore Dollar",
"success": true
}
制限:
試してみてくださいhttp://www.geoplugin.net/json.gp
$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"geoplugin_request": "116.12.250.1",
"geoplugin_status": 200,
"geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
"geoplugin_city": "Singapore",
"geoplugin_region": "Singapore (general)",
"geoplugin_areaCode": "0",
"geoplugin_dmaCode": "0",
"geoplugin_countryCode": "SG",
"geoplugin_countryName": "Singapore",
"geoplugin_continentCode": "AS",
"geoplugin_latitude": "1.2931",
"geoplugin_longitude": "103.855797",
"geoplugin_regionCode": "00",
"geoplugin_regionName": "Singapore (general)",
"geoplugin_currencyCode": "SGD",
"geoplugin_currencySymbol": "$",
"geoplugin_currencySymbol_UTF8": "$",
"geoplugin_currencyConverter": 1.4239
}
制限:
試してみてくださいhttps://api.hackertarget.com/geoip/?q=<ip address>
戻り値:
IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797
制限:
試してみてくださいhttps://ipapi.co/json/
$.getJSON('https://ipapi.co/json/', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"city": "Singapore",
"region": "Central Singapore Community Development Council",
"country": "SG",
"country_name": "Singapore",
"postal": null,
"latitude": 1.2855,
"longitude": 103.8565,
"timezone": "Asia/Singapore"
}
制限:
試してみてくださいhttp://ip-api.com/json
$.getJSON('http://ip-api.com/json?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"as": "AS3758 SingNet",
"city": "Singapore",
"country": "Singapore",
"countryCode": "SG",
"isp": "SingNet Pte Ltd",
"lat": 1.2931,
"lon": 103.8558,
"org": "Singapore Telecommunications",
"query": "116.12.250.1",
"region": "01",
"regionName": "Central Singapore Community Development Council",
"status": "success",
"timezone": "Asia/Singapore",
"Zip": ""
}
制限:
試してみてくださいhttps://api.ipdata.co
$.getJSON('https://api.ipdata.co', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"city": "Singapore",
"region": "Central Singapore Community Development Council",
"region_code": "01",
"country_name": "Singapore",
"country_code": "SG",
"continent_name": "Asia",
"continent_code": "AS",
"latitude": 1.2931,
"longitude": 103.8558,
"asn": "AS3758",
"organisation": "SingNet",
"postal": "",
"calling_code": "65",
"flag": "https://ipdata.co/flags/sg.png",
"emoji_flag": "\ud83c\uddf8\ud83c\uddec",
"emoji_unicode": "U+1F1F8 U+1F1EC",
"is_eu": false,
"languages": [
{
"name": "English",
"native": "English"
},
{
"name": "Malay",
"native": "Bahasa Melayu"
},
{
"name": "Tamil",
"native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
},
{
"name": "Chinese",
"native": "\u4e2d\u6587"
}
],
"currency": {
"name": "Singapore Dollar",
"code": "SGD",
"symbol": "S$",
"native": "$",
"plural": "Singapore dollars"
},
"time_zone": {
"name": "Asia/Singapore",
"abbr": "+08",
"offset": "+0800",
"is_dst": false,
"current_time": "2018-05-09T12:28:49.183674+08:00"
},
"threat": {
"is_tor": false,
"is_proxy": false,
"is_anonymous": false,
"is_known_attacker": false,
"is_known_abuser": false,
"is_threat": false,
"is_bogon": false
}
}
制限:
試してみてくださいhttps://ipfind.co/me?auth=<あなたのapiキー>
$.getJSON('https://ipfind.co/me?auth=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip_address": "116.12.250.1",
"country": "Singapore",
"country_code": "SG",
"continent": "Asia",
"continent_code": "AS",
"city": "Singapore",
"county": null,
"region": "Central Singapore",
"region_code": "01",
"timezone": "Asia/Singapore",
"owner": null,
"longitude": 103.8565,
"latitude": 1.2855,
"currency": "SGD",
"languages": [
"cmn",
"en-SG",
"ms-SG",
"ta-SG",
"zh-SG"
]
}
制限:
試してみてくださいhttps://api.ipgeolocation.io/ipgeo?apiKey=<あなたのAPIキー>
$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"continent_code": "AS",
"continent_name": "Asia",
"country_code2": "SG",
"country_code3": "SGP",
"country_name": "Singapore",
"country_capital": "Singapore",
"state_prov": "Central Singapore",
"district": "",
"city": "Singapore",
"zipcode": "",
"latitude": "1.29209",
"longitude": "103.807",
"is_eu": false,
"calling_code": "+65",
"country_tld": ".sg",
"languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG",
"country_flag": "https://ipgeolocation.io/static/flags/sg_64.png",
"isp": "SGPOST",
"connection_type": "",
"organization": "Singapore Post Ltd",
"geoname_id": "1880252",
"currency": {
"name": "Dollar",
"code": "SGD"
},
"time_zone": {
"name": "Asia/Singapore",
"offset": 8,
"is_dst": false,
"current_time": "2018-06-12 09:06:49.028+0800"
}
}
制限:
試してみてくださいhttps://api.ipify.org/?format=json
$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1"
}
制限:
試してみてくださいhttps://api.ipinfodb.com/v3/ip-city/?key=<あなたのapiキー>&format = json
$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"statusCode": "OK",
"statusMessage": "",
"ipAddress": "116.12.250.1",
"countryCode": "SG",
"countryName": "Singapore",
"regionName": "Singapore",
"cityName": "Singapore",
"zipCode": "048941",
"latitude": "1.28967",
"longitude": "103.85",
"timeZone": "+08:00"
}
制限:
試してみてくださいhttps://ipinfo.io/json
$.getJSON('https://ipinfo.io/json', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"hostname": "No Hostname",
"city": "Singapore",
"region": "Central Singapore Community Development Council",
"country": "SG",
"loc": "1.2931,103.8558",
"org": "AS3758 SingNet"
}
制限:
試してみてくださいhttp://api.ipstack.com/<ip address>?access_key = <your api key>
$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"type": "ipv4",
"continent_code": "AS",
"continent_name": "Asia",
"country_code": "SG",
"country_name": "Singapore",
"region_code": "01",
"region_name": "Central Singapore Community Development Council",
"city": "Singapore",
"Zip": null,
"latitude": 1.2931,
"longitude": 103.8558,
"location": {
"geoname_id": 1880252,
"capital": "Singapore",
"languages": [{
"code": "en",
"name": "English",
"native": "English"
},
{
"code": "ms",
"name": "Malay",
"native": "Bahasa Melayu"
},
{
"code": "ta",
"name": "Tamil",
"native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
},
{
"code": "zh",
"name": "Chinese",
"native": "\u4e2d\u6587"
}],
"country_flag": "http:\/\/assets.ipstack.com\/flags\/sg.svg",
"country_flag_emoji": "\ud83c\uddf8\ud83c\uddec",
"country_flag_emoji_unicode": "U+1F1F8 U+1F1EC",
"calling_code": "65",
"is_eu": false
}
}
制限:
試してみてくださいhttps://jsonip.com
$.getJSON('https://jsonip.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1",
"about": "/about",
"Pro!": "http://getjsonip.com",
"reject-fascism": "Liberal America will prevail"
}
制限:
試してみてくださいhttp://ip.jsontest.com/
$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"ip": "116.12.250.1"
}
制限:
試してみてくださいhttps://geoip.nekudo.com/api
$.getJSON('https://geoip.nekudo.com/api', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"city": "Singapore",
"country": {
"name": "Singapore",
"code": "SG"
},
"location": {
"accuracy_radius": 50,
"latitude": 1.2855,
"longitude": 103.8565,
"time_zone": "Asia/Singapore"
},
"ip": "116.12.250.1"
}
制限:
試してみてくださいhttp://www.stupidwebtools.com/api/my_ip.json
$.getJSON('http://www.stupidwebtools.com/api/my_ip.json', function(data) {
console.log(JSON.stringify(data, null, 2));
});
戻り値:
{
"my_ip": {
"ip": "116.12.250.1",
"others": []
}
}
制限:
これらはすべて無料のサービスなので、あなたのマイレージはクォータとアップタイムの超過、そして誰がいつ/いつオフラインになるかを知っているという点で異なるかもしれません(展示A: Telize )。 SSLサポートのようなより多くの機能が必要な場合には、これらのサービスは有料層も提供します。
また、skobaljicが以下のコメントで指摘したように、これはクライアントサイドで行われており、ほとんどのエンドユーザーは決してクォータを超えることはないので、リクエストクォータはほとんど学術的です。
更新
更新 :私は常にコードの最小化された/醜いバージョンを作りたかったので、ここに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アドレスを知ることができます。
私がどこからコードを取ったところ - > ソース
JSONPを使ってサーバーサイドで中継することができます
そしてグーグルで検索しながら、ここでそれを見つけたSO クライアントサイドのJavascriptを使ってDNSルックアップ(ホスト名からIPアドレス)を実行することはできますか?
<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>
注: 2015年11月15日現在、telize.com APIは永久に シャットダウンしています 。
ここでの答えのほとんどは、サーバー側のコードの必要性を「回避」します。誰かのサーバーを攻撃します。 実際にサーバーにアクセスせずにIPアドレスを取得する必要がある場合を除き、これは完全に有効な手法です。
伝統的に、これはある種のプラグインなしでは不可能でした(そしてそれでも、NATの背後にいる場合はwrongIPアドレスを取得するでしょう。ルーター)、しかし、WebRTCの出現により、実際にこれを行うことができます...Ifあなたがターゲットにしている場合 WebRTCをサポートするブラウザ (現在: Firefox、ChromeおよびOpera)。
midoの答えを読んでくださいWebRTCを使用して有用なクライアントIPアドレスを取得する方法の詳細について。
あなたは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;
}
ボーナスとして、地理位置情報が同じ呼び出しで返されます。
これを試して
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
OR
$(document).ready(function () {
$.getJSON("http://jsonip.com/?callback=?", function (data) {
console.log(data);
alert(data.ip);
});
});
チェックアウト http://www.ipify.org/ /
彼らによると:
- あなたはそれを 制限なしに を使うことができます(あなたが毎分数百万の要求をしているとしても)。
- ipifyは完全にオープンソースです( GitHubレポジトリ をチェックしてください)。
これが実用的なJSの例です(なぜこの回答に投票が少ないのか疑問に思うのではなく、実際に試してみてください)。
<script>
function getIP(json) {
alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
コピー/貼り付けが面倒?私はそれが好きです。 これは????デモ
クリックするのが面倒? :O
注 :デモを実行する前にAdblock Plus/uBlock&coをオフにしてください。それ以外の場合は動作しません
私はIPifyチームと関係がある{nothing}を持っています。誰かがそのようなサービスを一般的な利益のために提供するのはばかげてクールだと思います。
できません。あなたはサーバーに依頼する必要があるでしょう。
これには、私のサービス http://ipinfo.io を使用できます。これにより、クライアントIP、ホスト名、位置情報、およびネットワーク所有者がわかります。これはIPを記録する簡単な例です:
$.get("http://ipinfo.io", function(response) {
console.log(response.ip);
}, "jsonp");
完全な応答情報も出力する、より詳細なJSFiddleの例を次に示します。利用可能なすべての詳細を見ることができます。 http://jsfiddle.net/zK5FN/2/
このコードをあなたのページに含めてください:<script type="text/javascript" src="http://l2.io/ip.js"></script>
もっとdoc ここ
私はチャドとマルタが素晴らしい答えを持っていると言うでしょう。しかし、それらは複雑です。だから私は国のプラグインによる広告から見つけたこのコードを提案する
<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>
Ajaxはありません。ただのジャバスクリプト。 :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を介してアクセスできる他のサーバーでも問題なく動作します。
この質問には2つの解釈があります。ほとんどの人は、「クライアントIP」を、WebサーバーがLANの外やインターネット上で見るパブリックIPアドレスを意味すると解釈しました。ほとんどの場合、これはクライアントコンピュータのIPアドレスではありません。
私のJavaScriptソフトウェアをホストしているブラウザを実行しているコンピュータの実際のIPアドレス(ほとんどの場合、LAN上のローカルIPアドレスはNATレイヤの背後にあるものです)が必要でした。
Midoが上記のFANTASTIC回答を投稿しました。それが実際にクライアントのIPアドレスを提供した唯一の回答のようです。
どうもありがとう、ミドー!
ただし、提示された機能は非同期的に実行されます。私は実際に自分のコードでIPアドレスを使用する必要があります、そして非同期の解決策で、私はそれが検索/学習/保存される前にIPアドレスを使用しようとするかもしれません。結果を使用する前に、結果が到着するのを待つことができなければなりませんでした。
これがMidoの機能の "Waitable"バージョンです。私はそれが他の誰かに役立つことを願っています:
function findIP(onNewIP) { // onNewIp - your listener function for new IPs
var promise = new Promise(function (resolve, reject) {
try {
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)) {
ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
}
resolve("FindIPsDone");
return;
};
}
catch (ex) {
reject(Error(ex));
}
});// New Promise(...{ ... });
return promise;
};
//This is the callback that gets run for each IP address found
function foundNewIP(ip) {
if (typeof window.ipAddress === 'undefined')
{
window.ipAddress = ip;
}
else
{
window.ipAddress += " - " + ip;
}
}
//This is How to use the Waitable findIP function, and react to the
//results arriving
var ipWaitObject = findIP(foundNewIP); // Puts found IP(s) in window.ipAddress
ipWaitObject.then(
function (result) {
alert ("IP(s) Found. Result: '" + result + "'. You can use them now: " + window.ipAddress)
},
function (err) {
alert ("IP(s) NOT Found. FAILED! " + err)
}
);
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>
Smart-IP.netを使って Geo-IP API 。たとえば、jQueryを使用して:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.Host);
}
);
});
あなたの訪問者に許可を求めないような、もっと簡単で自由な方法があります。
それは http://freegeoip.net/json に非常に単純なAjax POSTリクエストを送信することから成ります。自分の位置情報を受け取ったら、JSONで、それに応じてページを更新するか新しいものにリダイレクトします。
位置情報のリクエストを送信する方法は次のとおりです。
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.log(location)
}
} );
さて、私はその質問から脱却しています、しかし私は今日同様のニーズを持っていました、そして私はJavascriptを使っているクライアントからIDを見つけることができませんでしたが、私は以下をしました。
サーバーサイド: -
<div style="display:none;visibility:hidden" id="uip"><%= Request.UserHostAddress %></div>
Javascriptを使う
var ip = $get("uip").innerHTML;
私はASP.NET Ajaxを使用していますが、$ get()の代わりにgetElementByIdを使用できます。
何が起きているのかというと、私はページ上に隠されたdiv要素を持っていて、ユーザーのIPがサーバーからレンダリングされています。 Javascriptよりもその値をロードするだけです。
これはあなたと同じような要件を持っている人には役に立つかもしれません(私がこれを理解していない間は私のように)。
乾杯!
何らかの外部サービスを利用しない限り、一般的には不可能です。
jQueryであなたのIPを取得してください
1行のJSでパブリック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); });
クライアントコンピュータのIPアドレスを取得するための本当に信頼できる方法はありません。
これはいくつかの可能性を通り抜ける。ユーザーが複数のインターフェースを持っていると、Javaを使用するコードは壊れます。
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
ここで他の答えを見てみると、クライアントのパブリックIPアドレスを取得したいと思うかもしれません。これはおそらくインターネットに接続するために使用しているルーターのアドレスです。ここで他の多くの答えはそれについて話します。他の人のサービスに依存するのではなく、リクエストを受信し、IPアドレスで応答するための独自のサーバーサイドページを作成してホストすることをお勧めします。
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データベースに基づいています。
免責事項:私はこのライブラリを書きました
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>
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>
Appspot.comコールバックのサービスはご利用いただけません。 ipinfo.ioは動作しているようです。
私は余分な一歩を踏み出し、AngularJSを使用してすべての地理情報を取得しました。 (ありがとうリカルド)それをチェックしてください。
<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
api.ipify.org
はHTTPとHTTPSの両方をサポートしているので、私は本当に好きです。
以下はjQueryを使ってapi.ipify.org
を使ってIPを取得する例です。
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://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>
あなたがJSONでそれを望まないのであれば、HTTPSを介した平文の応答もあります。
https://api.ipify.org
そして、HTTP経由の平文の応答もあります。
http://api.ipify.org
ファイルを別の場所に含める場合は、単純なajaxのgetを実行します。
function ip_callback() {
$.get("ajax.getIp.php",function(data){ return data; }
}
そしてajax.getIp.php
はこれでしょう:
<?=$_SERVER['REMOTE_ADDR']?>
ipdata.co を使用してください。
このAPIは、地理位置情報データも提供し、それぞれが1日に800Mを超える要求を処理できる10個のグローバルエンドポイントを持っています。
この回答では、「テスト」APIキーを使用していますが、これは非常に限られており、数回の呼び出しをテストするためのものです。 サインアップ あなた自身の無料APIキーのために、そして開発のために毎日1500リクエストまで得てください。
$.get("https://api.ipdata.co?api-key=test", function (response) {
$("#response").html(response.ip);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>
Htmlページに情報を格納し、実際にはJavaScriptにパラメータを渡さなくてもJavaScriptで情報を読みたい場合によく使用する方法を提供します。これは、スクリプトがインラインではなく外部で参照されている場合に特に便利です。
ただし、「サーバー側スクリプトがありません」という基準を満たしていません。あなたのHTMLにサーバーサイドのスクリプトを含めることができるなら、これをしてください:
Htmlページの下部、end 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アドレスに等しくなります。今すぐあなたのAPIリクエストにIPアドレスを渡すことができます。
* 2年後の編集* / 2つのマイナーな改良点:
私は日常的にこの方法を使用していますが、実際にはデータを保存する方法であるため、ラベルclass="data"
を呼び出します。クラス名 "hiddenlabel"はバカな名前のようなものです。
2番目の変更はvisibility:hidden
の代わりにスタイルシートにあります。
.data{
display:none;
}
...それをするのがより良い方法です。
Jsが呼び出すことができるFlashオブジェクトを使用することによって、これを完全にクライアント側で、そしてほとんどJavaScriptで行うことができます。 Flash can ローカルマシンのIPアドレスにアクセスすることはあまり役に立ちません。
<!DOCTYPE html>
<html ng-app="getIp">
<body>
<div ng-controller="getIpCtrl">
<div ng-bind="ip"></div>
</div>
<!-- Javascript for load faster
================================================== -->
<script src="lib/jquery/jquery.js"></script>
<script src="lib/angular/angular.min.js"></script>
<script>
/// Scripts app
'use strict';
/* App Module */
var getIp = angular.module('getIp', [ ]);
getIp.controller('getIpCtrl', ['$scope', '$http',
function($scope, $http) {
$http.jsonp('http://jsonip.appspot.com/?callback=JSON_CALLBACK')
.success(function(data) {
$scope.ip = data.ip;
});
}]);
</script>
</body>
</html>
var call_to = "http://smart-ip.net/geoip-json?callback=?";
$.getJSON(call_to, function(data){
alert(data.Host);
});
data.Host
はIPアドレスです。単にあなたのブラウザからこれを呼び出してください。
http://smart-ip.net/geoip-json?callback=?
[引用符なし]そしてipを取得します。
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
あなたはのような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
これを試してください: http://httpbin.org/ip (または https://httpbin.org/ip )
Httpsの例:
$.getJSON('https://httpbin.org/ip', function(data) {
console.log(data['Origin']);
});
出典: http://httpbin.org/ /
どうぞ:
$.getJSON("http://smart-ip.net/geoip-json?callback=?", function(data){
alert(data.Host);
});
ジャバスクリプトを試す
$.getJSON("http://smart-ip.net/geoip-json?callback=?", function(data){
alert(data.Host);
});
または
http://jsfiddle.net/ourcodeworld/cks0v68q/?utm_source=website&utm_medium=embed&utm_campaign=cks0v68q
システムローカルIPを取得します。 /
try {
var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection) (function () {
var rtc = new RTCPeerConnection({ iceServers: [] });
if (1 || window.mozRTCPeerConnection) {
rtc.createDataChannel('', { reliable: false });
};
rtc.onicecandidate = function (evt) {
if (evt.candidate) grepSDP("a=" + evt.candidate.candidate);
};
rtc.createOffer(function (offerDesc) {
grepSDP(offerDesc.sdp);
rtc.setLocalDescription(offerDesc);
}, function (e) { console.warn("offer failed", e); });
var addrs = Object.create(null);
addrs["0.0.0.0"] = false;
function updateDisplay(newAddr) {
if (newAddr in addrs) return;
else addrs[newAddr] = true;
var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });
LgIpDynAdd = displayAddrs.join(" or perhaps ") || "n/a";
alert(LgIpDynAdd)
}
function grepSDP(sdp) {
var hosts = [];
sdp.split('\r\n').forEach(function (line) {
if (~line.indexOf("a=candidate")) {
var parts = line.split(' '),
addr = parts[4],
type = parts[7];
if (type === 'Host') updateDisplay(addr);
} else if (~line.indexOf("c=")) {
var parts = line.split(' '),
addr = parts[2];
alert(addr);
}
});
}
})();} catch (ex) { }
上記のすべての回答には、純粋なクライアント部分ではなく、サーバー部分があります。これはウェブブラウザによって提供されるべきです。現在のところ、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
私はJavascriptの達人ではありませんが、可能であれば http://www.whatismyip.com/automation/n09230945.asp をソースとしてiframeを開き、フレームの内容を読むことができます。
編集:これはクロスドメインセキュリティのために動作しません。
<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>
あなたは私たちの https://ip-api.io geo ip APIを使って試すことができます。例えばjQueryの場合:
$(document).ready( function() {
$.getJSON("http://ip-api.io/api/json",
function(data){
console.log(data);
}
);
});
また https://ip-api.io はTOR、パブリックプロキシ、スパマーデータベースをチェックし、この情報も提供します。
応答の例:
{
"ip": "182.35.213.213",
"country_code": "US",
"country_name": "United States",
"region_code": "CA",
"region_name": "California",
"city": "San Francisco",
"Zip_code": "94107",
"time_zone": "America/Los_Angeles",
"latitude": 32.7697,
"longitude": -102.3933,
"suspicious_factors": {
"is_proxy": true,
"is_tor_node": true,
"is_spam": true,
"is_suspicious": true // true if any of other fields (is_proxy, is_tor_node, is_spam) is true
}
}
まず最初に実際の答え: 純粋にクライアントサイドで実行されたコードを使ってあなた自身の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
}
どこかでNGINXを使っているのであれば、このスニペットを追加してAJAXツールを使って自分のサーバーに問い合わせることができます。
location /get_ip {
default_type text/plain;
return 200 $remote_addr;
}
私がここで見た他のサービスのいくつかに関する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がなければ失敗します)。
<script type="application/javascript">
function getip(json)
{
alert(json.ip);
}
<script type="application/javascript" src="http://jsonip.appspot.com/?callback=getip"></script>
上のスクリプトを実行します ここをクリック
私はlaravelで私自身のapiバックエンドを持っているので、私はたいてい以下の通りです:
$(document).ready( function() {
$.getJSON( "http://api.whoisdoma.com/v1/ip/visitor?api_key=key",
function(data){
alert( data.ip);
}
);
});
セキュリティを高めるために、結果を得るために必要なAPIキーを提供しています。
IPアドレスを取得する簡単な解決策は、ファイルに次のコードを追加することです。
$.getJSON('https://api.ipify.org?format=json', function(data){
// Your callback functions like
console.log(data.ip);
localStorage.setItem('ip',data.ip);
alert(data.ip);
});
ページがロードされたときにIPアドレスを取得します。
これを試して
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip: " + data.ip);
});
IPを見つけるためのJavaスクリプト
IPアドレスを取得するには、私は無料のWebサービスへのJSON呼び出しを行っています。好き
[jsonip.com/json、ipinfo.io/json、www.telize.com/geoip、ip-api.com/json、api.hostip.info/get_json.php]
そして、リクエストの完了時に呼び出されるコールバック関数の名前を渡しています。
<script type="text/javascript">
window.onload = function () {
var webService = "http://www.telize.com/geoip";
var script = document.createElement("script");
script.type = "text/javascript";
script.src = webService+"?callback=MyIP";
document.getElementsByTagName("head")[0].appendChild(script);
};
function MyIP(response) {
document.getElementById("ipaddress").innerHTML = "Your IP Address is " + response.ip;
}
</script>
<body>
<form>
<span id = "ipaddress"></span>
</form>
</body>
xmlレスポンス code 用
WebRTC これはサーバーのサポートを必要としません。
Javascriptだけではできません(上記のようにクライアントにブラウザプラグインがない限り)。クライアント上のFlashでもできません。しかし、Javaアプレットを使用してクライアント上で実行することもできます(そしてjavascriptがそれと通信することもできます)。ただし、完全なアクセス権を要求されます。例えば http://www.findmyrouter.net を参照してください。