JavaScript kullanarak istemcinin IP adresini nasıl alabilirim?


560

Bir şekilde JavaScript kullanarak istemcinin IP adresini almak gerekir; sunucu tarafı kodu yok, SSI bile değil.

Ancak, ücretsiz bir üçüncü taraf komut dosyası / hizmeti kullanmaya karşı değilim.

Yanıtlar:


772

JSON (işler daha basit hale getirmek için jQuery ile birlikte) dönebilir bir web hizmeti kullanırsınız. Aşağıda bulabildiğim tüm ücretsiz aktif IP arama hizmetleri ve geri döndükleri bilgiler bulunmaktadır. Başka bir şey biliyorsanız, lütfen bir yorum ekleyin, bu yanıtı güncelleyeceğim.


Cloudflare

Deneyin: 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)
})

İadeler:

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

Sınırlamalar:

  • Düz metin döndürür

DB-IP

Deneyin: http://api.db-ip.com/addrinfo?api_key= < api anahtarınız > & addr = < ip adresi >

İadeler:

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

Sınırlamalar:

  • Günde 2.500 istek
  • JSONP geri aramalarını desteklemiyor
  • IP adresi parametresi gerektirir
  • API anahtarınızı almak için bir e-posta adresi gerektirir
  • Ücretsiz planla SSL (https) yok

Geobytes

Deneyin: http://gd.geobytes.com/GetCityDetails

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

İadeler:

{
  "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"
}

Sınırlamalar:

  • Saatte 16.384 istek
  • Ücretsiz planla SSL (https) yok
  • Yanlış yere geri dönebilirim (Singapur'dayım, Suudi Arabistan değil)

GeoIPLookup.io

Deneyin: https://json.geoiplookup.io/api

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

İadeler:

{
    "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
}

Sınırlamalar:

  • Saatte 10.000 istek
  • Ücretsiz API yalnızca ticari olmayan kullanıma izin verir

geoPlugin

Deneyin: http://www.geoplugin.net/json.gp

$.getJSON('http://www.geoplugin.net/json.gp?jsoncallback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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
}

Sınırlamalar:

  • Dakikada 120 istek
  • Ücretsiz planla SSL (https) yok

Hacker Hedefi

Deneyin: https://api.hackertarget.com/geoip/?q= < ip adresi >

İadeler:

IP Address: 116.12.250.1
Country: SG
State: N/A
City: Singapore
Latitude: 1.293100
Longitude: 103.855797

Sınırlamalar:

  • Günde 50 istek
  • JSONP geri aramalarını desteklemiyor
  • IP adresi parametresi gerektirir
  • Düz metin döndürür

ipapi.co

Deneyin: https://ipapi.co/json/

$.getJSON('https://ipapi.co/json/', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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"
}

Sınırlamalar:

  • Günde 1.000 istek
  • SSL (https) gerektirir

IP-API.com

Deneyin: http://ip-api.com/json

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

İadeler:

{
  "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": ""
}

Sınırlamalar:

  • Dakikada 150 istek
  • Ücretsiz planla SSL (https) yok

Ipdata.co

Deneyin: https://api.ipdata.co

$.getJSON('https://api.ipdata.co', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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
  }
}

Sınırlamalar:

  • Günde 1.500 istek
  • API anahtarınızı almak için bir e-posta adresi gerektirir
  • SSL (https) gerektirir

IP Bul

Deneyin: https://ipfind.co/me?auth= < api anahtarınız >

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

İadeler:

{
  "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"
  ]
}

Sınırlamalar:

  • Günde 300 istek
  • API anahtarınızı almak için kayıt gerektirir

IPGeolocation

Deneyin: https://api.ipgeolocation.io/ipgeo?apiKey= < api anahtarınız >

$.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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"
  }
}

Sınırlamalar:

  • Ayda 50.000 istek
  • API anahtarınızı almak için kayıt gerektirir

ipify

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

$.getJSON('https://api.ipify.org?format=jsonp&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "ip": "116.12.250.1"
}

Sınırlamalar:

  • Yok

IPInfoDB

Deneyin: https://api.ipinfodb.com/v3/ip-city/?key= < api anahtarınız > & 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));
});

İadeler:

{
  "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"
}

Sınırlamalar:

  • Saniyede iki istek
  • API anahtarınızı almak için kayıt gerektirir

ipinfo.io

Deneyin: https://ipinfo.io/json

$.getJSON('https://ipinfo.io/json', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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"
}

Sınırlamalar:

  • Günde 1.000 istek

Ipregistry

Deneyin: https://api.ipregistry.co/?key= < api anahtarınız >

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

İadeler:

{
  "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
  }
}

Sınırlamalar:

  • Ücretsiz plan 100.000 istek içerir
  • API anahtarınızı almak için kayıt gerektirir

ipstack (eski adıyla freegeoip.net)

Deneyin: http://api.ipstack.com/ < ip adresi >? Access_key = <api anahtarınız>

$.getJSON('http://api.ipstack.com/<ip_address>?access_key=<your_api_key>', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
    "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
    }
}

Sınırlamalar:

  • Ayda 10.000 istek
  • IP adresi parametresi gerektirir
  • API anahtarınızı almak için kayıt gerektirir
  • Ücretsiz planla SSL (https) yok

jsonip.com

Deneyin: https://jsonip.com

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

İadeler:

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

Sınırlamalar:

  • Tepki yükselme içerir

JSON Testi

Deneyin: http://ip.jsontest.com/

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

İadeler:

{
  "ip": "116.12.250.1"
}

Sınırlamalar:

  • SSL yok (https)
  • Kota üzerinden çok düştü, bu yüzden üretim için kullanmam
  • İstediğiniz adres olmayabilir IPv6 adresini döndürür

Nekudo

Deneyin: https://geoip.nekudo.com/api

$.getJSON('https://geoip.nekudo.com/api', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

İadeler:

{
  "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"
}

Sınırlamalar:

  • EasyPrivacy listesini kullanarak reklam engelleyiciler tarafından engellendi

Bunların tümü ücretsiz hizmetler olduğundan, kilometrenizin kotanın ve çalışma süresinin aşılması bakımından değişebileceğini ve yolun ne zaman çevrimdışı olup olmayacağını kimin bilip bilmediğini unutmayın (sergi A: Telize) ). SSL hizmetleri gibi daha fazla özellik istiyorsanız, bu hizmetlerin çoğu ücretli bir katman sunar.

Ayrıca, aşağıdaki yorumlarda belirtildiği gibi, skobaljiç'in belirttiği gibi, istek kotaları çoğunlukla akademiktir, çünkü bu müşteri tarafında gerçekleşmektedir ve çoğu son kullanıcı asla kotayı aşmayacaktır.

GÜNCEL


3
@AfolabiOlaoluwaAkinwumi şöyle bir şey deneyebilirsiniz: $.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. tuşunun kullanımı nedeniyle, bir API anahtarına ihtiyacınız olanlardan uzak kalmak için iyi bir nokta ve belki de bir neden: sınırlamalar genellikle hiçbir şey anlam olabilir sayılabilir.
Nick Rice

2
@JohnWeisz Doğru, ancak OP sadece sayfayı güncelleyebilecekleri ve sunucu tarafı (sorudan net olmayan) bir şey yapamayacakları anlamına geliyorsa, bu seçenekler soruya iyi cevap verir.
Nick Rice

1
@RobWaa teşekkürler, 4/14 güncellemesinde reklam engelleyici sınırlamasını ekledim. Kısaca geoiplookup.io ekleyeceğim.
thdoan

1
Tüm bu yanıtlar, yalnızca bu hizmetin zamanında yanıt vermesine bağlı olduğunuz için değil, aynı zamanda uygun olmayan bir zaman aşımı ( daha sonradan sonner), sayfanızın yükleme süresini geciktirirsiniz, bu hiç de iyi değildir. Öyleyse, neden müşterinin IP'sini döndürmek için sadece kendi sunucunuzu kullanmıyorsunuz? BTW herhangi bir programlama dili ile önemsiz bir görevdir.
Daniel J.

280

Son Güncelleme

Tarayıcılar webrtc sızıntısını düzelttiği için bu çözüm artık çalışmaz: bu diğer soru hakkında daha fazla bilgi için: RTCIceCandidate artık IP döndürmüyor


Güncelleme : Ben her zaman kodun bir min / uglified sürümü yapmak istedim, işte bir ES6 Promise kodu:

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

Not: Kullanıcının tüm IP'lerini (ağına bağlı olarak daha fazla olabilir) istiyorsanız, bu yeni küçültülmüş kod yalnızca tek bir IP döndürür, orijinal kodu kullanın ...


WebRTC sayesinde , WebRTC destekli tarayıcılarda yerel IP almak çok kolaydır (en azından şimdilik). Kaynak kodunu değiştirdim, satırları azalttım, yalnızca Genel IP'yi değil, sadece IP'yi değil, herhangi bir sersemletme isteği yapmıyorum, aşağıdaki kod en son Firefox ve Chrome'da çalışıyor, sadece snippet'i çalıştırın ve kendiniz kontrol edin:

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>

burada olan şu, kukla bir akran bağlantısı yaratıyoruz ve uzaktan akranın bizimle iletişime geçmesi için genellikle buz adaylarını birbirimizle değiştiriyoruz. Ve buz adaylarını (yerel oturum tanımından ve onIceCandidateEvent'ten) okuyarak kullanıcının IP'sini söyleyebiliriz.

kodu nereden aldım -> Kaynak


12
Burada oy verin, çünkü burada en iyi cevabı verin, harika GitHub repo için teşekkürler!
kano

28
Uyarı: Bu, genel IP'nizi göstermez, yalnızca yerel ağınızı gösterir. Örneğin, bir LAN'daysa bir kullanıcı ülkesini tespit etmek için kullanamazsınız
FloatingRock

1
@ FloatingRock, STUN sunucusunu kullanarak genel IP'yi de alabilir (ve eş oluştururken konfigüre edebilirsiniz), daha sonra bir STUN sunucusunu korumanızı / kullanmanızı, sunucu kodunu resme getirmenizi gerektirir.
mido

10
Bu WebRTC Sızıntısı olarak bilinir. Tüm belediye başkanı tarayıcıları tarafından düzeltilmelidir, ancak değildir. Daha fazla bilgi için: privacytools.io/webrtc.html Muhtemelen gerçek ip'inizi sızdıran Tor tarayıcıyla ilgili.
Kapitein Witbaard

1
Yine de, cevabı beğendim, müşteri WebRTC'yi devre dışı bırakarak bu işlemi geçebilir - restoreprivacy.com/webrtc-leaks
ni8mr

175

JSONP ile sunucu tarafı üzerinden geçirebilirsiniz

Ve birini bulmak için googling, burada buldum SO üzerinde İstemci tarafı Javascript kullanarak bir DNS arama (ana bilgisayar adı IP adresine) yapabilir miyim?

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

Not: telize.com API, 15 Kasım 2015 itibarıyla kalıcı olarak kapanmıştır .


45
Bu pasajı takdir ederken, bir JavaScript metin içeriği yükleme ve bir işlev aracılığıyla ciddi bir güvenlik riski olduğunu değerlendirme düşünüyorum. Yanıtın içeriği değişirse ve burada bu cevabı oylayan ve muhtemelen bu pasajı kullanan 100'den fazla kişi olası güvensiz içeriğe sahip bir işlevi çağırırsa ne olur? Bunu sadece bir JSON dizesi olsaydı kullanırdım.
auco

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

28
Sunucu tarafı isteği içerdiğinden bu iyi bir yanıt değildir. Soru açıkça "saf javascript" i ifade etti.
Micah

2
Micah, saf javascript ile bir ip adresi almanın mümkün bir yolu yok. NAT ve bunun nasıl çalıştığı hakkında biraz okuma yapmanızı öneririm. İnternet IP adresinizi size geri yansıtabilmek için bir sunucuya ihtiyacınız var
Chad Grant

11
Hizmet şimdi kapalı.
Cyril

109

Buradaki cevapların çoğu, başkalarının sunucusuna vurarak sunucu tarafı kod ihtiyacını "çözer". Bir sunucuya çarpmadan IP adresini almanız gerekmedikçe , tamamen geçerli bir tekniktir .

Geleneksel olarak bu bir çeşit eklenti olmadan mümkün değildi (ve hatta bir NAT yönlendiricisinin arkasında olsaydınız muhtemelen yanlış IP adresini alırdınız), ancak WebRTC'nin ortaya çıkmasıyla bunu yapmak gerçekten mümkün. . Eğer hedeflediğiniz tarayıcıları desteğin WebRTC (şu anda: Firefox, Chrome ve Opera).

Lütfen mido'nun cevabını okuyunWebRTC'yi kullanarak yararlı istemci IP adreslerini nasıl alabileceğinize ilişkin ayrıntılar için .


23
@oscar: cevabında belirtilen teknikle aynı (JSONP-döndürülen sunucu-görünür IP) gibi görünüyor. Bu da OP'nin "sunucu tarafı kodu yok" gereksinimine uymuyor. Ancak evet, bu gereksinimi göz ardı ederseniz, bunu başarmanın bir yolu budur.
Shog9

Bu yanıt WebRTC nedeniyle eski: stackoverflow.com/questions/20194722/…
Akam

1
Güncellendi, @Akam. Mido'ya bunu birkaç ay öncesine işaret etmesi için bazı sahne vermelisiniz (YILLIK kişi, hala sunucu desteği gerektiren utanç verici yanlış cevaplar gönderdikten sonra).
Shog9

WebRTC artık daha yaygın olarak destekleniyor mu ?!
oldboy

1
Bu "CanIUse" bağlantısına göre, @BugWhisperer. IE'ye ihtiyacınız olmadığı sürece.
Shog9

81

Hostip.info ya da benzeri bir servis için ajax çağrısı yapabilirsiniz ...

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;
}

Bonus olarak, coğrafi çağrı bilgileri aynı çağrıda döndürülür.


6
Ayrıca api.hostip.info/get_json.php kullanarak bir JSON temsili alabilirsiniz , ardından JSON'u tarayıcı işlevi, jQuery veya Prototype ile ayrıştırabilirsiniz.
Brad Folkens

2
" api.hostip.info/get_html.php " ile ilgili herhangi bir talep limiti var mı? bu api ayrıntılarını nerede görebilirim
Navin Leon

Ağ Güvenlik Duvarının IP'sini döndürür. gerçek istemci IP'si değil. Gerçek İstemci IP'sini almanın bir yolu var mı?
Leela Addagulla

76
Bunu dene
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

VEYA

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

Vaktini boşa harcamak


bu $ .get (" ipinfo.io ", function (response) {alert (response.ip);}, "jsonp"); ancak değeri bir değişkene nasıl kaydedebilirim? Bu get istek döngüsü dışında kayboluyor gibi görünüyor

1
Tüm ücretsiz IP arama hizmetlerinin listesi için stackoverflow.com/questions/391979/…
thdoan

Bu işlevi ip değerini döndürmek için nasıl gönderirim?
Neftali Acosta

67

Yapamazsın. Bir sunucu istemelisin.


5
Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
Himanshu

28
Ama öyle, değil mi? Demek istediğim, eğer cevap sadece "hayır, yapamazsın" ise, o zaman bu durumun şu anda açıkta olandan daha doğru bir cevap olduğunu söyleyebilirim, bu rastgele appspot uygulamasını kullanın. listenin en üstünde.
SteveShaffer

16
IMO Bu doğru cevaptır ve kabul edilmelidir. Soru özellikle "sunucu tarafı kodu yok" diyor.
matthewwithanm


2
@matthewwithanm Daha fazla anlaşamadım. Kimsenin tam olarak bunu söylemiş olup olmadığını görmek için tüm cevapları kaydırıyordum ve bunu kendim bir cevap olarak sunmaya hazırlandım. Yüksek derecede onaylanmış tüm cevaplar, bilgilendirici olsa da, hepsi farklı bir soruya cevap veriyor. Soru şu: "Bir şekilde saf JavaScript kullanarak istemcinin IP adresini çekmem gerekiyor; sunucu tarafı kodu yok, SSI bile değil." Bu cevap, aslında doğru cevaptır. Tarayıcı korumalı alan Javascript bunu yapamaz (NAT veya proxy'lerden bağımsız olarak). Diğer cevaplardan biri kabul edilecekse soru değiştirilmelidir.
wally

64

Başka yerde arama

Check out http://www.ipify.org/

Onlara göre:

  • Sınırsız kullanabilirsiniz (dakikada milyonlarca istek yapsanız bile).
  • ipify tamamen açık kaynak kodludur ( GitHub deposuna bakın ).

İşte çalışan bir JS örneği (bu cevabın neden bu kadar az oyu olduğunu merak etmek yerine, onu çalışırken görmek için kendiniz deneyin):

<script>
function getIP(json) {
  alert("My public IP address is: " + json.ip);
}
</script>
<script src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

Kopyalamak / yapıştırmak için çok tembel misiniz? Bunu sevdim. İşte bir demo

Tıklamak çok tembel mi? :O

Not : Demoyu çalıştırmadan önce Adblock Plus / uBlock & co'yu kapatın .. Aksi takdirde, çalışmaz.

Ben hiçbir şey IPify takımı ile yapacak. Ben sadece birinin genel iyilik için böyle bir hizmet sağlayacak gülünç serin olduğunu düşünüyorum.


4
En iyi yanı, bu "https" den gelirken, http IP yardımcıları benim çağrıları "güvenli değil" çünkü bloke olur olmasıdır.
Tessa

hey, bana CORS hatasını gösteriyor, ne yapmalıyım?
saberprashant

@saberprashant "HTTPS" mi kullanıyorsunuz?
FloatingRock

@FloatingRock, hayır HTTP kullanıyorum
saberprashant

26

Bunun için istemcinizin IP'sini, ana makine adını, coğrafi konum bilgilerini ve ağ sahibini verecek olan http://ipinfo.io hizmetimi kullanabilirsiniz . İşte IP'yi kaydeden basit bir örnek:

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

Aşağıda, tüm yanıt bilgilerini de yazdıran daha ayrıntılı bir JSFiddle örneği verilmiştir, böylece mevcut tüm ayrıntıları görebilirsiniz: http://jsfiddle.net/zK5FN/2/


Karışık İçerik Politikası sorunları değişikliğini önlemek için http://ipinfo.ioiçin //ipinfo.ioveya https
Samuel elh

Hizmetinizi kullanmak istiyoruz, Stackoverflow kullanıcıları için herhangi bir indirim teklifiniz var mı?
Mehdi Dehghani

@MehdiDehghani bir backlink ile 100k için ayda 50k req için ücretsiziz - bkz. İpinfo.io/contact/creditlink
Ben Dowling

19

Bu kodu sayfanıza ekleyin: <script type="text/javascript" src="http://l2.io/ip.js"></script>

burada daha fazla doktor


1
Hm. İlginç görünüyor ... Sınırları var mı?
indapublic

1
kütüphane çevrimdışı
riccardo.tasso

L2.io ref ile ilişkili spam pop up bir dereceye vardır: hybrid-analysis.com/sample/... örnek olduğu gibi bağlantıların katıştırma izin verir 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip "," host ":" l2.io "," yönlendiren ":" website.com/… } "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = true & fingerprint = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza

16

Çad ve Malta'nın harika bir cevabı olduğunu söyleyebilirim. Ancak, onların karmaşık. Ülke eklentisine göre reklamlardan bulduğum bu kodu öneriyorum

<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 yok. Sadece düz javascripts. : D

Http://j.maxmind.com/app/geoip.js adresine giderseniz, içerdiğini göreceksiniz

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 ''; }

Henüz soruyu gerçekten cevaplamıyor çünkü

http://j.maxmind.com/app/geoip.js IP içermiyor (ülkeyi almak için IP'yi kullanıyor olmasına rağmen).

Ama böyle bir şey açan bir PhP betiği yapmak çok kolay

function visitorsIP()   { return '123.123.123.123'; }

Şunu yap. Http://alanadiniz.com/alanadiniz.php'yi ekleyin .

Sonra yap

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

Soru, üçüncü taraf komut dosyası kullanmama özelliğinden bahsediyor. Başka yolu yok. Javascript IP'nizi bilemez. Ancak, javascript ile erişilebilen diğer sunucular da sorunsuz bir şekilde çalışabilir.


7
uzak bir sunucudan JavaScript yüklemek ve bilinmeyen içerikleri olan işlevleri çağırmak benim için büyük bir güvenlik riski gibi görünüyor (ya işlev içeriği değişirse?). Bir JSON yanıtını ayrıştırmayı tercih ederim.
auco

3
Hata 404: Nesne bulunamadı
Trejder

Çok uzun zaman oldu., Cevap aslında oldukça yanlış. Javascript IP bilmiyor bilmiyordum.
user4951

oh doğru fonksiyonuIPIP bir php kodu olması amaçlanmamıştır. Bu php kodu tarafından oluşturulan bir javacript kodu
user4951

sadece kendi sunucunuzu kullanabilirsiniz sonra ziyaretçiler ip atanan bir javascript kodu yazdırmak için.
user4951

15

Bu sorunun iki yorumu vardır. Çoğu kişi, "İstemci IP" yi, Web sunucusunun LAN dışında ve İnternet'te gördüğü Genel IP Adresi anlamına gelir. Bu çoğu durumda istemci bilgisayarın IP adresi değildir.

JavaScript yazılımımı barındıran tarayıcıyı çalıştıran bilgisayarın gerçek IP adresine ihtiyacım vardı (bu neredeyse her zaman NAT katmanının arkasında olan bir LAN üzerindeki yerel IP adresidir).

Mido, FANTASTİK bir cevap gönderdi, bu istemcinin IP adresini gerçekten sağlayan tek cevap gibi görünüyor.

Bunun için teşekkürler, Mido!

Ancak, sunulan işlev zaman uyumsuz olarak çalışır. Aslında kodumda IP adresini KULLANMAK gerekiyor ve zaman uyumsuz bir çözüm ile, alınmadan / öğrenilen / saklanan önce IP adresini kullanmaya çalışabilirsiniz. Onları kullanmadan önce sonuçları beklemek zorunda kaldım.

İşte Mido'nun fonksiyonunun "Beklenebilir" versiyonu. Umarım başka birine yardımcı olur:

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

Ziyaretçinizden herhangi bir izin istemeyecek daha kolay ve ücretsiz bir yaklaşım var.

Bu çok basit Ajax POST isteği göndererek oluşur http://freegeoip.net/json . Konum bilgilerinizi aldıktan sonra, JSON'da, sayfayı güncelleyerek veya yenisine yönlendirerek buna göre tepki verirsiniz.

Konum bilgisi isteğinizi şu şekilde gönderirsiniz:

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

Görünüşe göre 1 Temmuz 2018'de
kapanıyorlar

13

Peki, ben sorudan ayrılıyorum, ama bugün benzer bir ihtiyaç vardı ve Javascript kullanarak istemciden kimliği bulamadı, ancak aşağıdakileri yaptım.

Sunucu tarafında: -

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

Javascript Kullanımı

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

ASP.Net Ajax kullanıyorum, ancak $ get () yerine getElementById kullanabilirsiniz.

Neler oluyor, sayfada kullanıcının IP'sinin sunucudan oluşturulduğu gizli bir div öğesi var. Javascript'te olduğundan sadece bu değeri yüklüyorum.

Bu sizinki gibi benzer bir şartı olan bazı insanlar için yararlı olabilir (bunu çözememişken benim gibi).

Şerefe!


20
-1: OP özellikle "sunucu tarafı kodu yok" dan bahseder, ancak bazı C # kullanırsınız.
Bruno Reis

8
Sadece çıktı almak daha iyi olmaz mıydı <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines

sunucu tarafı kodunu kullanmanın dışında, veri depolamak için asla DOM kullanılmamalıdır. Bu her yerde kötü. Hainesy'nin sadece JS var.
coblr

13

Smart-IP.net Geo-IP API kullanarak . Örneğin, jQuery kullanarak:

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

15
Msgstr "Hizmet Geçici Olarak Kullanılamıyor".
Iago

istemci ip adresi, ssl etkin ve sınırsız almak için basit bir api [ geoip.immanuel.co/myip] yazdı
Immanuel


9

IP'nizi jQuery ile alın

IP adresinizi bir JS satırı ile alabilirsiniz? Bunu sizin için sunan ücretsiz bir hizmet var ve yapmanız gereken tek şey bir alma isteği:

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

Yukarıdaki snippet'in çalışması için tarayıcınızın CORS'ı (çapraz menşe istek paylaşımı) desteklemesi gerekir. Aksi takdirde bir güvenlik istisnası atılır. Daha eski tarayıcılarda, JSON-P isteği kullanan bu sürümü kullanabilirsiniz:

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

9

Userinfo.io javascript kütüphanesini kullanabilirsiniz .

<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
});

Ayrıca betiği yüklemek için requirjs kullanabilirsiniz.

Ziyaretçinizin IP adresini ve bulunduğu yerle ilgili birkaç veriyi (ülke, şehir vb.) Verecektir. Maxmind geoip veritabanını temel alır.

Feragatname: Bu kütüphaneyi yazdım


8

Javascript / jQuery Müşterinin IP Adresini ve Konumunu al (Ülke, Şehir)

Yalnızca sunucuya "src" bağlantısı olan bir etiket yerleştirmeniz gerekir. Sunucu Object / JSON olarak "codehelper_ip" i döndürür ve hemen kullanabilirsiniz.

// 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 hakkında daha fazla bilgi

JQUery kullanıyorsanız şunları deneyebilirsiniz:

console.log(codehelper_ip); 

Size döndürülen nesne hakkında daha fazla bilgi gösterecektir.

Geri arama işlevi istiyorsanız, lütfen şunu deneyin:

// 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
kullanmayan languageözelliğini kullanmak type="text/javascript"yerine, daha on MDN
Alex K

@Alex'in daha önce de belirtildiği gibi, dil kullanımdan kaldırılmıştır ve yalnızca eski kodda kullanılır. Bunun yerine maksimum uyumluluk için 'type = "text / javascript"' kullanın.
Gautham C.9

1
sadece FYI - HTML5 için tür alanı gerekli değildir (JS varsayılan değerdir). w3schools.com/tags/att_script_type.asp
pmont

Bu diğer yorumları kaçırmış olmanız durumunda, dil yerine
Mike

8

Appspot.com geri arama hizmeti kullanılamıyor. ipinfo.io çalışıyor.

Fazladan bir adım attım ve AngularJS kullanarak tüm coğrafi bilgileri aldım. (Ricardo sayesinde) Şuna bir bak.

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

Burada çalışma sayfası: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


8

Yine de bir dosya ekliyorsanız, basit bir ajax get:

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

Ve ajax.getIp.phpbu olurdu:

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

8

api.ipify.orgHem HTTP hem de HTTPS'yi desteklediğinden gerçekten hoşlanıyorum .

Aşağıda, api.ipify.orgjQuery kullanarak IP almanın bazı örnekleri verilmiştir .

HTTPS üzerinden JSON Biçimi

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 üzerinden JSON Biçimi

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 üzerinden metin biçimi

JSON'da istemiyorsanız HTTPS üzerinden düz metin yanıtı da vardır

https://api.ipify.org

HTTP üzerinden metin biçimi

Ve HTTP üzerinden düz metin yanıtı da var

http://api.ipify.org

8

İpdata.co kullanın .

API ayrıca coğrafi konum verileri sağlar ve her biri günde 800 milyondan fazla isteği işleyebilen 10 global uç noktaya sahiptir!

Bu cevap, çok sınırlı olan ve yalnızca birkaç çağrıyı test etmek için kullanılan bir 'test' API Anahtarı kullanır. Aboneliği Kendi ücretsiz API Key ve geliştirme için her gün 1500 isteklerine kalk.

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

İstemci bilgisayarın IP adresini almanın güvenilir bir yolu yoktur.

Bu bazı olasılıklardan geçer. Kullanıcının birden fazla arabirimi varsa, Java kullanan kod bozulur.

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

Buradaki diğer yanıtlara bakıldığında, müşterinin genel IP adresini almak isteyebileceğiniz gibi görünüyor, bu da muhtemelen internete bağlanmak için kullandıkları yönlendiricinin adresi. Buradaki diğer cevapların çoğu bunun hakkında konuşuyor. Çalışmayı devam ettirebilecek veya etmeyebilecek başka birinin hizmetine bağlı olarak, isteği almak ve IP adresi ile yanıt vermek için kendi sunucu tarafı sayfanızı oluşturup barındırmanızı öneririm.


7

Ben html sayfasında bilgi saklamak istediğinizde çok kullandığım bir yöntem sunacak ve benim javascript aslında javascript parametreleri geçirmek zorunda kalmadan bilgi okumak istiyorum. Bu, özellikle komut dosyanızın satır içi yerine harici olarak başvurulması durumunda yararlıdır.

Ancak, "sunucu tarafı komut dosyası yok" ölçütünü karşılamıyor. Ancak, html'nize sunucu tarafı komut dosyası ekleyebiliyorsanız şunları yapın:

HTML sayfanızın alt kısmında, son gövde etiketinin hemen üstünde gizli etiket öğeleri oluşturun.

Etiketiniz şöyle görünecek:

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

Bir sınıfı çağırdığınızdan hiddenlabelve visibility:hiddenetiketi gerçekten görmeyecek şekilde ayarladığınızdan emin olun . Bu şekilde birçok şeyi gizli etiketlerde saklayabilirsiniz.

Şimdi, javascript'inizde, etikette saklanan bilgileri (bu durumda istemcinin ip adresi) almak için şunları yapabilirsiniz:

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

Şimdi "ip" değişkeniniz ip adresine eşittir. Şimdi ip'i API isteğinize aktarabilirsiniz.

* 2 YIL SONRA DÜZENLEYİN * İki küçük ayrıntılandırma:

Bu yöntemi rutin olarak kullanıyorum, ancak etiketi çağırıyorum class="data" , çünkü aslında, veri depolamanın bir yoludur. Sınıf adı "hiddenlabel" biraz aptalca bir isim.

İkinci değişiklik, stil sayfasında visibility:hidden:

.data{
    display:none;
}

... bunu yapmanın daha iyi bir yoludur.


3
DOM'da veri saklamayın. Neden biri 2 yıl sonra bile bunu önerebilir? HTML dosyasına herhangi bir şey enjekte edebilirseniz, bu değeri böyle bir JS değişkenine enjekte edin. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </ script>. En azından ekran okuyucuları özleyecek ve getElementById veya $ ('# stupidname') gerekli değil.
coblr

@fractalspawn, Bir .js dosyasına php kodu ekleyememenizin nedeni. Bunu düşünmedim, pantolonunu akıllı mı yaptın! ;)
TARKUS

Peki, <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script> yapmış olsanız da bunu neden yapacağınızdan emin değilsiniz. Demek istediğim, PHP, oluşturduğu HTML'ye bir şey ekleyebiliyorsa, en iyi uygulama, ayrıştırmanız gereken bir DOM öğesine değil, bir satır içi komut dosyası etiketi içindeki bir JS değişkenine bir değer eklemesini sağlamaktır. kullanın ve önlemek için ekstra önlemler almadığınız sürece ekran okuyucular tarafından okunabilir.
coblr

DOM'a veri tutma öğeleri ekleyememenizin veya eklememenizin kesinlikle iyi bir nedeni yoktur ve bunu yapmak için birçok iyi neden vardır. Aslında, tekrar okumak isterseniz, bu nedenler cevabımda. Güvenilir, kontrolü kolay ve özellikle javascript dosyanız uzak bir sitede gerçekleştiğinde kullanışlıdır. Uzak komut dosyasından bahsetmişken, "javascript.php" örneğiniz korkunç bir fikirdir ve muhtemelen işe yaramaz. DISQUS gibi uzak komut dosyaları açısından düşünün.
TARKUS

3
DOM veri depolamasının neden kötü olduğu hakkındaki diğer yorumunuza .. Eh, yine de hedefinize bir duvara hafifçe vurarak bir aracı durdurabilirsiniz, ancak şimdi iş için daha iyi araçlar var. Şimdi daha iyi biliyoruz ve bunu hafifletmek için harika çerçevelerimiz var. DOM'un JS için çok büyük bir yapılandırma dosyası olduğu bir yerde çalıştım ve restyled edildiğinde bir kabus oldu. <Script src = "something.php"> kullanmanın "kaba bir saldırı" olduğunu düşünüyorsanız, ancak yalnızca Javascript içinde değeri olan DOM'da veri depolamanın uygun olmadığını düşünüyorsanız, o zaman gerçekten çalışmadığımız için mutluyum birlikte ve tekrar, memnuniyetle katılmıyorum kabul ediyorum. :)
coblr

6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });


6

Her şeyden önce asıl cevap : Kendi IP adresinizi bulmak için tamamen istemci tarafında yürütülen kodu kullanmak mümkün değildir.

Ancak https://api.muctool.de/whois adresine bir GET yapabilir ve bir müşterinin IP adresini almak gibi bir şey alabilirsiniz

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

Bunu tamamen istemci tarafında ve çoğunlukla JavaScript'te js çağırabileceği bir Flash nesnesi kullanarak yapabilirsiniz. Flaş olabilir çok faydalı olmayabilir yerel makinenin IP adresini erişin.


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

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

data.hostip adresidir. Bunu tarayıcınızdan aramanız yeterlidir.

http://smart-ip.net/geoip-json?callback=? [Tırnaklar olmadan] ve ip olsun.


üzgünüm, javascript'te $ ne anlama geliyor?
GHOST
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.