JavaScriptを使用してクライアントのIPアドレスを取得する方法


560

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

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

回答:


773

私はJSONを返すことができるWebサービスを使用します(物事をより簡単にするためにjQueryと共に)。以下は、私が見つけたすべての無料のアクティブ IPルックアップサービスと、それらが返す情報です。他にご存知の場合は、コメントを追加してください。この回答を更新します。


クラウドフレア

試してみてください: https : //www.cloudflare.com/cdn-cgi/trace

// If your site is on Cloudflare, then you can use '/cdn-cgi/trace' instead
$.get('https://www.cloudflare.com/cdn-cgi/trace', function(data) {
    console.log(data)
})

戻り値:

fl=4f422
h=www.cloudflare.com
ip=54.193.27.106
ts=1575967108.245
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 Hypothesis-Via
colo=SJC
http=http/1.1
loc=US
tls=TLSv1.3
sni=plaintext
warp=off

制限:

  • プレーンテキストを返します

DB-IP

試してみてください: http : //api.db-ip.com/addrinfo? api_key= < your api key >&addr = < ip address >

戻り値:

{
  "address": "116.12.250.1",
  "country": "SG",
  "stateprov": "Central Singapore",
  "city": "Singapore"
}

制限:

  • 1日あたり2,500リクエスト
  • JSONPコールバックをサポートしていません
  • IPアドレスパラメータが必要
  • APIキーを取得するにはメールアドレスが必要です
  • 無料プランでSSL(https)なし

ジオバイト

試す: 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"
}

制限:

  • 1時間あたり16,384リクエスト
  • 無料プランでSSL(https)なし
  • 間違った場所を返す可能性があります(私はサウジアラビアではなくシンガポールにいます)

GeoIPLookup.io

試してみてください: 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
}

制限:

  • 1時間あたり10,000リクエスト
  • 無料のAPIは非商用利用のみを許可します

geoPlugin

試してみてください: 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": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

制限:

  • 1分あたり120リクエスト
  • 無料プランでSSL(https)なし

ハッカーターゲット

試してみてください: 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

制限:

  • 1日あたり50リクエスト
  • JSONPコールバックをサポートしていません
  • IPアドレスパラメータが必要
  • プレーンテキストを返します

ipapi.co

試してみてください: 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"
}

制限:

  • 1日あたり1,000リクエスト
  • SSLが必要(https)

IP-API.com

試してみてください: 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": ""
}

制限:

  • 1分あたり150リクエスト
  • 無料プランでSSL(https)なし

Ipdata.co

試してみてください: 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
  }
}

制限:

  • 1日あたり1,500リクエスト
  • APIキーを取得するにはメールアドレスが必要です
  • SSLが必要(https)

IP検索

試してみてください: 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"
  ]
}

制限:

  • 1日あたり300リクエスト
  • APIキーを取得するには登録が必要です

ipgeolocation

試してみてください: https : //api.ipgeolocation.io/ipgeo? apiKey = < your api key >

$.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"
  }
}

制限:

  • 1か月あたり50,000リクエスト
  • APIキーを取得するには登録が必要です

ipify

試してみてください: 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"
}

制限:

  • 無し

IPInfoDB

試してみてください: https : //api.ipinfodb.com/v3/ip-city/?key = < your api key >&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"
}

制限:

  • 1秒あたり2つのリクエスト
  • APIキーを取得するには登録が必要です

ipinfo.io

試してみてください: 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"
}

制限:

  • 1日あたり1,000リクエスト

イプレジストリー

試してみてください: https : //api.ipregistry.co/?key = < APIキー >

$.getJSON('https://api.ipregistry.co/?key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

戻り値:

{
  "ip" : "116.12.250.1",
  "type" : "IPv4",
  "hostname" : null,
  "carrier" : {
    "name" : null,
    "mcc" : null,
    "mnc" : null
  },
  "connection" : {
    "asn" : 3758,
    "domain" : "singnet.com.sg",
    "organization" : "SingNet Pte Ltd",
    "type" : "isp"
  },
  "currency" : {
    "code" : "SGD",
    "name" : "Singapore Dollar",
    "plural" : "Singapore dollars",
    "symbol" : "SGD",
    "symbol_native" : "SGD",
    "format" : {
      "negative" : {
        "prefix" : "-SGD",
        "suffix" : ""
      },
      "positive" : {
        "prefix" : "SGD",
        "suffix" : ""
      }
    }
  },
  "location" : {
    "continent" : {
      "code" : "AS",
      "name" : "Asia"
    },
    "country" : {
      "area" : 692.0,
      "borders" : [ ],
      "calling_code" : "65",
      "capital" : "Singapore",
      "code" : "SG",
      "name" : "Singapore",
      "population" : 5638676,
      "population_density" : 8148.38,
      "flag" : {
        "emoji" : "🇸🇬",
        "emoji_unicode" : "U+1F1F8 U+1F1EC",
        "emojitwo" : "https://cdn.ipregistry.co/flags/emojitwo/sg.svg",
        "noto" : "https://cdn.ipregistry.co/flags/noto/sg.png",
        "twemoji" : "https://cdn.ipregistry.co/flags/twemoji/sg.svg",
        "wikimedia" : "https://cdn.ipregistry.co/flags/wikimedia/sg.svg"
      },
      "languages" : [ {
        "code" : "cmn",
        "name" : "cmn",
        "native" : "cmn"
      }, {
        "code" : "en",
        "name" : "English",
        "native" : "English"
      }, {
        "code" : "ms",
        "name" : "Malay",
        "native" : "Melayu"
      }, {
        "code" : "ta",
        "name" : "Tamil",
        "native" : "தமிழ்"
      }, {
        "code" : "zh",
        "name" : "Chinese",
        "native" : "中文"
      } ],
      "tld" : ".sg"
    },
    "region" : {
      "code" : null,
      "name" : "Singapore"
    },
    "city" : "Singapore",
    "postal" : "96534",
    "latitude" : 1.28967,
    "longitude" : 103.85007,
    "language" : {
      "code" : "cmn",
      "name" : "cmn",
      "native" : "cmn"
    },
    "in_eu" : false
  },
  "security" : {
    "is_bogon" : false,
    "is_cloud_provider" : false,
    "is_tor" : false,
    "is_tor_exit" : false,
    "is_proxy" : false,
    "is_anonymous" : false,
    "is_abuser" : false,
    "is_attacker" : false,
    "is_threat" : false
  },
  "time_zone" : {
    "id" : "Asia/Singapore",
    "abbreviation" : "SGT",
    "current_time" : "2019-09-29T23:13:32+08:00",
    "name" : "Singapore Standard Time",
    "offset" : 28800,
    "in_daylight_saving" : false
  }
}

制限:

  • 無料プランには10万件のリクエストが含まれます
  • APIキーを取得するには登録が必要です

ipstack(以前のfreegeoip.net)

試してください: 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
    }
}

制限:

  • 1か月あたり10,000リクエスト
  • IPアドレスパラメータが必要
  • APIキーを取得するには登録が必要です
  • 無料プランでSSL(https)なし

jsonip.com

試してみてください: https : //jsonip.com

$.getJSON('https://jsonip.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

戻り値:

{
  "ip": "116.12.250.1",
  "about": "https://jsonip.com/about",
  "Pro!": "http://getjsonip.com",
  "Get Notifications": "https://jsonip.com/notify"
}

制限:

  • レスポンスにはアップセルが含まれます

JSONテスト

試してみてください: http : //ip.jsontest.com/

$.getJSON('http://ip.jsontest.com/?callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

戻り値:

{
  "ip": "116.12.250.1"
}

制限:

  • SSLなし(https)
  • (割り当てを超えて)かなり下がるので、生産には使用しません
  • IPv6アドレスがある場合はIPv6アドレスを返しますが、これは必要なものではない可能性があります

猫道

試してみてください: 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"
}

制限:

  • EasyPrivacyリストを使用して広告ブロッカーによってブロックされました

これらはすべて無料のサービスであるため、割り当て量と稼働時間の超過、およびいつオフラインになるかは誰が知っているかによって走行距離が異なる場合があることに注意してください(図A:Telize)。これらのサービスのほとんどは、SSLサポートなどの機能が必要な場合に備えて、有料階層も提供します。

また、以下のコメントでskobaljicが述べたように、これはクライアント側で発生し、ほとんどのエンドユーザーが割り当てを超えることはないため、リクエストの割り当てはほとんどが学術的です。

更新


3
@AfolabiOlaoluwaAkinwumiあなたはこのようなものを試すことができます:$.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });
thdoan

1
@skobaljic Re。制限は通常何も意味しません。良い点であり、おそらくAPIキーを必要とするものから離れる理由です。キーの使用を数えることができるからです。
Nick Rice

2
@JohnWeisz正しいですが、OPが単にページを更新することしかできず、サーバー側では何もできない(質問からは不明)場合、これらのオプションは質問にうまく答えます。
Nick Rice

1
@RobWaaおかげで、私は4/14アップデートで広告ブロッカーの制限を追加しました。まもなくgeoiplookup.ioを追加します。
thdoan

1
これらすべての回答はサードパーティのサービスに依存しています。これは大きな欠点です。そのサービスがタイムリーに応答することに依存しているだけでなく、そうでない場合、適切なタイムアウトを設定しないと(常に後で発生します)、ページの読み込み時間を遅らせますが、これはまったく良くありません。それでは、クライアントのIPを返すために独自のサーバーを使用しないのはなぜですか?これは、プログラミング言語を使用する場合の簡単なタスクです。
ダニエルJ.

280

最終更新

ブラウザが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を知ることができます。

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


12
ここでベストアンサーを挙げて賛成票を投じてください。また、素晴らしいGitHubリポジトリにも感謝します。
カノ2016年

28
警告:これはパブリックIPを表示せず、ローカルネットワークのIPのみを表示します。たとえば、ユーザーがLAN上にある場合、ユーザーの国の検出には使用できません
FloatingRock

1
@FloatingRockでは、STUNサーバーを使用してパブリックIPを取得することもできます(ピアの作成時に構成することもできます)。その場合も、STUNサーバーを維持/使用し、サーバーコードを組み込む必要があります。
Mido

10
これは、WebRTCリークと呼ばれます。すべての市長のブラウザで修正する必要がありますが、そうではありません。詳細はこちら:privacytools.io/webrtc.html Torブラウザーが実際のIPをリークしていることに関連している可能性があります。
Kapitein Witbaard 2016年

1
私は答えが好きですが、クライアントはWebRTCを無効にすることでこのプロセスを回避
ni8mr

175

あなたはそれを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>

注: telize.com APIは、2015年11月15日をもって完全にシャットダウンされました


45
私はこのスニペットを高く評価していますが、JavaScriptのテキストコンテンツを読み込んで関数で評価することは、重大なセキュリティリスクだと思います。応答のコンテンツが変更され、この回答に投票してそのスニペットを使用した可能性のある100人以上のすべての人々が、安全でない可能性のあるコンテンツを含む関数を呼び出すことになった場合はどうなるでしょうか。JSON文字列の場合にのみ使用します。
auco 2013年

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
ブラッドM

28
これはサーバー側のリクエストを伴うため、良い答えではありません。質問には「純粋なJavaScript」と明記されていました。
ミカ2014年

2
ミカ、純粋なjavascriptでIPアドレスを取得する方法はありません。NATについて読んで、それがどのように機能するかをお勧めします。インターネットIPアドレスをエコーバックするサーバーが必要です
Chad Grant

11
サービスがダウンしています。
Cyril N.

109

ここでの答えのほとんどは、サーバーサイドコードの必要性を「回避」するために...他の誰かのサーバーを攻撃することです。実際にサーバーにアクセスすることなくIPアドレスを取得する必要がない限り、これは完全に有効な手法です。

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

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


23
@oscar:これは、彼の回答で述べたのと同じ手法(JSONPによって返されるサーバー可視IP)のようです。これは、OPの「サーバー側コードなし」という要件と一致しません。しかし、そうです、その要件を無視した場合にそれを実現する1つの方法です。
Shog9

ためのWebRTCの古いこの回答:stackoverflow.com/questions/20194722/...
AKAM

1
更新、@ Akam。あなたはすべきである御堂にいくつかの小道具を与える(まだサーバーのサポートを必要とあきれるほど間違った答えを掲示する人々の年後)数ヶ月前にこのことを指摘するために。
Shog9 2016

WebRTCはより広くサポートされていますか?
オールドボーイ

1
その「CanIUse」リンクによると、それは@BugWhispererです。IEが必要でない限り。
Shog9

81

あなたは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;
}

おまけとして、地理位置情報は同じ呼び出しで返されます。


6
また、api.hostip.info/get_json.phpを使用してJSON表現を取得し、ブラウザー機能のjQueryまたはPrototypeでJSONを解析することもできます。
ブラッド・フォルケンズ

2
api.hostip.info/get_html.php」にリクエスト制限はありますか?このapiの詳細はどこで確認できます
Navin Leon

ネットワークファイアウォールのIPを返します。実際のクライアントIPではありません。実際のクライアントIPを取得する方法はありますか?
Leela Addagulla

76
これを試して
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

または

$(document).ready(function () {
    $.getJSON("http://jsonip.com/?callback=?", function (data) {
        console.log(data);
        alert(data.ip);
    });
});

フィドル


これは動作します$ .get( " ipinfo.io "、function(response){alert(response.ip);}、 "jsonp"); しかし、値を変数に格納するにはどうすればよいですか?このgetリクエストループの外で消えるようです

1
すべての無料のIPルックアップサービスのリストについては、stackoverflow.com
questions / 391979 /…

この関数を送信してipの値を返すにはどうすればよいですか?
ネフ

67

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


5
これは質問に対する答えを提供しません。批評したり、著者に説明を求める場合は、投稿の下にコメントを残してください。
Himanshu 2015

28
しかし、それはちょっとそうですよね?つまり、答えが「いいえ、できません」である場合、これは現在賛成されている「ここでは、このランダムなappspotアプリを使用する」よりも正しい答えであると主張します。リストのトップ。
SteveShaffer 2015

16
IMOこれは正解であり、受け入れる必要があります。質問は具体的に「サーバー側のコードなし」と述べています。
matthewwithanm


2
@matthewwithanmもっと同意できませんでした。私はすべての答えをスクロールして、誰かがこれを正確に言ったかどうかを確認していました-自分で答えとして提供する準備ができていました。非常に賛成の回答はすべて有益ですが、すべて別の質問に回答します。「純粋なJavaScriptを使用してクライアントのIPアドレスを何とかプルする必要があります。サーバー側のコードはなく、SSIも必要ありません。」この答えは、実際には正しい答えです。ブラウザでサンドボックス化されたJavaScriptはこれを行うことができません(NATまたはプロキシに関係なく)。他の回答のいずれかを受け入れる場合は、質問を変更する必要があります。
ウォリー2017

64

これ以上探さない

http://www.ipify.org/をチェックしてください。

彼らによると:

  • (1分あたり数百万のリクエストを実行している場合でも)無制限に使用できます。
  • 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チームとは何の関係もありません。私が誰かがそのようなサービスを一般的な善のために提供するのはとんでもないほどクールだと思います。


4
最良の部分はこれが「https」から来ることですが、http IPヘルパーへの私の呼び出しは「安全でない」ためブロックされます。
Tessa

CORSエラーが表示されています。どうすればよいですか。
saberprashant

@saberprashant「HTTPS」を使用していますか?
FloatingRock

@FloatingRock、いいえ、私はHTTPを使用しています
saberprashant

26

これには、私のサービスhttp://ipinfo.ioを使用できます。これにより、クライアントIP、ホスト名、地理位置情報、およびネットワーク所有者が提供されます。IPをログに記録する簡単な例を次に示します。

$.get("http://ipinfo.io", function(response) {
    console.log(response.ip);
}, "jsonp");

:ここでは、利用可能な詳細の全て見ることができるようにも、完全な応答情報を出力し、より詳細なJSFiddle例だhttp://jsfiddle.net/zK5FN/2/は、


混合コンテンツポリシーの問題を回避するには、またはhttps に変更http://ipinfo.io//ipinfo.ioます
Samuel Elh 2018

私たちはあなたのサービスを利用したいのですが、Stackoverflowユーザー向けの割引はありますか?
Mehdi Dehghani

@MehdiDehghaniは、1か月あたり最大5万req、バックリンクを使用して100 kまで無料です-ipinfo.io/contact/creditlinkを参照してください
Ben Dowling

19

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

ここにもっとドキュメント


1
うーん。面白そうですね…限界はありますか?
indapublic 2014

1
ライブラリオフライン
riccardo.tasso

l2.io ref:hybrid-analysis.com/sample/…に関連付けられているスパムのようなポップアップがある程度あります。サンプルのようにリンクを埋め込むことができます117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js?var = myip "、" host ":" l2.io "、" referer ":" website.com/… } "&screenheight = 768&screenwidth = 1366&tm = 1557565256073&lib = true&fingerprint = c2VwLW5vLXJlZGlyZWN0
ウェインDSouza

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>

Ajaxはありません。単純な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を介してアクセスできる他のサーバーは、問題なく同様に機能します。


7
リモートサーバーからJavaScriptを読み込んで内容が不明な関数を呼び出すことは、セキュリティ上の大きなリスクのように思えます(関数の内容が変更された場合はどうなりますか?)。私はむしろJSON応答を解析したいと思います。
auco 2013年

3
エラー404:オブジェクトが見つかりません
trejder 2015年

久しぶりですが、答えは実はかなり間違っています。JavaScriptがIPを認識できないことを知りませんでした。
user4951 2017年

ああ、それは正しいです。visistsIP関数は、phpコードではありません。これは、phpコードによって生成されたjavacriptコードです
user4951

独自のサーバーを使用して、訪問者にIPを割り当てるJavaScriptコードを印刷できます。
user4951 2017年

15

この質問には2つの解釈があります。ほとんどの人は、「クライアントIP」を、WebサーバーがLANの外とインターネット上で見るパブリックIPアドレスを意味すると解釈しました。ただし、ほとんどの場合、これはクライアントコンピュータのIPアドレスではありません。

JavaScriptソフトウェアをホストしているブラウザーを実行しているコンピューターの実際のIPアドレス(ほとんどの場合、NATレイヤーの背後にあるLAN上のローカルIPアドレス)が必要でした。

ミドは上記の素晴らしい答えを投稿しました。それは、クライアントのIPアドレスを実際に提供した唯一の答えのようです。

それをありがとう、ミド!

ただし、提示された関数は非同期で実行されます。コードで実際にIPアドレスを使用する必要があります。非同期ソリューションでは、取得/学習/保存する前にIPアドレスを使用しようとする場合があります。使用する前に結果が到着するのを待つ必要がありました。

これは、ミドの機能の「待機」バージョンです。私はそれが他の誰かを助けることを願っています:

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>


14

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

これは、非常に単純なAjax POSTリクエストをhttp://freegeoip.net/jsonに送信することで構成されています。JSONで位置情報を受信すると、ページを更新するか、新しいページにリダイレクトすることで、それに応じて対応します。

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

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );

2018年7月1日に閉鎖されたようです
Nithin PH

13

さて、私は質問から離れていますが、今日同様のニーズがあり、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ではなく、その値をロードするだけです。

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

乾杯!


20
-1:OPは「サーバー側コードなし」について具体的に言及していますが、C#を使用しています。
Bruno Reis、

8
出力するだけの方がいいのでは<script>var uip='<%= Request.UserHostAddress %>';</script>
Chris Haines 14年

サーバー側のコードを使用することは別として、データを格納するためにDOMを使用してはなりません。これは全体的に悪いです。HainesyはJS varに割り当てるだけの方が良い考えです。
coblr 2015


12

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


実際、これは、JavaScriptを使用して、Ipregistryなどのサードパーティのサービスに依存することで可能です(免責事項:私はサービスを実行します):ipregistry.co/docs/getting-location-from-ip-address#javascript IPアドレスを取得できます、および脅威データを含む多くの関連情報をすべて1回の呼び出しで取得します。
Laurent

9

jQueryでIPを取得する

JSの1行でパブリックIPアドレスを取得できますか?これを提供する無料のサービスがあり、取得リクエストはあなたがする必要があるすべてです:

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

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

   $.getJSON('http://jsonip.com/?callback=?', function(r){ console.log(r.ip); });

9

あなたは使うことができます 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データベースに基づいています。

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


8

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

サーバーへの「src」リンクを含むタグを埋め込むだけで済みます。サーバーは「codehelper_ip」をオブジェクト/ 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>

1
使用しないlanguage属性を、使うtype="text/javascript"代わりに、より多くのMDN
アレックス・K

@Alexがすでに述べたように、言語は非推奨であり、レガシーコードでのみ使用されます。代わりに、最大の互換性のために 'type = "text / javascript"'を使用してください。
Gautham C. 2014

1
FYIのみ-typeフィールドはHTML5には必要ありません(JSがデフォルトです)。 w3schools.com/tags/att_script_type.asp
pmont

これらの他のコメントを見逃した場合に備えて、言語の代わりにタイプを使用する必要があります
Mike

8

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


8

常にファイルを含める場合は、単純なajax getを実行できます。

function ip_callback() {
    $.get("ajax.getIp.php",function(data){ return data; }
}

そしてajax.getIp.phpこれは:

<?=$_SERVER['REMOTE_ADDR']?>

8

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

8

ipdata.coを使用します

APIは地理位置情報データも提供し、1日あたり8億を超えるリクエストを処理できる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>


7

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

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

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

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


7

私は、htmlページに情報を格納し、JavaScriptが実際にパラメーターをJavaScriptに渡さなくても情報を読み取れるようにしたい場合によく使用するメソッドを提供します。これは、スクリプトがインラインではなく外部で参照される場合に特に役立ちます。

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

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

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

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

必ず呼び出されるクラスを作成しhiddenlabelvisibility:hidden実際には誰にもラベルが表示されないようにしてください。このようにして、非表示のラベルに多くのものを保存できます。

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

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

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

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

私はこのメソッドを日常的に使用していますが、ラベルを呼び出します class="data"、実際にはデータを格納する方法であるため、ます。クラス名「hiddenlabel」は愚かな名前の一種です。

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

.data{
    display:none;
}

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


3
DOMにデータを保存しないでください。なぜ誰もが、2年後でもそれを示唆するのでしょうか。HTMLファイルに何でも挿入できる場合は、その値をJS変数に挿入します。<script> var ip = <?php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script>。少なくともスクリーンリーダーはそれを逃し、getElementByIdや$( '#stupidname')は必要ありません。
coblr 2015

@fractalspawn、.jsファイルにphpコードを挿入できない理由。そんなこと考えなかった、スマーティーパンツ!;)
TARKUS 2015

ええと、なぜ<script type = "text / javascript" src = "path / to / fancy / javascript.php"> </ script>を実行したとしても、なぜそうするのかはわかりません。私のポイントは、PHPがレンダリングするHTMLに何かを挿入できる場合、ベストプラクティスは、解析する必要があるDOM要素ではなく、インラインスクリプトタグ内のJS変数に値を挿入することです。あなたがそれを防ぐために特別な対策を講じない限り、使用するためにアウトし、スクリーンリーダーによって潜在的に読み取られる可能性があります。
coblr 2015

データ保持要素をDOMに追加できない、または追加してはいけないという正当な理由は絶対にありません。そうすることには多くの正当な理由があります。実際、もう一度お読みになりたいのであれば、これらの理由は私の答えにあります。信頼性が高く、制御が簡単で、JavaScriptファイルがリモートサイトで発生する場合に特に役立ちます。リモートスクリプトといえば、「javascript.php」の例は恐ろしいアイデアであり、おそらく動作しません。DISQUSなどのリモートスクリプトについて考えます。
TARKUS 2015

3
DOMデータの保存が悪い理由についての他のコメントへ..まあ、まだ目的地の壁に軽くぶつけて車を止めることはできますが、今はその仕事のためのより良いツールがあります。私たちはこれをよく理解し、これを軽減するための優れたフレームワークを持っています。私は、DOMがJSの巨大な構成ファイルにすぎず、スタイルを変更するときに悪夢のような場所で働いていました。<script src = "something.php">の使用は「粗悪なハック」だと感じているが、Javascript内でのみ値を持つDOMにデータを保存することができない場合は、私たちがうまくいかなくて本当に嬉しいです一緒にそして再び、喜んで同意しないことに同意します。:)
coblr 2015年



6

まず最初に実際の答え純粋にクライアント側で実行されたコードを使用して自分の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
}

5

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


4
var call_to = "http://smart-ip.net/geoip-json?callback=?";

$.getJSON(call_to, function(data){
   alert(data.host);
});

data.hostIPアドレスです。ブラウザからこれを呼び出すだけです。

http://smart-ip.net/geoip-json?callback=? [引用符なし]とIPを取得します。


申し訳ありませんが、$はJavaScriptで何を意味しますか?
GHOST
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.