JavaScript를 사용하여 클라이언트의 IP 주소를 얻는 방법은 무엇입니까?


560

어떻게 든 JavaScript를 사용하여 클라이언트의 IP 주소를 검색해야합니다. 서버 측 코드도없고 SSI도 없습니다.

그러나 무료 타사 스크립트 / 서비스를 사용하는 것은 아닙니다.

답변:


772

jQuery와 함께 JSON을 반환 할 수있는 웹 서비스를 사용하여 작업을 단순화합니다. 다음은 내가 찾을 수있는 모든 무료 활성 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= < API 키 > & addr = < ip address >

보고:

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

한계 :

  • 하루 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"
}

한계 :

  • 시간당 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
}

한계 :

  • 시간당 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
}

한계 :

  • 분당 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

한계 :

  • 하루 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,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": ""
}

한계 :

  • 분당 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,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"
  ]
}

한계 :

  • 하루에 300 건
  • API 키를 받으려면 등록이 필요합니다

ipgeolocation

사용해보십시오 : 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"
  }
}

한계 :

  • 한달에 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= < 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"
}

한계 :

  • 초당 두 번의 요청
  • 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,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
  }
}

한계 :

  • 무료 플랜에는 100,000 개의 요청이 포함됩니다.
  • 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
    }
}

한계 :

  • 한달에 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 주소가 있으면 원하는 주소를 반환합니다.

네 쿠도

사용해보십시오 : 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 True, 그러나 OP가 단순히 페이지를 업데이트하고 서버 측 (질문과 명확하지 않음)을 수행 할 수 없다는 것을 의미한다면 이러한 옵션은 질문에 잘 대답합니다.
Nick Rice

1
@RobWaa 덕분에 4/14 업데이트에서 광고 차단 제한을 추가했습니다. 곧 geoiplookup.io를 추가하겠습니다.
thdoan

1
이 모든 답변은 타사 서비스에 의존합니다.이 서비스는 적시에 응답하는 서비스에 의존하기 때문일뿐만 아니라 적절한 시간 초과를 설정하지 않으면 (항상 이후에 발생하는 경우) 페이지로드 시간이 지연되어 전혀 좋지 않습니다. 그렇다면 왜 자신의 서버를 사용하여 클라이언트의 IP를 반환하지 않습니까? 이것은 BTW가 프로그래밍 언어에서 사소한 작업입니다.
Daniel 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 만 원하기 때문에 소스 코드를 수정하고 줄을 줄였으며 기절 요청을하지 않았습니다. 아래 코드는 최신 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 저장소에 감사드립니다!
kano

28
경고 : 공개 IP가 아닌 로컬 네트워크 IP 만 표시합니다. 예를 들어 사용자가 LAN에있는 경우 사용자 국가를 감지하는 데 사용할 수 없습니다.
FloatingRock

1
@FloatingRock STUN 서버를 사용하여 공용 IP를 검색하고 피어를 만드는 동안 구성 할 수 있으며 STUN 서버를 유지 관리하고 사용하고 서버 코드를 그림으로 가져와야합니다.
mido

10
이것을 WebRTC 누출이라고합니다. 모든 시장 브라우저에 의해 수정되어야하지만, 그렇지 않습니다. 자세한 내용은 privacytools.io/webrtc.html 실제 브라우저에서 누수되는 Tor 브라우저와 관련이있을 수 있습니다.
Kapitein Witbaard

1
답변이 마음에 들었지만
webrtc

175

JSONP로 서버 측을 통해 릴레이 할 수 있습니다.

인터넷 검색 중 하나를 찾으려면 여기에서 찾으십시오. 클라이언트 측 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

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M

28
서버 측 요청과 관련되어 있으므로 좋은 답변이 아닙니다. 이 질문에는 "순수한 자바 스크립트"가 명확하게 언급되어 있습니다.
Micah

2
Micah, 순수한 자바 스크립트로 IP 주소를 얻을 수있는 방법이 없습니다. NAT에 대해 읽어보고 그 작동 방식을 제안합니다. 인터넷 IP 주소
Chad Grant

11
서비스가 중단되었습니다.
Cyril N.

109

여기에있는 대부분의 답변은 다음과 같은 방법으로 서버 측 코드의 필요성을 "해결"합니다. 실제로 서버에 충돌하지 않고 IP 주소를 얻을 필요 가 없다면 완전히 유효한 기술 입니다.

전통적으로 이것은 일종의 플러그인 없이는 가능하지 않았으며 (그리고 NAT 라우터 뒤에 있다면 잘못된 IP 주소를 얻었을 것 입니다) WebRTC의 출현으로 실제로는 가능합니다. . 경우 당신은 타겟팅 브라우저를 지원하는 WebRTC가 (현재 : 파이어 폭스, 크롬과 오페라).

WebRTC를 사용하여 유용한 클라이언트 IP 주소를 검색하는 방법에 대한 자세한 내용은 mido의 답변 읽으십시오 .


23
@ oscar : 그의 답변에서 언급 한 것과 동일한 기술 (JSONP가 서버에서 볼 수있는 IP)으로 보입니다. "서버 측 코드 없음"의 OP 요구 사항과 일치하지 않습니다. 그러나 그렇습니다. 요구 사항을 무시하면이를 달성 할 수 있습니다.
Shog9

WebRTC로 인해이 답변은 구식입니다.
인해이

1
@Akam을 업데이트했습니다. 몇 달 전부터이를 지적하기위한 몇 가지 도구를 mido에 제공 해야합니다 (여전히 서버 지원이 필요한 부끄러운 답변을 게시 한 사람들의 몇 년 후).
Shog9

WebRTC가 더 광범위하게 지원됩니까?!
oldboy

1
"CanIUse"링크에 따르면 @BugWhisperer입니다. IE가 필요하지 않으면.
Shog9

81

hostip.info 또는 유사한 서비스에 대한 아약스 호출을 할 수 있습니다 ...

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 또는 프로토 타입으로 JSON을 구문 분석 할 수도 있습니다 .
Brad Folkens

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 request 루프 밖에서 사라지는 것 같습니다

1
모든 무료 IP 조회 서비스 목록을 보려면 stackoverflow.com/questions/391979/…에
thdoan

ip 값을 반환하기 위해이 함수를 어떻게 보내나요?
Neftali Acosta

67

당신은 할 수 없습니다. 서버를 요청해야합니다.


5
이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
Himanshu

28
하지만 좀 그렇죠? 만약 대답이 "아니오, 안 돼요"라면, 이것이 현재의 찬란한 "여기,이 임의의 앱스 팟 앱을 사용하십시오"보다 더 정확한 답이라고 주장합니다. 목록의 상단.
SteveShaffer

16
IMO 정답이며 수락해야합니다. 이 질문은 구체적으로 "서버 측 코드 없음"이라고 말합니다.
matthewwithanm


2
@matthewwithanm 나는 더 이상 동의 할 수 없었다. 나는 누군가가 정확히 이것을 말했는지 알기 위해 모든 답변을 스크롤하고 있었고 그것을 직접 답변으로 제공 할 준비가되었습니다. 고도로 찬란한 모든 답변은 유익하지만 다른 질문에는 모두 답변합니다. "어떻게 든 순수한 JavaScript를 사용하여 클라이언트의 IP 주소를 가져와야합니다. 서버 쪽 코드는없고 SSI도 아닙니다." 이 대답은 사실 정답입니다. 브라우저 샌드 박스 Javascript는 NAT 또는 프록시에 관계없이이 작업을 수행 할 수 없습니다. 다른 답변 중 하나를 수락하려면 질문을 변경해야합니다.
wally

64

더 이상 보지마

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 팀과 는 아무런 관련없습니다 . 나는 누군가가 일반적인 재화를 위해 그러한 서비스를 제공한다는 것이 엄청나게 시원하다고 생각합니다.


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/


혼합 콘텐츠 정책 문제를 방지하려면 다음 http://ipinfo.io으로 변경 //ipinfo.io하거나 https
Samuel Elh

서비스를 사용하고 싶습니다. Stackoverflow 사용자를위한 할인 혜택이 있습니까?
Mehdi Dehghani

@MehdiDehghani 우리는 백 링크가있는 100k에 대해 최대 50k req / month 무료입니다 -ipinfo.io/contact/creditlink
Ben Dowling

19

이 코드를 페이지에 포함 시키십시오. <script type="text/javascript" src="http://l2.io/ip.js"></script>

여기 더 많은 의사


1
흠. 재미있어 보인다 ... 그들이 가지고있는 한도가 있습니까?
indapublic

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
Wayne 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>

아약스가 없습니다. 평범한 자바 스크립트. :디

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>

이 질문에는 특히 타사 스크립트를 사용하지 말라고 언급되어 있습니다. 다른 방법은 없습니다. 자바 스크립트가 IP를 알 수 없습니다. 그러나 자바 스크립트를 통해 액세스 할 수있는 다른 서버는 아무런 문제없이 잘 작동 할 수 있습니다.


7
원격 서버에서 JavaScript를로드하고 알 ​​수없는 내용으로 함수를 호출하면 큰 보안 위험처럼 보입니다 (함수 내용이 변경되면 어떻게됩니까?). 차라리 JSON 응답 구문 분석을 선호합니다.
auco

3
오류 404 : 개체를 찾을 수 없음
trejder

오랜 시간이 지났습니다. 실제로 대답은 틀린 것입니다. 나는 자바 스크립트가 IP를 알 수 없다는 것을 몰랐다.
user4951

방문자 IP 기능이 PHP 코드가 아닙니다. 그것은 PHP 코드에 의해 생성 된 javacript 코드입니다
user4951

자신의 서버를 사용하여 방문자에게 ip를 할당하는 자바 스크립트 코드를 인쇄 할 수 있습니다.
user4951

15

이 질문에 대한 두 가지 해석이 있습니다. 대부분의 사람들은 "클라이언트 IP"를 웹 서버가 LAN 외부와 인터넷에서 볼 수있는 공용 IP 주소로 해석했습니다. 그러나 대부분의 경우 클라이언트 컴퓨터의 IP 주소가 아닙니다.

JavaScript 소프트웨어를 호스팅하는 브라우저를 실행하는 컴퓨터의 실제 IP 주소가 필요했습니다 (NAT 계층 뒤에있는 LAN의 로컬 IP 주소).

Mido는 위의 FANTASTIC 답변을 게시했는데, 이는 실제로 클라이언트의 IP 주소를 제공 한 유일한 답변 인 것 같습니다.

미도!

그러나 제시된 기능은 비동기 적으로 실행됩니다. 실제로 코드에서 IP 주소를 사용해야하고 비동기 솔루션을 사용하여 IP 주소를 검색 / 학습 / 저장하기 전에 사용하려고 할 수 있습니다. 사용하기 전에 결과가 도착하기를 기다려야했습니다.

다음은 Mido 기능의 "대기 가능"버전입니다. 다른 사람에게 도움이되기를 바랍니다.

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>

자바 스크립트 사용

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

서버 측 코드를 사용하는 것 외에도 DOM을 사용하여 데이터를 저장해서는 안됩니다. 이것은 온통 나쁜 일입니다. Hainesy는 JS var에 할당하는 것이 더 좋습니다.
coblr

13

Smart-IP.net 사용하여 지리적 IP API를 . 예를 들어, jQuery를 사용하여 :

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});

15
"서비스 임시를 사용할 수 없음".
Iago

클라이언트 IP 주소, SSL 활성화 및 제한 없음을 얻기 위해 간단한 api [ geoip.immanuel.co/myip] 작성
Immanuel


9

jQuery로 IP를 얻으십시오

한 줄의 JS로 공용 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 자바 스크립트 라이브러리를 사용할 수 있습니다 .

<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"를 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>

1
사용하지 않는 language속성을 사용하는 type="text/javascript"대신에, 더에 MDN
알렉스 K

@Alex가 이미 언급했듯이 언어는 더 이상 사용되지 않으며 레거시 코드에서만 사용됩니다. 호환성을 극대화하려면 'type = "text / javascript"'를 사용하십시오.
Gautham C.

1
참고로 HTML5에는 유형 필드가 필요하지 않습니다 (JS가 기본값 임). w3schools.com/tags/att_script_type.asp
pmont

다른 의견을 놓친 경우를 대비하여 언어 대신 유형을 사용해야합니다.
Mike

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


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는 또한 지리적 위치 데이터를 제공하며 하루에 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>


7

클라이언트 컴퓨터의 IP 주소를 얻는 확실한 방법은 없습니다.

이것은 몇 가지 가능성을 겪습니다. 사용자에게 여러 인터페이스가 있으면 Java를 사용하는 코드가 작동하지 않습니다.

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

다른 답변을 보면 클라이언트의 공용 IP 주소를 얻으려는 것처럼 들릴 것입니다.이 IP 주소는 아마도 인터넷에 연결하는 데 사용하는 라우터의 주소 일 것입니다. 여기에 다른 많은 답변이 그것에 대해 이야기합니다. 계속 작동하거나 작동하지 않을 수있는 다른 사람의 서비스에 의존하지 않고 요청을 수신하고 IP 주소로 응답하기 위해 자체 서버 쪽 페이지를 만들어 호스팅하는 것이 좋습니다.


7

html 페이지에 정보를 저장하고 실제로 자바 스크립트에 매개 변수를 전달하지 않고도 정보를 읽을 수 있기를 원할 때 많이 사용하는 방법을 제공하려고합니다. 스크립트가 인라인이 아닌 외부에서 참조 될 때 특히 유용합니다.

그러나 "서버 측 스크립트 없음"이라는 기준을 충족하지 않습니다. 그러나 HTML에 서버 측 스크립팅을 포함시킬 수 있다면 다음과 같이하십시오 :

HTML 페이지 하단의 엔드 본문 태그 바로 위에 숨겨진 라벨 요소를 만듭니다.

라벨은 다음과 같습니다.

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

클래스를 호출 hiddenlabel하고 visibility:hidden아무도 실제로 레이블을 볼 수 없도록 설정하십시오 . 숨겨진 레이블에 이런 식으로 많은 것을 저장할 수 있습니다.

이제 자바 스크립트에서 레이블에 저장된 정보 (이 경우 클라이언트의 IP 주소)를 검색하려면 다음을 수행하십시오.

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

이제 변수 "ip"는 ip 주소와 같습니다. 이제 ip를 API 요청에 전달할 수 있습니다.

* 2 년 후 수정 * 두 가지 사소한 수정 :

class="data"실제로이 방법을 사용하지만 실제로는 데이터를 저장하는 방법이므로 label을 호출합니다 . 클래스 이름 "hiddenlabel"은 멍청한 이름입니다.

두 번째 수정은 visibility:hidden다음 대신 스타일 시트에 있습니다 .

.data{
    display:none;
}

... 더 나은 방법입니다.


3
DOM에 데이터를 저장하지 마십시오. 왜 2 년이 지난 후에도 누군가가 제안할까요? HTML 파일에 무엇이든 삽입 할 수 있다면 JS 변수에 해당 값을 주입하십시오. <스크립트> var ip = <? php echo $ _SERVER [ 'REMOTE_ADDR']; ?> </ script>. 적어도 스크린 리더는 그것을 놓치고 getElementById 또는 $ ( '# stupidname')이 필요하지 않습니다.
coblr

@fractalspawn, PHP 코드를 .js 파일에 삽입 할 수 없기 때문입니다. 그렇게 생각하지 않았다, 당신은 똑똑 바지를 했습니까! ;)
TARKUS

<script type = "text / javascript"src = "path / to / fancy / javascript.php"> </ script>을 수행 한 경우 왜 그런지 잘 모르겠습니다. 내 요점은 PHP가 렌더링하는 HTML에 무엇이든 삽입 할 수 있다면 구문 분석해야 할 DOM 요소가 아닌 인라인 스크립트 태그 내의 JS 변수에 값을 삽입하는 것이 가장 좋습니다 사용하기 위해 화면 판독기에서 읽을 수 있습니다.
coblr

DOM에 데이터 보유 요소를 추가 할 수 없거나 추가해서는 안되는 이유는 없으며,이를 수행해야하는 많은 이유가 있습니다. 사실, 당신이 그것을 다시 읽고 싶다면 그 이유는 내 대답에 있습니다. Javascript 파일이 원격 사이트에서 발생할 때 신뢰할 수 있고 제어하기 쉬우 며 특히 유용합니다. 원격 스크립트에 대해 말하면 "javascript.php"의 예는 끔찍한 아이디어이며 아마도 작동하지 않을 것입니다. DISQUS와 같은 원격 스크립트를 고려하십시오.
TARKUS

3
DOM 데이터 저장이 왜 나쁜지에 대한 다른 의견에 따르면, 목적지에서 벽을 가볍게 치면 차를 멈출 수 있지만 지금은 더 나은 작업 도구가 있습니다. 우리는 이제 이것을 더 잘 알고 있으며이를 완화 할 수있는 훌륭한 틀을 가지고 있습니다. DOM이 JS의 거대한 구성 파일 인 곳에서 일했으며 스타일을 바꿀 때 악몽이었습니다. <script src = "something.php"> 사용이 "조잡한 해킹"이라고 생각하지만 Javascript 내부에만 가치가있는 DOM에 데이터를 저장하는 것이 좋지 않다면 실제로 작동하지 않아서 기쁩니다. 함께하고 의지하여 기꺼이 동의하지 않습니다. :)
coblr



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를 얻으십시오.


죄송합니다. $는 자바 스크립트에서 무엇을 의미하나요?
GHOST
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.