Як отримати IP-адресу клієнта за допомогою JavaScript?


560

Мені потрібно якось отримати IP-адресу клієнта за допомогою JavaScript; немає жодного коду сервера, навіть SSI.

Однак я не проти використання безкоштовного сценарію / послуги сторонніх розробників.

Відповіді:


771

Я б використовував веб-сервіс, який може повернути JSON (разом з jQuery, щоб зробити речі простішими). Нижче наведено всі безкоштовні послуги активного пошуку IP, які я міг знайти, та інформацію, яку вони повертають. Якщо ви знаєте що-небудь більше, то будь ласка, додайте коментар, і я оновлю цю відповідь.


Хмара

Спробуйте: https://www.cloudflare.com/cdn-cgi/trace

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

Повернення:

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

Обмеження:

  • Повертає звичайний текст

DB-IP

Спробуйте: http://api.db-ip.com/addrinfo?api_key= < ключ api > & addr = < ip адреса >

Повернення:

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

Обмеження:

  • 2500 запитів на день
  • Не підтримує зворотні дзвінки JSONP
  • Потрібен параметр IP-адреси
  • Щоб отримати ключ API, потрібна адреса електронної пошти
  • Немає SSL (https) з вільним планом

Геобайти

Спробуйте: http://gd.geobytes.com/GetCityDetails

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

Повернення:

{
  "geobytesforwarderfor": "",
  "geobytesremoteip": "116.12.250.1",
  "geobytesipaddress": "116.12.250.1",
  "geobytescertainty": "99",
  "geobytesinternet": "SA",
  "geobytescountry": "Saudi Arabia",
  "geobytesregionlocationcode": "SASH",
  "geobytesregion": "Ash Sharqiyah",
  "geobytescode": "SH",
  "geobyteslocationcode": "SASHJUBA",
  "geobytescity": "Jubail",
  "geobytescityid": "13793",
  "geobytesfqcn": "Jubail, SH, Saudi Arabia",
  "geobyteslatitude": "27.004999",
  "geobyteslongitude": "49.660999",
  "geobytescapital": "Riyadh ",
  "geobytestimezone": "+03:00",
  "geobytesnationalitysingular": "Saudi Arabian ",
  "geobytespopulation": "22757092",
  "geobytesnationalityplural": "Saudis",
  "geobytesmapreference": "Middle East ",
  "geobytescurrency": "Saudi Riyal",
  "geobytescurrencycode": "SAR",
  "geobytestitle": "Saudi Arabia"
}

Обмеження:

  • 16 384 запитів на годину
  • Немає SSL (https) з вільним планом
  • Можна повернути неправильне місцеположення (я в Сінгапурі, а не в Саудівській Аравії)

GeoIPLookup.io

Спробуйте: https://json.geoiplookup.io/api

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

Повернення:

{
    "ip": "116.12.250.1",
    "isp": "SGPOST",
    "org": "Singapore Post Ltd",
    "hostname": "116.12.250.1",
    "longitude": "103.807",
    "latitude": "1.29209",
    "postal_code": "",
    "city": "Singapore",
    "country_code": "SG",
    "country_name": "Singapore",
    "continent_code": "AS",
    "region": "Central Singapore",
    "district": "",
    "timezone_name": "Asia\/Singapore",
    "connection_type": "",
    "asn": "AS3758 SingNet",
    "currency_code": "SGD",
    "currency_name": "Singapore Dollar",
    "success": true
}

Обмеження:

  • 10000 запитів на годину
  • Безкоштовний API дозволяє лише некомерційне використання

geoPlugin

Спробуйте: http://www.geoplugin.net/json.gp

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

Повернення:

{
  "geoplugin_request": "116.12.250.1",
  "geoplugin_status": 200,
  "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\\'http://www.maxmind.com\\'>http://www.maxmind.com</a>.",
  "geoplugin_city": "Singapore",
  "geoplugin_region": "Singapore (general)",
  "geoplugin_areaCode": "0",
  "geoplugin_dmaCode": "0",
  "geoplugin_countryCode": "SG",
  "geoplugin_countryName": "Singapore",
  "geoplugin_continentCode": "AS",
  "geoplugin_latitude": "1.2931",
  "geoplugin_longitude": "103.855797",
  "geoplugin_regionCode": "00",
  "geoplugin_regionName": "Singapore (general)",
  "geoplugin_currencyCode": "SGD",
  "geoplugin_currencySymbol": "&#36;",
  "geoplugin_currencySymbol_UTF8": "$",
  "geoplugin_currencyConverter": 1.4239
}

Обмеження:

  • 120 запитів за хвилину
  • Немає SSL (https) з вільним планом

Ціль хакера

Спробуйте: https://api.hackertarget.com/geoip/?q= < ip address >

Повернення:

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

Обмеження:

  • 50 запитів на день
  • Не підтримує зворотні дзвінки JSONP
  • Потрібен параметр IP-адреси
  • Повертає звичайний текст

ipapi.co

Спробуйте: https://ipapi.co/json/

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

Повернення:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "country_name": "Singapore",
  "postal": null,
  "latitude": 1.2855,
  "longitude": 103.8565,
  "timezone": "Asia/Singapore"
}

Обмеження:

  • 1000 запитів на день
  • Потрібна SSL (https)

IP-API.com

Спробуйте: http://ip-api.com/json

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

Повернення:

{
  "as": "AS3758 SingNet",
  "city": "Singapore",
  "country": "Singapore",
  "countryCode": "SG",
  "isp": "SingNet Pte Ltd",
  "lat": 1.2931,
  "lon": 103.8558,
  "org": "Singapore Telecommunications",
  "query": "116.12.250.1",
  "region": "01",
  "regionName": "Central Singapore Community Development Council",
  "status": "success",
  "timezone": "Asia/Singapore",
  "zip": ""
}

Обмеження:

  • 150 запитів за хвилину
  • Немає SSL (https) з вільним планом

Ipdata.co

Спробуйте: https://api.ipdata.co

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

Повернення:

{
  "ip": "116.12.250.1",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "region_code": "01",
  "country_name": "Singapore",
  "country_code": "SG",
  "continent_name": "Asia",
  "continent_code": "AS",
  "latitude": 1.2931,
  "longitude": 103.8558,
  "asn": "AS3758",
  "organisation": "SingNet",
  "postal": "",
  "calling_code": "65",
  "flag": "https://ipdata.co/flags/sg.png",
  "emoji_flag": "\ud83c\uddf8\ud83c\uddec",
  "emoji_unicode": "U+1F1F8 U+1F1EC",
  "is_eu": false,
  "languages": [
    {
      "name": "English",
      "native": "English"
    },
    {
      "name": "Malay",
      "native": "Bahasa Melayu"
    },
    {
      "name": "Tamil",
      "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
    },
    {
      "name": "Chinese",
      "native": "\u4e2d\u6587"
    }
  ],
  "currency": {
    "name": "Singapore Dollar",
    "code": "SGD",
    "symbol": "S$",
    "native": "$",
    "plural": "Singapore dollars"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "abbr": "+08",
    "offset": "+0800",
    "is_dst": false,
    "current_time": "2018-05-09T12:28:49.183674+08:00"
  },
  "threat": {
    "is_tor": false,
    "is_proxy": false,
    "is_anonymous": false,
    "is_known_attacker": false,
    "is_known_abuser": false,
    "is_threat": false,
    "is_bogon": false
  }
}

Обмеження:

  • 1500 запитів на день
  • Щоб отримати ключ API, потрібна адреса електронної пошти
  • Потрібна SSL (https)

Знайти IP

Спробуйте: https://ipfind.co/me?auth= < ключ api >

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

Повернення:

{
  "ip_address": "116.12.250.1",
  "country": "Singapore",
  "country_code": "SG",
  "continent": "Asia",
  "continent_code": "AS",
  "city": "Singapore",
  "county": null,
  "region": "Central Singapore",
  "region_code": "01",
  "timezone": "Asia/Singapore",
  "owner": null,
  "longitude": 103.8565,
  "latitude": 1.2855,
  "currency": "SGD",
  "languages": [
    "cmn",
    "en-SG",
    "ms-SG",
    "ta-SG",
    "zh-SG"
  ]
}

Обмеження:

  • 300 запитів на день
  • Щоб отримати ключ API, потрібна реєстрація

іпгеолокація

Спробуйте: https://api.ipgeolocation.io/ipgeo?apiKey= < клавіша api >

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

Повернення:

{
  "ip": "116.12.250.1",
  "continent_code": "AS",
  "continent_name": "Asia",
  "country_code2": "SG",
  "country_code3": "SGP",
  "country_name": "Singapore",
  "country_capital": "Singapore",
  "state_prov": "Central Singapore",
  "district": "",
  "city": "Singapore",
  "zipcode": "",
  "latitude": "1.29209",
  "longitude": "103.807",
  "is_eu": false,
  "calling_code": "+65",
  "country_tld": ".sg",
  "languages": "cmn,en-SG,ms-SG,ta-SG,zh-SG",
  "country_flag": "https://ipgeolocation.io/static/flags/sg_64.png",
  "isp": "SGPOST",
  "connection_type": "",
  "organization": "Singapore Post Ltd",
  "geoname_id": "1880252",
  "currency": {
    "name": "Dollar",
    "code": "SGD"
  },
  "time_zone": {
    "name": "Asia/Singapore",
    "offset": 8,
    "is_dst": false,
    "current_time": "2018-06-12 09:06:49.028+0800"
  }
}

Обмеження:

  • 50 000 запитів на місяць
  • Щоб отримати ключ API, потрібна реєстрація

ipify

Спробуйте: https://api.ipify.org/?format=json

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

Повернення:

{
  "ip": "116.12.250.1"
}

Обмеження:

  • Жоден

IPInfoDB

Спробуйте: https://api.ipinfodb.com/v3/ip-city/?key= < клавіша api > & format = json

$.getJSON('https://api.ipinfodb.com/v3/ip-city/?key=<your_api_key>&format=json&callback=?', function(data) {
  console.log(JSON.stringify(data, null, 2));
});

Повернення:

{
  "statusCode": "OK",
  "statusMessage": "",
  "ipAddress": "116.12.250.1",
  "countryCode": "SG",
  "countryName": "Singapore",
  "regionName": "Singapore",
  "cityName": "Singapore",
  "zipCode": "048941",
  "latitude": "1.28967",
  "longitude": "103.85",
  "timeZone": "+08:00"
}

Обмеження:

  • Два запити в секунду
  • Щоб отримати ключ API, потрібна реєстрація

ipinfo.io

Спробуйте: https://ipinfo.io/json

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

Повернення:

{
  "ip": "116.12.250.1",
  "hostname": "No Hostname",
  "city": "Singapore",
  "region": "Central Singapore Community Development Council",
  "country": "SG",
  "loc": "1.2931,103.8558",
  "org": "AS3758 SingNet"
}

Обмеження:

  • 1000 запитів на день

Іпрегістичність

Спробуйте: https://api.ipregistry.co/?key= < ключ api >

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

Повернення:

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

Обмеження:

  • Безкоштовний план включає 100 000 запитів
  • Щоб отримати ключ API, потрібна реєстрація

ipstack (раніше freegeoip.net)

Спробуйте: http://api.ipstack.com/ < ip address >? Access_key = <ваш ключ api>

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

Повернення:

{
    "ip": "116.12.250.1",
    "type": "ipv4",
    "continent_code": "AS",
    "continent_name": "Asia",
    "country_code": "SG",
    "country_name": "Singapore",
    "region_code": "01",
    "region_name": "Central Singapore Community Development Council",
    "city": "Singapore",
    "zip": null,
    "latitude": 1.2931,
    "longitude": 103.8558,
    "location": {
        "geoname_id": 1880252,
        "capital": "Singapore",
        "languages": [{
            "code": "en",
            "name": "English",
            "native": "English"
        },
        {
            "code": "ms",
            "name": "Malay",
            "native": "Bahasa Melayu"
        },
        {
            "code": "ta",
            "name": "Tamil",
            "native": "\u0ba4\u0bae\u0bbf\u0bb4\u0bcd"
        },
        {
            "code": "zh",
            "name": "Chinese",
            "native": "\u4e2d\u6587"
        }],
        "country_flag": "http:\/\/assets.ipstack.com\/flags\/sg.svg",
        "country_flag_emoji": "\ud83c\uddf8\ud83c\uddec",
        "country_flag_emoji_unicode": "U+1F1F8 U+1F1EC",
        "calling_code": "65",
        "is_eu": false
    }
}

Обмеження:

  • 10000 запитів на місяць
  • Потрібен параметр IP-адреси
  • Щоб отримати ключ API, потрібна реєстрація
  • Немає SSL (https) з вільним планом

jsonip.com

Спробуйте: https://jsonip.com

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

Повернення:

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

Обмеження:

  • Відповідь включає продаж

Тест JSON

Спробуйте: http://ip.jsontest.com/

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

Повернення:

{
  "ip": "116.12.250.1"
}

Обмеження:

  • Немає SSL (https)
  • Знижується дуже багато (за квотою), тому я б не використовував це для виробництва
  • Повертає адресу IPv6, якщо у вас є така, яка може бути не такою, яку ви хочете

Некудо

Спробуйте: https://geoip.nekudo.com/api

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

Повернення:

{
  "city": "Singapore",
  "country": {
    "name": "Singapore",
    "code": "SG"
  },
  "location": {
    "accuracy_radius": 50,
    "latitude": 1.2855,
    "longitude": 103.8565,
    "time_zone": "Asia/Singapore"
  },
  "ip": "116.12.250.1"
}

Обмеження:

  • Блокується рекламодавцями за допомогою списку конфіденційності EasyPrivacy

Майте на увазі, що оскільки це все безкоштовні послуги, ваш пробіг може змінюватись за перевищенням квоти та тривалості роботи, і хто знає, коли / якщо вони будуть відведені в автономному режимі вниз по дорозі (виставка А: Теліз ). Більшість цих послуг також пропонують платний рівень, якщо ви хочете отримати більше функцій, таких як підтримка SSL.

Крім того, як зазначає skobaljic у коментарях нижче, квоти на запит здебільшого є академічними, оскільки це відбувається на стороні клієнта, і більшість кінцевих користувачів ніколи не перевищуватиме квоту.

ОНОВЛЕННЯ


3
@AfolabiOlaoluwaAkinwumi можна спробувати щось на кшталт цього: $.getJSON('//freegeoip.net/json/?callback=?', function(data) { if (!data || !data.ip) alert('IP not found'); }).fail(function() { alert('$.getJSON() request failed'); });
thoan

1
@skobaljic Re. обмеження зазвичай нічого не означають: хороший момент і, можливо, причина триматися подалі від тих, для яких потрібен ключ api, оскільки використання ключа можна перерахувати.
Нік Райс

2
@JohnWeisz Щоправда, але якщо ОП просто мав на увазі, вони можуть лише оновити сторінку і нічого не робити на стороні сервера (незрозуміло з питання), тоді ці варіанти відповідають на питання чудово.
Нік Райс

1
@RobWaa дякую, я додав обмеження щодо блокування реклами в оновленнях 4/14. Незабаром додамо geoiplookup.io.
туан

1
Усі ці відповіді покладаються на сторонні послуги, що є великим недоліком, не тільки тому, що ви залежите від того, що ця служба вчасно реагує, але тому, що якщо вона цього не зробить, ви не встановите відповідний час очікування (який завжди буде відбудеться сонник, ніж пізніше), ви затримаєте час завантаження сторінки, що зовсім не добре. Отже, чому б не просто використовувати власний сервер для повернення IP-адреси клієнта? Це BTW - тривіальна задача з будь-якою мовою програмування.
Даніель Дж.

280

Остаточне оновлення

Це рішення більше не працюватиме, оскільки браузери виправляють протікання webrtc: для отримання додаткової інформації про це прочитайте інше питання: RTCIceCandidate більше не повертає IP


Оновлення : я завжди хотів зробити мінімальну / невідомі версію коду, тому ось Обіцяючий код ES6:

var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})

/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e))

Примітка. Цей новий мінімізований код поверне лише один IP-код, якщо ви хочете, щоб усі IP-адреси користувача (що може бути більше залежно від його мережі), використовуйте оригінальний код ...


завдяки WebRTC дуже просто отримати локальний IP в браузерах, підтримуваних WebRTC (принаймні поки що). Я змінив вихідний код, скоротив рядки, не робив жодних запитів на оглушення, оскільки ви хочете лише локальний IP, а не публічний IP, наведений нижче код працює в останніх Firefox та Chrome, просто запустіть фрагмент і перевірте:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
  var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
  var pc = new myPeerConnection({iceServers: []}),
    noop = function() {},
    localIPs = {},
    ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
    key;

  function ipIterate(ip) {
    if (!localIPs[ip]) onNewIP(ip);
    localIPs[ip] = true;
  }
  pc.createDataChannel(""); //create a bogus data channel
  pc.createOffer(function(sdp) {
    sdp.sdp.split('\n').forEach(function(line) {
      if (line.indexOf('candidate') < 0) return;
      line.match(ipRegex).forEach(ipIterate);
    });
    pc.setLocalDescription(sdp, noop, noop);
  }, noop); // create offer and set local description
  pc.onicecandidate = function(ice) { //listen for candidate events
    if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return;
    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
  };
}



var ul = document.createElement('ul');
ul.textContent = 'Your IPs are: '
document.body.appendChild(ul);

function addIP(ip) {
  console.log('got ip: ', ip);
  var li = document.createElement('li');
  li.textContent = ip;
  ul.appendChild(li);
}

findIP(addIP);
<h1> Demo retrieving Client IP using WebRTC </h1>

що тут відбувається, ми створюємо манекенне однорангове з'єднання, і для віддаленого однорангового зв`язку з нами, ми, як правило, обмінюємось кандидатами з льоду між собою. І читаючи льодових кандидатів (з опису локальної сесії та onIceCandidateEvent), ми можемо сказати IP користувача.

звідки я взяв код -> Джерело


12
Оновлення за те, що найкраща відповідь тут - також спасибі за дивовижне репо в GitHub!
кано

28
Попередження. Це не відображає ваш загальнодоступний IP, а лише локальну мережу. Ви не можете використовувати його для виявлення країни користувача, наприклад, якщо вони перебувають у локальній мережі
FloatingRock

1
@FloatingRock ви можете також отримати загальнодоступний IP, використовуючи STUN-сервер (і налаштувати його під час створення однорангового), а потім знову, що вимагатиме від вас підтримки / використання STUN-сервера, приведення коду сервера в зображення.
середина

10
Це відомо як витік WebRTC. Потрібно виправити всі браузери мера, але це не так. Більше інформації тут: privacytools.io/webrtc.html Можливо, пов’язаний із браузером Tor, що протікає з вашим реальним ip.
Капітейн Вітбард

1
Хоча, мені сподобалася відповідь, клієнт може пройти по цьому процесу, відключивши WebRTC - restoreprivacy.com/webrtc-leaks
ni8mr

175

Ви можете, передаючи його через сервер на JSONP

І хоч googling, щоб знайти його, знайшов його тут на SO Чи можу я виконати пошук DNS (ім'я хоста на IP-адресу) за допомогою клієнтського Javascript?

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

Примітка: API telize.com остаточно закрито з 15 листопада 2015 року .


45
хоча я ціную цей фрагмент, я думаю, що завантажуючи текстовий вміст JavaScript і оцінюючи, що через функцію є серйозним ризиком для безпеки. Що робити, якщо зміст відповіді зміниться, і всі 100 людей, які тут проголосували за цю відповідь і, можливо, використали цей фрагмент, і в кінцевому підсумку викликають функцію з можливим небезпечним вмістом. Я використовував би це, якби це був рядок JSON.
auco

32
Error Over Quota This application is temporarily over its serving quota. Please try again later.
Бред М

28
Це не є гарною відповіддю, оскільки передбачає запит на стороні сервера. У питанні чітко сказано "чистий javascript".
Міхей

2
Міхе, немає можливості отримати ip-адресу з чистим JavaScript. Я пропоную вам прочитати NAT і як це працює. Вам потрібен сервер, щоб повторити вашу Інтернет-адресу IP
Чад Грант

11
Сервіс зараз припинено.
Кирило Н.

109

Більшість відповідей тут "обходить" необхідність коду на стороні сервера, ... Забиваючи чужий сервер. Це цілком правильна методика, якщо вам насправді не потрібно отримувати IP-адресу, не потрапляючи на сервер.

Традиційно це було неможливо без якогось плагіна (і навіть тоді ви, ймовірно, отримаєте неправильну IP-адресу, якщо б ви стояли за NAT-роутером), але з появою WebRTC це реально зробити. . Якщо ви орієнтуєтеся браузери, підтримка WebRTC ( в даний час: Firefox, Chrome і Opera).

Будь ласка, прочитайте відповідь mido, щоб отримати детальну інформацію про те, як отримати корисні IP-адреси клієнта за допомогою WebRTC.


23
@oscar: це, здається, та сама техніка (IP-видимий сервер, що повертається JSONP), що чад згадував у своїй відповіді. Що не відповідає вимозі ОП "немає коду на стороні сервера". Але так, це один із способів досягти цього, якщо проігнорувати цю вимогу.
Shog9

Ця відповідь застаріла через WebRTC: stackoverflow.com/questions/20194722/…
Акам

1
Оновлено, @Akam. Вам слід надати серед реквізитів, щоб вказати на це кілька місяців тому (після РОКІВ, коли люди публікують бентежно неправильні відповіді, які все ще потребували підтримки сервера).
Shog9

чи WebRTC зараз більш широко підтримується ?!
oldboy

1
Згідно з цим посиланням "CanIUse", це @BugWhisperer. Якщо вам не потрібен IE.
Shog9

81

Ви можете здійснити дзвінок Ajax на hostip.info або подібний сервіс ...

function myIP() {
    if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
    else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.open("GET","http://api.hostip.info/get_html.php",false);
    xmlhttp.send();

    hostipInfo = xmlhttp.responseText.split("\n");

    for (i=0; hostipInfo.length >= i; i++) {
        ipAddress = hostipInfo[i].split(":");
        if ( ipAddress[0] == "IP" ) return ipAddress[1];
    }

    return false;
}

Як бонус, інформація про геолокалізацію повертається в той же дзвінок.


6
Ви також можете отримати представлення JSON, використовуючи api.hostip.info/get_json.php , а потім розібрати JSON за допомогою функції браузера, jQuery або прототипу.
Бред Фолкенс

2
чи є обмеження запиту на " api.hostip.info/get_html.php "? де я можу побачити цю інформацію про api
Navin Leon

Він повертає IP мережевого брандмауера. не фактичний IP-клієнт. Чи є спосіб отримати фактичний IP клієнта?
Leela Addagulla

76
Спробуйте це
$.get("http://ipinfo.io", function(response) {
    alert(response.ip);
}, "jsonp");

АБО

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

Скрипка


це працює $ .get (" ipinfo.io ", функція (відповідь) {alert (response.ip);}, "jsonp"); але як я зберігаю значення в змінну? воно, схоже, зникає за межами цього циклу отримання запиту

1
Для отримання списку все Free IP служб пошуку, ви можете звернутися до мого відповіді на stackoverflow.com/questions/391979 / ...
thdoan

Як надіслати цю функцію, щоб повернути значення ip?
Нефталі Акоста

67

Ви не можете. Вам доведеться запитати сервер.


5
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
Хіманшу

28
Але це ніби так, правда? Я маю на увазі, якщо відповідь просто "ні, ти не можеш", то я б стверджував, що це більш правильна відповідь, ніж наразі ановація "тут, використовуй цю випадкову програму apppot", що здається небезпечною відповіддю на вгорі списку.
SteveShaffer

16
ІМО Це правильна відповідь і її слід прийняти. Питання конкретно говорить: "немає коду на стороні сервера".
matthewwithanm


2
@matthewwithanm Я не міг більше погодитися. Я прогортав усі відповіді, щоб побачити, чи хтось сказав саме це - і був готовий запропонувати це як відповідь сам. Усі висококваліфіковані відповіді, хоча інформативні, відповідають на інше питання. Цитуючи питання: "Мені потрібно якось витягнути IP-адресу клієнта за допомогою чистого JavaScript; жодного коду сервера, навіть SSI". Ця відповідь фактично є правильною відповіддю. Javascript не може зробити цього з використанням піктограми браузера (незалежно від NAT або проксі). Питання слід змінити, якщо потрібно прийняти одну з інших відповідей.
wally

64

Не дивіться далі

Перевірте http://www.ipify.org/

За їх словами:

  • Ви можете користуватися ним без обмежень (навіть якщо ви робите мільйони запитів в хвилину).
  • ipify є повністю відкритим кодом (перегляньте сховище GitHub ).

Ось робочий приклад JS (замість того, щоб запитати, чому ця відповідь має так мало голосів, спробуйте самі, щоб побачити її в дії):

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

Занадто ліниво копіювати / вставляти? Мені це подобається. Ось 💻 демонстрація

Лено натискати? :O

Примітка . Вимкніть Adblock Plus / uBlock & co перед запуском демонстрації .. інакше це просто не працюватиме.

Я не маю нічого спільного з командою IPify. Я просто думаю, що смішно круто, що хтось надав би таку послугу на загальне благо.


4
Найкраще, що це відбувається від "https", тоді як мої дзвінки до http IP-помічників будуть заблоковані, оскільки вони не захищені.
Тесса

Гей, це показує мені помилку CORS, що мені робити?
saberprashant

@saberprashant Ви використовуєте "HTTPS"?
FloatingRock

@FloatingRock, ні, я використовую HTTP
saberprashant

26

Ви можете скористатися моєю службою http://ipinfo.io для цього, яка дасть вам клієнтський IP, ім'я хоста, інформацію про геолокацію та власника мережі. Ось простий приклад, який реєструє IP:

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

Ось більш детальний приклад JSFiddle, який також виводить повну інформацію про відповіді, так що ви можете побачити всі доступні дані: http://jsfiddle.net/zK5FN/2/


Щоб уникнути проблем із змішаною політикою щодо вмісту, перейдіть http://ipinfo.ioна //ipinfo.ioабо https
Samuel Elh

Ми хочемо скористатись вашою послугою, чи є у вас знижки для користувачів Stackoverflow?
Мехді Дехгані

@MehdiDehghani ми безкоштовні до 50 кк / місяць, за 100 к. З зворотним посиланням - див. Ipinfo.io/contact/creditlink
Бен Даулінг

19

Включіть цей код на свою сторінку: <script type="text/javascript" src="http://l2.io/ip.js"></script>

більше док. тут


1
Гм. Це виглядає цікаво ... Якісь обмеження у них є?
indapublic

1
Бібліотека в автономному режимі
riccardo.tasso

Існує деяка ступінь спам-спливаючих вікон, пов’язаних з l2.io ref: hybrid-analysis.com/sample/… дозволяє вставляти посилання, як у зразок 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? var = myip "," host ":" l2.io "," referer ":" website.com/… } "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = true & fingerprint = c2VwLW5vLXJlZGlyZWN0
Wayne DSouza

16

Я б сказав, що Чад і Мальта чудово відповідають. Однак їх складність. Тому я пропоную цей код, який я знайшов у плагінах оголошень по країні

<script>
<script language="javascript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="javascript">
mmjsCountryCode = geoip_country_code();
mmjsCountryName = geoip_country_name();

</script>

Ніякого аяксу. Просто прості javascripts. : D

Якщо ви перейдете на сторінку http://j.maxmind.com/app/geoip.js, ви побачите, що вона містить

function geoip_country_code() { return 'ID'; }
function geoip_country_name() { return 'Indonesia'; }
function geoip_city()         { return 'Jakarta'; }
function geoip_region()       { return '04'; }
function geoip_region_name()  { return 'Jakarta Raya'; }
function geoip_latitude()     { return '-6.1744'; }
function geoip_longitude()    { return '106.8294'; }
function geoip_postal_code()  { return ''; }
function geoip_area_code()    { return ''; }
function geoip_metro_code()   { return ''; }

Це ще не відповідає на це питання

http://j.maxmind.com/app/geoip.js не містить IP-адреси (хоча, я думаю, він використовує IP для отримання країни).

Але так просто зробити PHP-скрипт, що з'являється щось подібне

function visitorsIP()   { return '123.123.123.123'; }

Зробіть це. Надіньте http://yourdomain.com/yourip.php .

Тоді робіть

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

У питанні конкретно згадується НЕ використовувати сценарій сторонніх розробників. Іншого шляху немає. Javascript не може знати вашу IP-адресу. Але інші сервери, до яких можна отримати доступ через javascript, можуть працювати так само добре, як без проблем.


7
завантаження JavaScript з віддаленого сервера та виклик функцій з невідомим вмістом здається для мене величезним ризиком для безпеки (що робити, якщо зміст вмісту функції зміниться?). Я вважаю за краще проаналізувати відповідь JSON.
auco

3
Помилка 404: об’єкт не знайдено
trejder

Минуло дуже давно., Насправді відповідь є досить хибною. Я не знав, що JavaScript не може знати IP.
user4951

о, це правильно, функція відвідувачівIP не має бути PHP-кодом. Це код javacript, сформований за допомогою php-коду
user4951

ви можете просто використовувати свій власний сервер, а потім надрукувати код javascript, який призначає відвідувачам ip.
user4951

15

На це питання є дві інтерпретації. Більшість людей інтерпретують "Клієнтський IP" означає загальнодоступну IP-адресу, яку веб-сервер бачить за межами локальної мережі та поза Інтернетом. Однак у більшості випадків це не IP-адреса клієнтського комп'ютера

Мені потрібна справжня IP-адреса комп'ютера, на якому працює браузер, на якому розміщено моє програмне забезпечення JavaScript (що майже завжди є локальною IP-адресою в локальній мережі, що знаходиться за чимось таким шаром NAT).

Mido розмістив вище відповідь FANTASTIC, що, здається, єдина відповідь, яка дійсно надала IP-адресу клієнта.

Дякую за це, Мідо!

Однак представлена ​​функція працює асинхронно. Мені потрібно реально ВИКОРИСТИТИ IP-адресу в своєму коді, і за допомогою асинхронного рішення я можу спробувати використовувати IP-адресу, перш ніж її буде отримано / вивчено / збережено. Мені довелося чекати результатів, перш ніж їх використовувати.

Ось "Очікувана" версія функції Mido. Я сподіваюся, що це допоможе комусь іншому:

function findIP(onNewIP) { //  onNewIp - your listener function for new IPs
    var promise = new Promise(function (resolve, reject) {
        try {
            var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //compatibility for firefox and chrome
            var pc = new myPeerConnection({ iceServers: [] }),
                noop = function () { },
                localIPs = {},
                ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,
                key;
            function ipIterate(ip) {
                if (!localIPs[ip]) onNewIP(ip);
                localIPs[ip] = true;
            }
            pc.createDataChannel(""); //create a bogus data channel
            pc.createOffer(function (sdp) {
                sdp.sdp.split('\n').forEach(function (line) {
                    if (line.indexOf('candidate') < 0) return;
                    line.match(ipRegex).forEach(ipIterate);
                });
                pc.setLocalDescription(sdp, noop, noop);
            }, noop); // create offer and set local description

            pc.onicecandidate = function (ice) { //listen for candidate events
                if (ice && ice.candidate && ice.candidate.candidate && ice.candidate.candidate.match(ipRegex)) {
                    ice.candidate.candidate.match(ipRegex).forEach(ipIterate);
                }
                resolve("FindIPsDone");
                return;
            };
        }
        catch (ex) {
            reject(Error(ex));
        }
    });// New Promise(...{ ... });
    return promise;
};

//This is the callback that gets run for each IP address found
function foundNewIP(ip) {
    if (typeof window.ipAddress === 'undefined')
    {
        window.ipAddress = ip;
    }
    else
    {
        window.ipAddress += " - " + ip;
    }
}

//This is How to use the Waitable findIP function, and react to the
//results arriving
var ipWaitObject = findIP(foundNewIP);        // Puts found IP(s) in window.ipAddress
ipWaitObject.then(
    function (result) {
        alert ("IP(s) Found.  Result: '" + result + "'. You can use them now: " + window.ipAddress)
    },
    function (err) {
        alert ("IP(s) NOT Found.  FAILED!  " + err)
    }
);


 

   
<h1>Demo "Waitable" Client IP Retrieval using WebRTC </h1>


14

Існує простіший і безкоштовний підхід, який не вимагає від відвідувача дозволу.

Він полягає у поданні дуже простого запиту Ajax POST на http://freegeoip.net/json . Отримавши інформацію про своє місцезнаходження, в JSON ви реагуєте відповідно оновленням сторінки або перенаправленням на нову.

Ось як ви подаєте запит на інформацію про місцезнаходження:

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

Схоже, вони
завершили роботу

13

Ну, я відступаю від запитання, але в мене була подібна потреба сьогодні, і хоча я не зміг знайти ідентифікатор від клієнта за допомогою Javascript, я зробив наступне.

На стороні сервера: -

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

Використання Javascript

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

Я використовую ASP.Net Ajax, але ви можете використовувати getElementById замість $ get ().

Що відбувається, у мене є прихований елемент div на сторінці з IP-адресою користувача, що надається з сервера. Тож у Javascript я просто завантажую це значення.

Це може бути корисним для деяких людей із подібною вимогою, як ваша (як я, поки я цього не з'ясував).

Ура!


20
-1: ОП конкретно зазначає "немає коду сторони сервера", але ви використовуєте деякий C #.
Бруно Рейс

8
Не було б краще просто вивести <script>var uip='<%= Request.UserHostAddress %>';</script>?
Кріс Хайнс

окрім використання коду сторони сервера, ніколи не слід використовувати DOM для зберігання даних. Це просто погано в усьому. У Хейнсі є краща ідея просто призначити JS var.
coblr

13

За допомогою Smart -IP.net Geo-IP API . Наприклад, використовуючи jQuery:

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

15
"Служба тимчасово недоступна".
Іаго

написав просту api [ geoip.immanuel.co/myip], щоб отримати ip-адресу клієнта, включений ssl та без обмежень
Іммануїл

12

Загалом це неможливо, якщо ви не використовуєте якусь зовнішню послугу.


Дійсно, це можливо за допомогою Javascript, спираючись на сторонні сервіси, такі як Ipregistry (відмова від відповідальності: я запускаю службу): ipregistry.co/docs/getting-location-from-ip-address#javascript Ви можете отримати IP-адресу та багато супутньої інформації, включаючи дані про загрозу, все в один дзвінок.
Лоран

9

Отримайте свій IP-адресу за допомогою jQuery

ви можете отримати вашу загальнодоступну IP-адресу одним рядком JS? Є безкоштовна послуга, яка пропонує вам це, і запит на отримання - це все, що вам потрібно зробити:

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

Для роботи вищевказаного фрагмента ваш веб-переглядач повинен буде підтримувати CORS (обмін запитом між походженнями). Інакше викид з безпеки буде кинутий. У старих браузерах ви можете використовувати цю версію, яка використовує запит JSON-P:

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

9

Ви можете використовувати userinfo.io бібліотеку JavaScript.

<script type="text/javascript" src="userinfo.0.0.1.min.js"></script>

UserInfo.getInfo(function(data) {
  alert(data.ip_address);
}, function(err) {
  // Do something with the error
});

Ви також можете використовувати Requjs для завантаження сценарію.

Він дасть вам IP-адресу вашого відвідувача, а також декілька даних про його місцезнаходження (країну, місто тощо). Він заснований на базі даних maxmind geoip.

Відмова: Я написав цю бібліотеку


8

Javascript / jQuery отримати IP-адресу та місцезнаходження клієнта (країна, місто)

Вам потрібно лише вставити тег із посиланням "src" на сервер. Сервер поверне "codehelper_ip" як Object / JSON, і ви можете ним скористатися відразу.

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?js"></script>
// You can use it
<script language="Javascript">
    alert(codehelper_ip.IP);
    alert(codehelper_ip.Country);
</script>

Більше інформації на Javascript Detect Real IP Address Plus Country

Якщо ви використовуєте jQUery, ви можете спробувати:

console.log(codehelper_ip); 

Він покаже вам більше інформації про повернений об’єкт.

Якщо ви хочете функцію зворотного дзвінка, спробуйте:

// First, embed this script in your head or at bottom of the page.
<script language="Javascript" src="http://www.codehelper.io/api/ips/?callback=yourcallback"></script>
// You can use it
<script language="Javascript">
    function yourcallback(json) {
       alert(json.IP);
     }
</script>

1
не використовуйте languageатрибут, використовуйте type="text/javascript"натомість докладніше на MDN
Alex K

як уже згадувалося @Alex, мова застаріла і використовується лише в застарілому коді. Використовуйте замість 'type = "text / javascript"' для максимальної сумісності.
Gautham C.

1
просто FYI - поле типу не потрібне для HTML5 (JS - за замовчуванням). w3schools.com/tags/att_script_type.asp
пмонт,

На випадок, якщо ви пропустили ці інші коментарі, вам слід використовувати тип замість мови
Майк

8

Послуга зворотного дзвінка Appspot.com недоступна. ipinfo.io, здається, працює.

Я зробив додатковий крок і отримав всю геоінформацію за допомогою AngularJS. (Спасибі Рікардо) Перевірте це.

<div ng-controller="geoCtrl">
  <p ng-bind="ip"></p>
  <p ng-bind="hostname"></p>
  <p ng-bind="loc"></p>
  <p ng-bind="org"></p>
  <p ng-bind="city"></p>
  <p ng-bind="region"></p>
  <p ng-bind="country"></p>
  <p ng-bind="phone"></p>
</div>
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.12/angular-route.min.js"></script>
<script>
'use strict';
var geo = angular.module('geo', [])
.controller('geoCtrl', ['$scope', '$http', function($scope, $http) {
  $http.jsonp('http://ipinfo.io/?callback=JSON_CALLBACK')
    .success(function(data) {
    $scope.ip = data.ip;
    $scope.hostname = data.hostname;
    $scope.loc = data.loc; //Latitude and Longitude
    $scope.org = data.org; //organization
    $scope.city = data.city;
    $scope.region = data.region; //state
    $scope.country = data.country;
    $scope.phone = data.phone; //city area code
  });
}]);
</script>

Робоча сторінка тут: http://www.orangecountyseomarketing.com/projects/_ip_angularjs.html


8

Якщо ви завжди включаєте файл, ви можете зробити простий ajax:

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

І ajax.getIp.phpбуло б це:

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

8

Мені дуже подобається, api.ipify.orgтому що він підтримує і HTTP, і HTTPS.

Ось кілька прикладів отримання IP за api.ipify.orgдопомогою jQuery.

Формат JSON через 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>

Формат JSON через 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>

Формат тексту через HTTPS

Якщо ви не хочете цього в JSON, є також відповідь у прямому тексті через HTTPS

https://api.ipify.org

Формат тексту через HTTP

А також є відповідь на відкритий текст через HTTP

http://api.ipify.org

8

Використовуйте ipdata.co .

API також надає геолокаційні дані та має 10 глобальних кінцевих точок, кожна з яких може обробляти> 800M запитів на день!

У цій відповіді використовується тестовий ключ API, який дуже обмежений і призначений лише для тестування кількох викликів. Підпишіться на свій власний Безкоштовний ключ API та отримуйте до 1500 запитів щодня на розвиток.

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#response").html(response.ip);
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="response"></pre>


7

Насправді надійний спосіб отримати IP-адресу клієнтського комп'ютера.

Це проходить через деякі можливості. Код, який використовує Java, порушиться, якщо користувач має кілька інтерфейсів.

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

З огляду на інші відповіді тут, схоже, ви можете отримати загальнодоступну IP-адресу клієнта, яка, ймовірно, адреса маршрутизатора, який вони використовують для підключення до Інтернету. Багато інших відповідей тут говорять про це. Я рекомендую створити та розмістити свою власну сторону сервера для отримання запиту та відповіді з IP-адресою, а не залежно від чужої послуги, яка може або не може продовжувати працювати.


7

Я збираюся запропонувати метод, який я багато використовую, коли хочу зберігати інформацію на html-сторінці, і хочу, щоб мій JavaScript читав інформацію, фактично не передаваючи параметри на JavaScript. Це особливо корисно, коли на ваш сценарій посилаються зовні, а не вбудовані.

Однак він не відповідає критерію "сценарій без сервера". Але якщо ви можете включити скрипт на стороні сервера у свій HTML, зробіть це:

Зробіть приховані елементи мітки внизу сторінки html, трохи вище кінцевого тегу корпусу.

Ваш ярлик буде виглядати приблизно так:

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

Обов’язково створіть клас з назвою hiddenlabelта встановіть visibility:hiddenтак, щоб ніхто насправді не бачив мітку. Ви можете зберігати багато речей таким чином у прихованих етикетках.

Тепер, у вашому JavaScript, для отримання інформації, що зберігається на етикетці (у цьому випадку ip-адреса клієнта), ви можете зробити це:

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

Тепер ваша змінна "ip" дорівнює ip-адресі. Тепер ви можете передати ip до свого запиту API.

* РЕДАКТУЙТЕ 2 РОКІВ ПІСНЕ * Два незначні уточнення:

Я звичайно використовую цей метод, але називаю мітку class="data", оскільки, насправді, це спосіб зберігання даних. Назва класу "hiddenlabel" - це різновид дурного імені.

Друга модифікація знаходиться в таблиці стилів замість visibility:hidden:

.data{
    display:none;
}

... це кращий спосіб зробити це.


3
Не зберігайте дані в DOM. Чому хтось припустив це навіть через 2 роки? Якщо ви можете ввести що-небудь у файл HTML, просто введіть це значення у змінну JS, як так. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script> Принаймні тоді читачі екрана пропустять його, і не потрібно отримати getElementById або $ ('# stupidname').
coblr

@fractalspawn, З тієї причини, що ви не можете вставити php-код у файл .js. Не думав про те, чи ти розумні штани! ;)
ТАРКУС

Ну, ви могли б, якщо ви зробили <script type = "text / javascript" src = "шлях / до / fancy / javascript.php"> </script>, хоча я не впевнений, чому ви це зробите. Моя думка полягає в тому, що якщо PHP може вставити що-небудь у HTML, який він рендерує, найкращою практикою було б, щоб воно вставляло значення в змінну JS в тезі вбудованого сценарію, а не в елемент DOM, який вам потім доведеться розбирати з метою використання та, можливо, їх можна прочитати читачами екрану, якщо ви не вжили додаткових заходів для запобігання.
coblr

Не існує абсолютно жодних вагомих причин, чому ви не можете або не повинні додавати елементи D data до DOM, і для цього є маса вагомих причин. Насправді ці причини є моєю відповіддю, якщо ви хочете прочитати її ще раз. Це надійний, простий в управлінні і особливо корисний, коли ваш файл JavaScript відбувається на віддаленому сайті. Якщо говорити про віддалений скрипт, ваш приклад "javascript.php" - жахлива ідея, і, ймовірно, не працював би в будь-якому випадку. Подумайте з точки зору віддалених сценаріїв, таких як DISQUS.
TARKUS

3
На ваш інший коментар про те, чому зберігання даних DOM погано .. ну, ви все одно можете зупинити машину, обережно вдарившись про стіну за місцем призначення, але зараз є кращі інструменти для роботи. Зараз ми знаємо краще і маємо чудові рамки для полегшення цього. Я працював у місці, де DOM був просто величезним конфігураційним файлом для JS, і це був кошмар, коли рестайлінг. Якщо ви вважаєте, що використання <script src = "something.php"> є "грубим злом", але зберігання даних у DOM, які мають значення лише у Javascript, не є, я дуже радий, що ми не працюємо разом і знову з радістю погодиться не погодитися. :)
coblr



6

Перш за все, власне відповідь : Неможливо використовувати суто виконаний на базі клієнта код, щоб дізнатися власну IP-адресу.

Однак ви можете просто зробити GET у напрямку https://api.muctool.de/whois і отримати щось на кшталт отримання IP-адреси клієнта.

{
"ip": "88.217.152.15",
"city": "Munich",
"isp": "M-net Telekommunikations GmbH",
"country": "Germany",
"countryIso": "DE",
"postalCode": "80469",
"subdivisionIso": "BY",
"timeZone": "Europe/Berlin",
"cityGeonameId": 2867714,
"countryGeonameId": 2921044,
"subdivisionGeonameId": 2951839,
"ispId": 8767,
"latitude": 48.1299,
"longitude": 11.5732,
"fingerprint": "61c5880ee234d66bded68be14c0f44236f024cc12efb6db56e4031795f5dc4c4",
"session": "69c2c032a88fcd5e9d02d0dd6a5080e27d5aafc374a06e51a86fec101508dfd3",
"fraud": 0.024,
"tor": false
}

5

Ви можете зробити це цілком на стороні клієнта, і в основному в JavaScript, використовуючи Flash-об’єкт, на який js може зателефонувати. Flash може отримати доступ до IP-адреси локальної машини, що може бути не дуже корисно.


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

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

data.host- ip-адреса. Просто зателефонуйте до цього із свого браузера.

http://smart-ip.net/geoip-json?callback=? [Без лапок] і отримаємо ip.


Вибачте, що означає $ у JavaScript?
GHOST
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.