[javascript] JavaScript를 사용하여 클라이언트의 IP 주소를 얻는 방법은 무엇입니까?
어떻게 든 JavaScript를 사용하여 클라이언트의 IP 주소를 검색해야합니다. 서버 측 코드도없고 SSI도 없습니다.
그러나 무료 타사 스크립트 / 서비스를 사용하는 것은 아닙니다.
답변
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": "$",
"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이 아래 의견에서 언급했듯이 요청 할당량은 클라이언트 측에서 발생하기 때문에 대부분 학업 적이며 대부분의 최종 사용자는 할당량을 초과하지 않습니다.
업데이트
- 2016년 2월 1일 : 제거 된 Telize (더 이상 제공하지 않습니다 무료 계획)
- 2016 년 4 월 18 일 : freegeoip.net 제거 (서비스 중단)
- 2016 년 4 월 26 일 : DB-IP 추가
- 2016 년 4 월 26 일 : 해커 대상 추가
- 2016년 7월 6일 : 복원 됨 freegeoip.net
- 2016년 7월 6일 : 제거 ip-json.rhcloud.com (죽은 링크)
- 2016 년 12 월 21 일 : 해커 대상 제거 (서비스 중단)
- 2017 년 2 월 10 일 : Nekudo 추가
- 4/20/2017 : ipapi.co 추가 (Ahmad Awais 감사)
- 2017 년 4 월 24 일 : 복원 된 해커 대상
- 4/24/2017 : Snoopi.io 제거 (서비스 중단)
- 2017 년 7 월 16 일 : IP 찾기 추가 (JordanC 덕분에)
- 2017 년 7 월 16 일 : SSL을 지원하지 않는 무료 요금제에 대한 제한이 업데이트되었습니다.
- 9/25/2017 : 바보 웹 도구 추가 (Cœur 감사)
- 2018 년 3 월 16 일 : Ipdata.co 추가 (Jonathan에게 감사)
- 2018 년 4 월 14 일 : freegeoip.net을 ipstack으로 이름 변경 (MA-Maddin 덕분)
- 2018 년 4 월 16 일 : GeoIPLookup.io 추가 (Rob Waa 감사)
- 6/11/2018 : ipgeolocation 추가 (Ejaz Ahmed 덕분에)
- 7/31/2019 : Ipregistry 추가 (Laurent 감사)
- 2019 년 8 월 16 일 : SmartIP.io 추가 ( kevinj 감사)
- 8/22/2019 : 제거 된 바보 같은 웹 도구 (서비스 중단)
- 2019 년 12 월 8 일 : Smart IP 월별 요금 제한이 변경되었습니다.
- 12/10/2019 : Cloudflare 추가
- 2020년 1월 9일 : 제거 된 SmartIP.io (서비스 중)
답변
최종 업데이트
브라우저가 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를 알 수 있습니다.
어디에서 코드를 가져 갔 습니까?
답변
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 일부터 영구적으로 종료되었습니다 .
답변
여기에있는 대부분의 답변은 다음과 같은 방법으로 서버 측 코드의 필요성을 “해결”합니다. 실제로 서버에 충돌하지 않고 IP 주소를 얻을 필요 가 없다면 완전히 유효한 기술 입니다.
전통적으로 이것은 일종의 플러그인 없이는 가능하지 않았으며 (그리고 NAT 라우터 뒤에 있다면 잘못된 IP 주소를 얻었을 것 입니다) WebRTC의 출현으로 실제로는 가능합니다. . 경우 당신은 타겟팅 브라우저를 지원하는 WebRTC가 (현재 : 파이어 폭스, 크롬과 오페라).
WebRTC를 사용하여 유용한 클라이언트 IP 주소를 검색하는 방법에 대한 자세한 내용은 mido의 답변 을 읽으십시오 .
답변
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;
}
보너스로, 지역화 정보는 동일한 호출로 반환됩니다.
답변
이 시도
$.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);
});
});
답변
당신은 할 수 없습니다. 서버를 요청해야합니다.