Bagaimana cara mendapatkan alamat IP klien menggunakan JavaScript?

560

Saya perlu mengambil alamat IP klien menggunakan JavaScript; tidak ada kode sisi server, bahkan SSI.

Namun, saya tidak menentang menggunakan skrip / layanan pihak ke-3 gratis.

FlySwat
sumber

Jawaban:

774

Saya akan menggunakan layanan web yang dapat mengembalikan JSON (bersama dengan jQuery untuk mempermudah). Di bawah ini adalah semua layanan pencarian IP aktif gratis yang dapat saya temukan dan informasi yang mereka kembalikan. Jika Anda tahu lagi, silakan tambahkan komentar dan saya akan memperbarui jawaban ini.


Cloudflare

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

Pengembalian:

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

Keterbatasan:

  • Mengembalikan teks biasa

DB-IP

Cobalah: http://api.db-ip.com/addrinfo?api_key= < kunci api Anda > & addr = < alamat ip >

Pengembalian:

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

Keterbatasan:

  • 2.500 permintaan per hari
  • Tidak mendukung panggilan balik JSONP
  • Membutuhkan parameter alamat IP
  • Membutuhkan alamat email untuk mendapatkan kunci API Anda
  • Tidak ada SSL (https) dengan paket gratis

Geobyte

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

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

Pengembalian:

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

Keterbatasan:

  • 16.384 permintaan per jam
  • Tidak ada SSL (https) dengan paket gratis
  • Dapat mengembalikan lokasi yang salah (saya di Singapura, bukan Arab Saudi)

GeoIPLookup.io

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

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

Pengembalian:

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

Keterbatasan:

  • 10.000 permintaan per jam
  • API Gratis hanya memungkinkan penggunaan non-komersial

geoPlugin

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

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

Pengembalian:

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

Keterbatasan:

  • 120 permintaan per menit
  • Tidak ada SSL (https) dengan paket gratis

Target Peretas

Cobalah: https://api.hackertarget.com/geoip/?q= < alamat ip >

Pengembalian:

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

Keterbatasan:

  • 50 permintaan per hari
  • Tidak mendukung panggilan balik JSONP
  • Membutuhkan parameter alamat IP
  • Mengembalikan teks biasa

ipapi.co

Cobalah: https://ipapi.co/json/

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

Pengembalian:

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

Keterbatasan:

  • 1.000 permintaan per hari
  • Membutuhkan SSL (https)

IP-API.com

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

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

Pengembalian:

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

Keterbatasan:

  • 150 permintaan per menit
  • Tidak ada SSL (https) dengan paket gratis

Ipdata.co

Cobalah: https://api.ipdata.co

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

Pengembalian:

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

Keterbatasan:

  • 1.500 permintaan per hari
  • Membutuhkan alamat email untuk mendapatkan kunci API Anda
  • Membutuhkan SSL (https)

Temukan IP

Cobalah: https://ipfind.co/me?auth= < kunci api Anda >

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

Pengembalian:

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

Keterbatasan:

  • 300 permintaan per hari
  • Membutuhkan pendaftaran untuk mendapatkan kunci API Anda

ipgeolokasi

Cobalah: https://api.ipgeolocation.io/ipgeo?apiKey= < kunci api Anda >

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

Pengembalian:

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

Keterbatasan:

  • 50.000 permintaan per bulan
  • Membutuhkan pendaftaran untuk mendapatkan kunci API Anda

ipify

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

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

Pengembalian:

{
  "ip": "116.12.250.1"
}

Keterbatasan:

  • Tidak ada

IPInfoDB

Cobalah: https://api.ipinfodb.com/v3/ip-city/?key= < kunci api Anda > & 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));
});

Pengembalian:

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

Keterbatasan:

  • Dua permintaan per detik
  • Membutuhkan pendaftaran untuk mendapatkan kunci API Anda

ipinfo.io

Cobalah: https://ipinfo.io/json

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

Pengembalian:

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

Keterbatasan:

  • 1.000 permintaan per hari

IPregistry

Cobalah: https://api.ipregistry.co/?key= < kunci api Anda >

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

Pengembalian:

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

Keterbatasan:

  • Paket gratis termasuk 100.000 permintaan
  • Membutuhkan pendaftaran untuk mendapatkan kunci API Anda

ipstack (sebelumnya freegeoip.net)

Cobalah: http://api.ipstack.com/ < ip address >? Access_key = <kunci api Anda>

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

Pengembalian:

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

Keterbatasan:

  • 10.000 permintaan per bulan
  • Membutuhkan parameter alamat IP
  • Membutuhkan pendaftaran untuk mendapatkan kunci API Anda
  • Tidak ada SSL (https) dengan paket gratis

jsonip.com

Cobalah: https://jsonip.com

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

Pengembalian:

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

Keterbatasan:

  • Responsnya termasuk upsell

Tes JSON

Cobalah: http://ip.jsontest.com/

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

Pengembalian:

{
  "ip": "116.12.250.1"
}

Keterbatasan:

  • Tidak ada SSL (https)
  • Turun banyak (melebihi kuota), jadi saya tidak akan menggunakannya untuk produksi
  • Mengembalikan alamat IPv6 jika Anda memilikinya, yang mungkin bukan yang Anda inginkan

Nekudo

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

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

Pengembalian:

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

Keterbatasan:

  • Dicekal oleh pemblokir iklan menggunakan daftar EasyPrivacy

Ingatlah bahwa karena ini semua adalah layanan gratis, jarak tempuh Anda mungkin berbeda dalam hal melebihi kuota dan waktu aktif, dan siapa yang tahu kapan / apakah mereka akan offline di jalan (pameran A: Telize ). Sebagian besar layanan ini juga menawarkan tingkat pembayaran jika Anda menginginkan lebih banyak fitur seperti dukungan SSL.

Juga, seperti yang dicatat skobaljic dalam komentar di bawah ini, kuota permintaan sebagian besar bersifat akademis karena ini terjadi di sisi klien dan sebagian besar pengguna akhir tidak akan pernah melebihi kuota.

PEMBARUAN

Terima kasih
sumber
3
@AfolabiOlaoluwaAkinwumi Anda dapat mencoba sesuatu seperti ini: $.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. keterbatasan biasanya tidak berarti apa-apa: Poin yang baik, dan mungkin alasan untuk menjauh dari yang membutuhkan kunci api, karena penggunaan kunci dapat dihitung.
Nick Rice
2
@ JohnWeisz Benar, tetapi jika OP hanya berarti mereka hanya dapat memperbarui halaman dan tidak melakukan apa pun sisi server (tidak jelas dari pertanyaan) maka opsi ini menjawab pertanyaan dengan baik.
Nick Rice
1
@RobWaa terima kasih, saya menambahkan batasan pemblokir iklan di pembaruan 4/14. Saya akan menambahkan geoiplookup.io sebentar lagi.
thdoan
1
Semua jawaban ini bergantung pada layanan pihak ketiga, yang merupakan kelemahan besar, bukan hanya karena Anda bergantung pada layanan yang merespons secara tepat waktu, tetapi karena jika tidak dan Anda tidak menetapkan batas waktu yang tepat (yang akan selalu terjadi sonner daripada nanti), Anda akan menunda waktu buka halaman Anda, yang tidak bagus sama sekali. Jadi, mengapa tidak hanya menggunakan server Anda sendiri untuk mengembalikan IP klien ?, yang merupakan tugas sepele BTW dengan bahasa pemrograman apa pun.
Daniel J.
280

Pembaruan Terakhir

Solusi ini tidak akan berfungsi lagi karena browser memperbaiki kebocoran webrtc: untuk info lebih lanjut tentang itu baca pertanyaan lain ini: RTCIceCandidate tidak lagi mengembalikan IP


Pembaruan : Saya selalu ingin membuat versi kode min / uglified, jadi di sini adalah kode 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))

Catatan: Kode minified baru ini hanya akan mengembalikan satu IP jika Anda ingin semua IP pengguna (yang mungkin lebih tergantung pada jaringannya), gunakan kode asli ...


berkat WebRTC , sangat mudah untuk mendapatkan IP lokal di browser yang didukung WebRTC (setidaknya untuk saat ini). Saya telah memodifikasi kode sumber, mengurangi garis, tidak membuat permintaan setrum karena Anda hanya menginginkan IP Lokal, bukan IP Publik, kode di bawah ini berfungsi di Firefox dan Chrome terbaru, cukup jalankan cuplikan dan periksa sendiri:

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>

apa yang terjadi di sini adalah, kami membuat koneksi peer dummy, dan untuk peer remote untuk menghubungi kami, kami biasanya bertukar kandidat es satu sama lain. Dan membaca kandidat es (dari deskripsi sesi lokal dan onIceCandidateEvent) kami dapat memberi tahu IP pengguna.

tempat saya mengambil kode dari -> Sumber

mido
sumber
12
Terhormat karena jawaban terbaik di sini, juga terima kasih atas repo GitHub yang luar biasa!
Kano
28
Peringatan: Ini tidak menunjukkan IP publik Anda, hanya jaringan lokal. Anda tidak dapat menggunakannya untuk mendeteksi negara pengguna, misalnya, jika mereka menggunakan LAN
FloatingRock
1
@ FloatingRock Anda dapat mengambil IP publik juga, menggunakan server STUN (dan mengkonfigurasinya saat membuat peer), lalu lagi, yang akan mengharuskan Anda untuk memelihara / menggunakan server STUN, membawa kode server ke dalam gambar.
mido
10
Ini dikenal sebagai Kebocoran WebRTC. Harus diperbaiki oleh semua browser mayor, tetapi tidak. Informasi lebih lanjut di sini: privacytools.io/webrtc.html Kemungkinan terkait dengan Tor-browser bocor ip-nyata Anda.
Kapitein Witbaard
1
Meskipun, saya menyukai jawabannya, klien dapat melewati proses ini dengan menonaktifkan WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr
175

Anda bisa, menyampaikannya melalui sisi server dengan JSONP

Dan ketika mencari di Google, menemukannya di SO, bisakah saya melakukan pencarian DNS (nama host ke alamat IP) menggunakan Javascript sisi klien?

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

Catatan: API telize.com telah ditutup secara permanen pada 15 November 2015 .

Chad Grant
sumber
45
sementara saya menghargai cuplikan ini, saya pikir memuat konten teks JavaScript dan mengevaluasi bahwa melalui suatu fungsi adalah risiko keamanan yang parah. Bagaimana jika konten respons berubah dan 100+ orang di sini yang memilih jawaban ini dan mungkin menggunakan cuplikan itu akhirnya menjalankan fungsi dengan kemungkinan konten tidak aman. Saya hanya akan menggunakan ini jika itu adalah string JSON.
auco
32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Brad M
28
Ini bukan jawaban yang baik karena melibatkan permintaan sisi server. Pertanyaannya dengan jelas menyatakan "javascript murni".
Mikha
2
Micah, tidak mungkin untuk mendapatkan alamat ip dengan javascript murni. Saya sarankan Anda membaca tentang NAT dan bagaimana cara kerjanya. Anda memerlukan server untuk mengembalikan alamat IP internet Anda
Chad Grant
11
Layanan sekarang turun.
Cyril N.
109

Sebagian besar jawaban di sini "mengatasi" kebutuhan kode sisi server dengan ... Memukul server orang lain. Yang merupakan teknik yang benar-benar valid, kecuali jika Anda benar-benar perlu mendapatkan alamat IP tanpa memukul server.

Secara tradisional ini tidak mungkin tanpa semacam plugin (dan bahkan kemudian, Anda mungkin akan mendapatkan alamat IP yang salah jika Anda berada di belakang router NAT), tetapi dengan munculnya WebRTC sebenarnya mungkin untuk melakukan ini .. . Jika Anda menargetkan browser yang mendukung WebRTC (saat ini: Firefox, Chrome dan Opera).

Silakan baca jawaban mido untuk perincian tentang bagaimana Anda dapat mengambil alamat IP klien yang bermanfaat menggunakan WebRTC.

Shog9
sumber
23
@oscar: yang tampaknya menjadi teknik yang sama (JSONP-server yang dikembalikan IP yang terlihat) yang disebutkan chad dalam jawabannya. Yang tidak sesuai dengan persyaratan OP tentang "tidak ada kode sisi server". Tapi ya, itu adalah salah satu cara untuk mencapainya jika Anda mengabaikan persyaratan itu.
Shog9
Jawaban ini kedaluwarsa karena WebRTC: stackoverflow.com/questions/20194722/…
Akam
1
Diperbarui, @Akam. Anda harus memberikan mido beberapa alat peraga untuk menunjukkan ini beberapa bulan yang lalu (setelah TAHUN orang memposting jawaban salah yang memalukan yang masih membutuhkan dukungan server).
Shog9
Apakah WebRTC lebih banyak didukung sekarang ?!
oldboy
1
Menurut tautan "CanIUse" itu, @BugWhisperer. Kecuali Anda membutuhkan IE.
Shog9
81

Anda dapat melakukan panggilan ajax ke hostip.info atau layanan serupa ...

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

Sebagai bonus, informasi geolokalisasi dikembalikan dalam panggilan yang sama.

Malta
sumber
6
Anda juga bisa mendapatkan representasi JSON menggunakan api.hostip.info/get_json.php , lalu parsing JSON dengan fungsi browser, jQuery atau Prototype.
Brad Folkens
2
apakah ada batasan permintaan pada " api.hostip.info/get_html.php "? di mana saya bisa melihat detail api ini
Navin Leon
Ini mengembalikan IP dari Network Firewall. bukan IP klien yang sebenarnya. Apakah ada cara kita bisa mendapatkan IP Klien yang sebenarnya?
Leela Addagulla
76
Coba ini
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

ATAU

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

Biola

Sridhar R
sumber
ini berfungsi $ .get (" ipinfo.io ", function (response) {alert (response.ip);}, "jsonp"); tetapi bagaimana cara menyimpan nilai ke dalam variabel? tampaknya menghilang di luar loop permintaan ini
1
Untuk daftar semua layanan pencarian IP gratis, Anda dapat merujuk ke jawaban saya untuk stackoverflow.com/questions/391979/…
thdoan
Bagaimana cara mengirim fungsi ini untuk mengembalikan nilai ip?
Neftali Acosta
67

Kamu tidak bisa Anda harus bertanya ke server.

SteveShaffer
sumber
5
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
Himanshu
28
Tapi itu agak, kan? Maksud saya, jika jawabannya hanya "tidak, Anda tidak bisa" maka saya berpendapat ini adalah jawaban yang lebih benar daripada yang saat ini diunggulkan "di sini, gunakan aplikasi appspot acak ini," yang sepertinya merupakan jawaban berbahaya untuk berada di atas daftar.
SteveShaffer
16
IMO Ini adalah jawaban yang benar dan harus diterima. Pertanyaannya secara khusus mengatakan "tidak ada kode sisi server."
matthewwithanm
2
@ ahthewwithanm saya sangat setuju. Saya sedang menelusuri semua jawaban untuk melihat apakah ada yang mengatakan hal ini - dan saya siap menawarkannya sebagai jawaban. Semua jawaban yang sangat tersirat, sementara informatif, semua menjawab pertanyaan yang berbeda. Mengutip pertanyaan: "Saya perlu menarik alamat IP klien menggunakan JavaScript murni; tidak ada kode sisi server, bahkan SSI pun tidak." Jawaban ini sebenarnya adalah jawaban yang benar. Javascript dengan browser-sandbox tidak dapat melakukan ini (terlepas dari NAT atau proksi). Pertanyaan harus diubah jika salah satu dari jawaban lain harus diterima.
wally
64

Tidak terlihat lagi

Lihat http://www.ipify.org/

Menurut mereka:

  • Anda dapat menggunakannya tanpa batas (bahkan jika Anda melakukan jutaan permintaan per menit).
  • ipify sepenuhnya open source (lihat repositori GitHub ).

Berikut ini adalah contoh JS yang berfungsi (alih-alih bertanya-tanya mengapa jawaban ini memiliki begitu sedikit suara, cobalah sendiri untuk melihatnya beraksi):

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

Terlalu malas untuk menyalin / menempel? Saya suka itu. Ini demo 💻

Terlalu malas untuk mengklik? :O

Catatan : Matikan Adblock Plus / uBlock & co sebelum menjalankan demo .. jika tidak, itu tidak akan berfungsi.

Saya tidak ada hubungannya dengan tim IPify. Saya hanya berpikir itu sangat keren bahwa seseorang akan memberikan layanan seperti itu untuk kebaikan umum.

FloatingRock
sumber
4
Bagian terbaiknya adalah ini berasal dari "https" sedangkan panggilan saya ke http IP helpers akan diblokir karena mereka "tidak aman".
Tessa
hei, ini menunjukkan kesalahan CORS, apa yang harus saya lakukan?
saberprashant
@saberprashant apakah Anda menggunakan "HTTPS"?
FloatingRock
@ FloatingRock, tidak, saya menggunakan HTTP
saberprashant
26

Anda dapat menggunakan layanan saya http://ipinfo.io untuk ini, yang akan memberi Anda IP klien, nama host, informasi geolokasi, dan pemilik jaringan. Berikut adalah contoh sederhana yang mencatat IP:

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

Berikut adalah contoh JSFiddle yang lebih terperinci yang juga mencetak informasi respons lengkap, sehingga Anda dapat melihat semua detail yang tersedia: http://jsfiddle.net/zK5FN/2/

Ben Dowling
sumber
Untuk menghindari masalah Kebijakan Konten Campuran, ubah http://ipinfo.ioke //ipinfo.ioatau https
Samuel Elh
Kami ingin menggunakan layanan Anda, apakah Anda memiliki penawaran diskon untuk pengguna Stackoverflow?
Mehdi Dehghani
@MehdiDehghani kita bebas hingga 50rb req / bulan, untuk 100rb dengan backlink - lihat ipinfo.io/contact/creditlink
Ben Dowling
19

Sertakan kode ini di halaman Anda: <script type="text/javascript" src="http://l2.io/ip.js"></script>

lebih banyak dokumen di sini

L2.IO
sumber
1
Hm Itu terlihat menarik ... Ada batasannya?
indapublic
1
perpustakaan offline
riccardo.tasso
Ada beberapa tingkat spam pop up yang terkait dengan l2.io ref: hybrid-analysis.com/sample/… memungkinkan penyisipan tautan seperti pada contoh 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip "," host ":" l2.io "," referer ":" website.com/… } "& screenheight = 768 & lebar layar = 1366 & tm = 1557565256073 & lib = true & sidik jari = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza
16

Saya akan mengatakan Chad dan Malta memiliki jawaban yang bagus. Namun, mereka rumit. Jadi saya menyarankan kode ini yang saya temukan dari iklan dengan plugin negara

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

Tidak ajax. Javascript sederhana. : D

Jika Anda membuka http://j.maxmind.com/app/geoip.js Anda akan melihat bahwa isinya

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

Itu belum benar-benar menjawab pertanyaan karena

http://j.maxmind.com/app/geoip.js tidak mengandung IP (meskipun saya yakin itu menggunakan IP untuk mendapatkan negara).

Tapi sangat mudah untuk membuat skrip PhP yang muncul seperti

function visitorsIP()   { return '123.123.123.123'; }

Buat itu. Pakailah http://domainanda.com/anda web.php .

Lalu lakukan

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

Pertanyaannya secara spesifik menyebutkan TIDAK untuk menggunakan skrip pihak ketiga. Tidak ada jalan lain. Javascript tidak dapat mengetahui IP Anda. Tetapi server lain yang dapat diakses melalui javascript dapat berfungsi dengan baik tanpa masalah.

pengguna4951
sumber
7
memuat JavaScript dari server jarak jauh dan menjalankan fungsi dengan konten yang tidak dikenal sepertinya risiko keamanan yang sangat besar bagi saya (bagaimana jika konten fungsinya berubah?). Saya lebih suka mem-parsing respons JSON.
auco
3
Kesalahan 404: Objek tidak ditemukan
trejder
Sudah lama sekali., Jawabannya sebenarnya cukup salah. Saya tidak tahu javascript tidak bisa mengetahui IP.
user4951
oh benar fungsi VisitorsIP tidak dimaksudkan sebagai kode php. Ini adalah kode javacript yang dihasilkan oleh kode php
user4951
Anda bisa menggunakan server Anda sendiri kemudian untuk mencetak kode javascript yang menetapkan pengunjung ip.
user4951
15

Ada dua interpretasi untuk pertanyaan ini. Kebanyakan orang menafsirkan "IP Klien" berarti Alamat IP Publik yang dilihat server Web di luar LAN dan keluar di Internet. Namun, ini bukan alamat IP komputer klien

Saya membutuhkan alamat IP asli dari komputer yang menjalankan browser yang menampung perangkat lunak JavaScript saya (yang hampir selalu merupakan alamat IP lokal pada LAN yang berada di belakang sesuatu yang lapisan NAT).

Mido memposting jawaban FANTASTIS, di atas, yang tampaknya menjadi satu-satunya jawaban yang benar-benar memberikan alamat IP klien.

Terima kasih untuk itu, Mido!

Namun, fungsi yang disajikan berjalan secara tidak sinkron. Saya harus benar-benar MENGGUNAKAN alamat IP dalam kode saya, dan dengan solusi asinkron, saya mungkin mencoba menggunakan alamat IP sebelum diambil / dipelajari / disimpan. Saya harus bisa menunggu hasil sampai tiba sebelum menggunakannya.

Ini adalah versi "Tunggu" dari fungsi Mido. Saya harap ini membantu orang lain:

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>

Brebey
sumber
14

Ada pendekatan yang lebih mudah dan gratis yang tidak akan meminta izin pengunjung Anda.

Ini terdiri dari mengirimkan permintaan POST Ajax yang sangat sederhana ke http://freegeoip.net/json . Setelah Anda menerima informasi lokasi Anda, di JSON, Anda bereaksi sesuai dengan memperbarui halaman atau mengarahkan ke yang baru.

Inilah cara Anda mengirimkan permintaan Anda untuk informasi lokasi:

jQuery.ajax( { 
  url: '//freegeoip.net/json/', 
  type: 'POST', 
  dataType: 'jsonp',
  success: function(location) {
     console.log(location)
  }
} );
Jijo Paulose
sumber
Sepertinya mereka telah shutdown pada 1 Juli 2018
Nithin PH
13

Yah, saya ngelantur dari pertanyaan, tapi saya punya kebutuhan yang sama hari ini dan meskipun saya tidak dapat menemukan ID dari klien menggunakan Javascript, saya melakukan hal berikut.

Di sisi server: -

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

Menggunakan Javascript

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

Saya menggunakan ASP.Net Ajax, tetapi Anda dapat menggunakan getElementById alih-alih $ get ().

Apa yang terjadi adalah, saya punya elemen div tersembunyi di halaman dengan IP pengguna yang diberikan dari server. Daripada di Javascript saya hanya memuat nilai itu.

Ini mungkin bermanfaat bagi beberapa orang dengan persyaratan yang sama seperti milik Anda (seperti saya sementara saya belum memikirkannya).

Bersulang!

Cyril Gupta
sumber
20
-1: OP secara khusus menyebutkan "tidak ada kode sisi server", namun Anda menggunakan beberapa C #.
Bruno Reis
8
Bukankah lebih baik output saja <script>var uip='<%= Request.UserHostAddress %>';</script>?
Chris Haines
selain menggunakan kode sisi server, seseorang tidak boleh menggunakan DOM untuk menyimpan data. Ini buruk di seluruh. Hainesy memiliki ide yang lebih baik untuk hanya menetapkan ke JS var.
coblr
13

Dengan menggunakan Smart-IP.net Geo-IP API . Misalnya, dengan menggunakan jQuery:

$(document).ready( function() {
    $.getJSON( "http://smart-ip.net/geoip-json?callback=?",
        function(data){
            alert( data.host);
        }
    );
});
Mikhus
sumber
15
"Layanan Sementara Tidak Tersedia".
Iago
menulis api sederhana [ geoip.immanuel.co/myip] untuk mendapatkan alamat ip klien, ssl diaktifkan dan tidak ada batasan
Immanuel
12

Tidak mungkin secara umum kecuali jika Anda menggunakan semacam layanan eksternal.

Eugene Lazutkin
sumber
Memang, ini dimungkinkan menggunakan Javascript dengan mengandalkan layanan pihak ketiga seperti Ipregistry (penafian: saya menjalankan layanan): ipregistry.co/docs/getting-location-from-ip-address#javascript Anda bisa mendapatkan alamat IP , dan banyak informasi terkait termasuk data ancaman, semuanya dalam satu panggilan.
Laurent
9

Dapatkan IP Anda dengan jQuery

Anda bisa mendapatkan alamat IP publik Anda dengan satu baris JS? Ada layanan gratis yang menawarkan ini untuk Anda dan semua permintaan yang perlu Anda lakukan:

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

Agar potongan di atas berfungsi, browser Anda harus mendukung CORS (berbagi permintaan lintas-asal). Kalau tidak, pengecualian keamanan akan dilemparkan. Di browser yang lebih lama, Anda dapat menggunakan versi ini, yang menggunakan permintaan JSON-P:

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

Anda dapat menggunakan perpustakaan javascript 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
});

Anda juga dapat menggunakan requirejs untuk memuat skrip.

Ini akan memberi Anda alamat IP pengunjung Anda, serta beberapa data tentang lokasinya (negara, kota, dll.). Ini didasarkan pada database geoip maxmind.

Penafian: Saya menulis perpustakaan ini

Vincent Durmont
sumber
8

Javascript / jQuery mendapatkan Alamat IP & Lokasi Klien (Negara, Kota)

Anda hanya perlu menyematkan tag dengan tautan "src" ke server. Server akan mengembalikan "codehelper_ip" sebagai Object / JSON, dan Anda dapat menggunakannya segera.

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

Informasi lebih lanjut di Javascript Detect Real IP Address Plus Country

Jika Anda menggunakan jQUery, Anda dapat mencoba:

console.log(codehelper_ip); 

Ini akan menunjukkan kepada Anda informasi lebih lanjut tentang objek yang dikembalikan.

Jika Anda ingin fungsi panggilan balik, silakan coba ini:

// 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>
Ken Le
sumber
1
jangan gunakan languageatribut, type="text/javascript"sebaliknya , gunakan lebih banyak di MDN
Alex K
seperti @Alex sudah sebutkan, bahasa sudah usang dan hanya digunakan dalam kode lawas. Gunakan 'type = "text / javascript"' sebagai gantinya kompatibilitas maksimum.
Gautham C.
1
hanya FYI - bidang jenis tidak diperlukan untuk HTML5 (JS adalah default). w3schools.com/tags/att_script_type.asp
pmont
Jika Anda melewatkan komentar-komentar lain ini, Anda harus menggunakan jenis alih-alih bahasa
Mike
8

Layanan panggilan balik Appspot.com tidak tersedia. ipinfo.io tampaknya berfungsi.

Saya melakukan langkah ekstra dan mengambil semua info geo menggunakan AngularJS. (Terima kasih kepada Ricardo) Coba lihat.

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

Halaman kerja di sini: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html

Yamenator
sumber
8

Jika Anda memasukkan file anway, Anda bisa melakukan ajax sederhana:

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

Dan ajax.getIp.phpakan seperti ini:

<?=$_SERVER['REMOTE_ADDR']?>
Martijn
sumber
8

Saya sangat suka api.ipify.orgkarena mendukung HTTP dan HTTPS.

Berikut adalah beberapa contoh untuk mendapatkan IP api.ipify.orgmenggunakan jQuery.

Format JSON melalui HTTPS

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>

Format JSON melalui HTTP

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>

Format teks lebih dari HTTPS

Jika Anda tidak menginginkannya di JSON, ada juga respons plaintext atas HTTPS

https://api.ipify.org

Format teks melalui HTTP

Dan ada juga respons plaintext atas HTTP

http://api.ipify.org
Tim Penner
sumber
8

Gunakan ipdata.co .

API juga menyediakan data geolokasi dan memiliki 10 titik akhir global yang masing-masing mampu menangani> 800 juta permintaan sehari!

Jawaban ini menggunakan Kunci API 'uji' yang sangat terbatas dan hanya dimaksudkan untuk menguji beberapa panggilan. Daftar untuk Kunci API Gratis Anda sendiri dan dapatkan hingga 1500 permintaan setiap hari untuk pengembangan.

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

Jonathan
sumber
7

Sebenarnya tidak ada cara yang dapat diandalkan untuk mendapatkan alamat IP komputer klien.

Ini melewati beberapa kemungkinan. Kode yang menggunakan Java akan rusak jika pengguna memiliki banyak antarmuka.

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

Dari melihat jawaban lain di sini, sepertinya Anda mungkin ingin mendapatkan alamat IP publik klien, yang mungkin merupakan alamat router yang mereka gunakan untuk terhubung ke internet. Banyak jawaban lain di sini membicarakannya. Saya akan merekomendasikan membuat dan hosting halaman sisi server Anda sendiri untuk menerima permintaan dan merespons dengan alamat IP alih-alih bergantung pada layanan orang lain yang mungkin atau mungkin tidak terus bekerja.

Sarel Botha
sumber
7

Saya akan menawarkan metode yang banyak saya gunakan ketika saya ingin menyimpan informasi di halaman html, dan ingin javascript saya membaca informasi tanpa benar-benar harus meneruskan parameter ke javascript. Ini sangat berguna ketika skrip Anda dirujuk secara eksternal, bukan inline.

Namun, itu tidak memenuhi kriteria "tidak ada skrip sisi server". Tetapi jika Anda dapat memasukkan skrip sisi server dalam html Anda, lakukan ini:

Buat elemen label tersembunyi di bagian bawah halaman html Anda, tepat di atas tag badan akhir.

Label Anda akan terlihat seperti ini:

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

Pastikan untuk membuat kelas yang dipanggil hiddenlabeldan mengaturvisibility:hidden sehingga tidak ada yang benar-benar melihat label. Anda dapat menyimpan banyak hal dengan cara ini, dalam label tersembunyi.

Sekarang, di javascript Anda, untuk mengambil informasi yang disimpan dalam label (dalam hal ini alamat ip klien), Anda dapat melakukan ini:

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

Sekarang variabel "ip" Anda sama dengan alamat ip. Sekarang Anda dapat meneruskan ip ke permintaan API Anda.

* EDIT 2 TAHUN KEMUDIAN * Dua perbaikan kecil:

Saya rutin menggunakan metode ini, tetapi hubungi label class="data" , karena, sebenarnya, ini adalah cara untuk menyimpan data. Nama kelas "hiddenlabel" adalah jenis nama yang bodoh.

Modifikasi kedua ada di style sheet, bukannya visibility:hidden:

.data{
    display:none;
}

... adalah cara yang lebih baik untuk melakukannya.

TARKUS
sumber
3
Jangan menyimpan data di DOM. Mengapa ada yang menyarankan itu, bahkan 2 tahun kemudian? Jika Anda bisa menyuntikkan apa pun ke dalam file HTML, cukup masukkan nilai itu ke dalam variabel JS seperti itu. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script>. Setidaknya pembaca layar akan melewatkannya dan tidak diperlukan getElementById atau $ ('# stupidname').
coblr
@fractalspawn, Karena Anda tidak dapat memasukkan kode php ke file .js. Tidak memikirkan ITU, apakah Anda celana cerdas! ;)
TARKUS
Ya, Anda bisa jika Anda melakukan <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script> meskipun saya tidak yakin mengapa Anda juga melakukannya. Maksud saya adalah jika PHP dapat menyisipkan apa pun ke dalam HTML yang sedang dirender, praktik terbaik adalah dengan memasukkan nilai ke dalam variabel JS dalam tag skrip sebaris, daripada ke elemen DOM yang kemudian harus Anda uraikan untuk digunakan, dan berpotensi dibaca oleh pembaca layar kecuali Anda mengambil tindakan ekstra untuk mencegahnya.
coblr
Sama sekali tidak ada alasan bagus mengapa Anda tidak bisa atau tidak seharusnya menambahkan elemen data holding ke DOM, dan ada banyak alasan bagus untuk melakukannya. Sebenarnya, alasan-alasan itu ada dalam jawaban saya, jika Anda mau membacanya lagi. Ia dapat diandalkan, mudah dikendalikan, dan sangat berguna ketika file javascript Anda muncul di situs jarak jauh. Berbicara tentang skrip jarak jauh, contoh "javascript.php" Anda adalah ide yang mengerikan, dan mungkin tidak akan berhasil. Pikirkan istilah skrip jarak jauh, seperti DISQUS.
TARKUS
3
Untuk komentar Anda yang lain tentang mengapa penyimpanan data DOM buruk .. well, Anda masih bisa menghentikan mobil dengan menabrak dinding dengan lembut di tempat tujuan Anda, tetapi ada alat yang lebih baik untuk pekerjaan itu sekarang. Kita sekarang tahu lebih baik dan memiliki kerangka kerja yang hebat untuk meringankan ini. Saya bekerja di tempat DOM hanyalah file konfigurasi besar untuk JS, dan itu adalah mimpi buruk ketika dibenahi kembali. Jika Anda merasa bahwa menggunakan <script src = "something.php"> adalah "hack mentah", tetapi menyimpan data dalam DOM yang hanya memiliki nilai di dalam Javascript tidak, maka saya sangat senang bahwa kami tidak bekerja bersama-sama dan sekali lagi akan, dengan senang hati setuju untuk tidak setuju. :)
coblr
6
    $.getJSON("http://jsonip.com?callback=?", function (data) {
        alert("Your ip address: " + data.ip);
    });
Atif Hussain
sumber
6

Pertama-tama jawaban aktual : Tidak mungkin untuk menggunakan kode yang dieksekusi murni sisi klien untuk mengetahui alamat IP Anda sendiri.

Namun Anda bisa melakukan GET ke arah https://api.muctool.de/whois dan menerima sesuatu seperti mendapatkan alamat IP klien

{
"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
}
Alex
sumber
5

Anda bisa melakukan ini sepenuhnya sisi klien dan sebagian besar dalam JavaScript dengan menggunakan objek Flash yang dapat dipanggil js. Flash dapat mengakses alamat IP mesin lokal yang mungkin tidak terlalu berguna.

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

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

data.hostadalah alamat ip. Cukup panggil ini dari browser Anda.

http://smart-ip.net/geoip-json?callback=? [Tanpa tanda kutip] dan dapatkan ip.

Jawwad Ahmed
sumber
maaf, apa artinya $ dalam javascript?
GHOST