Как получить IP-адрес клиента с помощью JavaScript?


560

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

Однако я не против использования бесплатного стороннего скрипта / сервиса.

Ответы:


774

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


Cloudflare

Попробуйте это: 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) с бесплатным планом

Geobytes

Попробуйте это: 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-адрес >

Возвращает:

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

ipgeolocation

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

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

Возвращает:

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

Ограничения:

  • 50000 запросов в месяц
  • Требуется регистрация, чтобы получить ключ 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 запросов в день

Ipregistry

Попробуйте: 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-адрес >? 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"
}

Ограничения:

  • Ответ включает в себя upsell

JSON Test

Попробуйте это: 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-адрес, если у вас есть, который может быть не тем, что вы хотите

Nekudo

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

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

Возвращает:

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

Ограничения:

  • Заблокировано рекламодателями с помощью списка EasyPrivacy

Имейте в виду, что, поскольку все это бесплатные услуги, ваш пробег может варьироваться в зависимости от превышения квоты и времени безотказной работы, и кто знает, когда / если они будут переведены в автономный режим в будущем (выставка A: Telize ). Большинство из этих услуг также предлагают платный уровень, если вам нужны дополнительные функции, такие как поддержка SSL.

Кроме того, как отметил Скобальич в комментариях ниже, квоты на запросы в основном являются академическими, поскольку это происходит на стороне клиента, и большинство конечных пользователей никогда не превысят эту квоту.

ОБНОВЛЕНИЕ

  • 01.02.2016: Удален Telize (больше не предлагает бесплатный тариф )
  • 18.04.2016: удален freegeoip.net (не работает)
  • 26.04.2016: добавлен DB-IP
  • 26.04.2016: добавлена цель хакера
  • 6/6/2016: восстановлен freegeoip.net
  • 06.07.2016: удалено ip-json.rhcloud.com (неработающая ссылка)
  • 21.12.2016: Удалена цель хакера (не работает)
  • 10.02.2017: добавлен некудо
  • 20.04.2017: Добавлен ipapi.co (спасибо Ахмаду Авайсу)
  • 24.04.2017: Восстановленная цель хакера
  • 24.04.2017: Удален Snoopi.io (не работает)
  • 16.07.2017: добавлен поиск IP (спасибо JordanC)
  • 16.07.2017: Обновлено ограничение для бесплатных планов, которые не поддерживают SSL
  • 25.09.2017: добавлены тупые веб-инструменты (спасибо Cœur)
  • 16.03.2008: Добавлен Ipdata.co (спасибо Джонатану)
  • 14.04.2008: переименован в freegeoip.net в ipstack (спасибо MA-Maddin)
  • 16.04.2008: добавлен GeoIPLookup.io (спасибо, Роб Ваа)
  • 6/11/2018: добавлено ipgeolocation (спасибо Эджаз Ахмед)
  • 31.07.2009: Добавлена Ipregistry (спасибо Лорану)
  • 16.08.2009: добавлен SmartIP.io (спасибо kevinj)
  • 22.08.2009: Удалены тупые веб-инструменты (не работают )
  • 8/8/2019: изменен месячный лимит Smart IP
  • 10.12.2009: добавлен Cloudflare
  • 1/9/2020: удален SmartIP.io (не работает)

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 в ближайшее время.
thdoan

1
Все эти ответы основаны на сторонней службе, что является большим недостатком не только потому, что вы зависите от своевременного ответа этой службы, но и потому, что если это не так, и вы не установите соответствующий тайм-аут (который всегда будет произойдет раньше, чем позже), вы будете задерживать время загрузки вашей страницы, что не очень хорошо. Итак, почему бы просто не использовать свой собственный сервер для возврата IP-адреса клиента? Это, кстати, тривиальная задача для любого языка программирования.
Даниэль Дж.

280

Окончательное обновление

Это решение больше не будет работать, потому что браузеры исправляют утечку webrtc: для получения дополнительной информации об этом прочитайте этот другой вопрос: RTCIceCandidate больше не возвращает IP


Обновление : я всегда хотел сделать min / uglified версию кода, так что вот код ES6 Promise:

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

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

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


Благодаря WebRTC очень легко получить локальный 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 пользователя.

откуда я взял код -> Source


12
Upvote, потому что здесь лучший ответ, спасибо за отличное 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

И в то время как поиск в Google, нашел его здесь на 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: это похоже на тот же метод (возвращаемый JSONP-серверный IP-адрес), который Чад упомянул в своем ответе. Который не соответствует требованию OP "нет кода на стороне сервера". Но да, это один из способов сделать это, если вы игнорируете это требование.
Shog9

Этот ответ устарел из-за WebRTC: stackoverflow.com/questions/20194722/…
Akam

1
Обновлено, @Akam. Вы должны дать mido некоторые реквизиты, чтобы указать на это несколько месяцев назад (после ГОДОВ людей, публикующих смущающе неправильные ответы, которые все еще требуют поддержки сервера).
Shog9

WebRTC более широко поддерживается сейчас ?!
старик

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 или Prototype.
Брэд Фолкенс

2
есть ли ограничения по запросу " api.hostip.info/get_html.php "? где я могу увидеть подробности этого API
Navin Leon

Возвращает IP-адрес сетевого брандмауэра. не фактический клиентский IP. Есть ли способ получить фактический IP-адрес клиента?
Лила Аддагулла

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

ИЛИ

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

скрипка


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

1
Для получения списка все Free IP служб поиска, вы можете обратиться к моему ответу на stackoverflow.com/questions/391979/...
thdoan

Как отправить эту функцию для возврата значения ip?
Нефтали Акоста

67

Ты не можешь Вы должны спросить сервер.


5
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
Химаншу

28
Но это вроде как, верно? Я имею в виду, что если ответ просто «нет, вы не можете», то я бы сказал, что это более правильный ответ, чем тот, который проголосовал в данный момент «здесь, используйте это случайное приложение appspot», которое кажется опасным ответом на верхняя часть списка.
SteveShaffer

16
ИМО Это правильный ответ и должен быть принят. В вопросе конкретно говорится: «нет кода на стороне сервера».
Matthewwithanm


2
@matthewwithanm Я не могу не согласиться. Я просматривал все ответы, чтобы увидеть, сказал ли кто-нибудь именно это - и был готов предложить это как ответ сам. Все ответы с высокой степенью голосования, хотя и информативные, все отвечают на другой вопрос. Цитирую вопрос: «Мне нужно каким-то образом получить IP-адрес клиента, используя чистый JavaScript; никакого кода на стороне сервера, даже SSI». Этот ответ, на самом деле, является правильным ответом. Javascript в изолированном браузере не может этого сделать (независимо от NAT или прокси). Вопрос должен быть изменен, если один из других ответов будет принят.
растяпа

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 и сотрудничество перед запуском демо .. в противном случае, он просто не будет работать.

Я не имею ничего общего с командой IPify. Я просто думаю, что это смешно, что кто-то предоставит такую ​​услугу для общего блага.


4
Самое приятное, что это происходит из-за «https», тогда как мои вызовы http-помощникам будут заблокированы, потому что они «небезопасны».
Тесса

эй, это показывает мне ошибку CORS, что мне делать?
саберпрашант

@saberprashant вы используете "HTTPS"?
FloatingRock

@FloatingRock, нет, я использую HTTP
SabrePrashant

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 тыс. С обратной ссылкой
Бен Даулинг,

19

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

больше документов здесь


1
Гектометр Это выглядит интересно ... Есть ли у них ограничения?
14:34

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
Уэйн 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>

Нет аякса. Просто простые javascript. : 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 опубликовал ФАНТАСТИЧЕСКИЙ ответ выше, который, кажется, единственный ответ, который действительно предоставил 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

Существует более простой и бесплатный подход, который не будет запрашивать у вашего посетителя никакого разрешения.

Он заключается в отправке очень простого запроса POST Ajax на http://freegeoip.net/json . Получив информацию о своем местоположении, в JSON вы реагируете соответствующим образом, обновляя страницу или перенаправляя на новую.

Вот как вы отправляете свой запрос на информацию о местоположении:

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

Кажется, у них отключение 1 июля 2018 года
Nithin PH

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: в OP специально упоминается «нет кода на стороне сервера», но вы используете C #.
Бруно Рейс

8
Разве не было бы лучше просто выводить <script>var uip='<%= Request.UserHostAddress %>';</script>?
Крис Хейнс

Помимо использования серверного кода, никогда не следует использовать DOM для хранения данных. Это просто плохо во всем. Hainesy имеет лучшую идею просто назначить на JS var.
Кобрл

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

Вы можете использовать библиотеку 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
});

Вы также можете использовать requirejs для загрузки скрипта.

Он предоставит вам IP-адрес вашего посетителя, а также несколько данных о его местонахождении (страна, город и т. Д.). Он основан на базе данных maxmind geoip.

Отказ от ответственности: я написал эту библиотеку


8

Javascript / JQuery получить IP-адрес и местоположение клиента (страна, город)

Вам нужно только вставить тег с ссылкой "src" на сервер. Сервер вернет «codehelper_ip» в виде объекта / 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
pmont

На всякий случай, если вы пропустили эти другие комментарии, вы должны использовать тип вместо языка
Майк

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

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 глобальных конечных точек, каждая из которых может обрабатывать> 800 миллионов запросов в день!

В этом ответе используется «тестовый» 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-страницы, чуть выше конечного тега body.

Ваш ярлык будет выглядеть так:

<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']; ?> </ скрипт>. По крайней мере, тогда программы чтения с экрана будут его пропускать, и не требуется getElementById или $ ('# stupidname').
Кобрл

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

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

Нет абсолютно никаких веских причин, по которым вы не можете или не должны добавлять элементы хранения данных в DOM, и для этого есть множество веских причин. На самом деле, эти причины в моем ответе, если вы захотите прочитать его еще раз. Он надежен, прост в управлении и особенно полезен, когда ваш файл javascript находится на удаленном сайте. Говоря об удаленном скрипте, ваш пример «javascript.php» - ужасная идея, и, вероятно, в любом случае не сработает. Думайте с точки зрения удаленных сценариев, таких как DISQUS.
ТАРКУС

3
На ваш другой комментарий о том, почему хранение данных в DOM плохое… ну, вы все равно можете остановить машину, аккуратно ударив по стене в пункте назначения, но сейчас есть более эффективные инструменты для работы. Теперь мы знаем лучше и имеем отличные рамки, чтобы облегчить это. Я работал в месте, где DOM был просто огромным конфигурационным файлом для JS, и это было кошмаром при рестайлинге. Если вы чувствуете, что использование <script src = "thing.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?
призрак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.