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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Большинство ответов здесь «обходят» необходимость в коде на стороне сервера… Ударяя по чужому серверу. Это полностью допустимый метод, если только вы не на самом деле нужно, чтобы получить IP-адрес, не обращаясь к серверу.
Традиционно это было невозможно без какого-либо плагина (и даже тогда вы, вероятно, получили бы IP-адрес неправильный, если бы находились за NAT-маршрутизатором), но с появлением WebRTC это действительно возможно. . Если вы нацеливаетесь на браузеры, поддерживающие WebRTC (в настоящее время: Firefox, Chrome и Opera).
Пожалуйста, прочтите ответ Мидо для получения подробной информации о том, как можно получить полезные IP-адреса клиентов с помощью WebRTC.
Этот ответ устарел из-за WebRTC: stackoverflow.com/questions/20194722/…
Обновлено, @Akam. Вам следует дать мидо некоторый реквизит за указание на это несколько месяцев назад (после ГОДА людей, отправляющих досадно неправильные ответы, которые по-прежнему требовали поддержки сервера).
стал ли WebRTC более широко поддерживаться ?!
Согласно этой ссылке "CanIUse" это @BugWhisperer. Если вам не нужен IE.
В общем случае это невозможно, если вы не используете какую-либо внешнюю службу.
Действительно, это возможно с помощью Javascript, полагаясь на стороннюю службу, такую как Ipregistry (отказ от ответственности: я запускаю службу): ipregistry.co/docs/getting-location-from-ip-address#javascri pt Вы можете получить IP-адрес и много связанной информации, включая данные об угрозах, за один вызов.
На самом деле нет надежного способа получить IP-адрес клиентского компьютера.
Это проходит через некоторые из возможностей. Код, использующий Java, сломается, если у пользователя несколько интерфейсов.
http://nanoagent.blogspot.com/2006/09/how-to-find-evaluate-remoteaddrclients.html
Глядя на другие ответы здесь, похоже, что вы можете получить общедоступный IP-адрес клиента, который, вероятно, является адресом маршрутизатора, который они используют для подключения к Интернету. Об этом говорят многие другие ответы здесь. Я бы рекомендовал создать и разместить свою собственную страницу на стороне сервера для получения запроса и ответа с IP-адресом вместо того, чтобы зависеть от чьей-либо услуги, которая может продолжать работать или не работать.
Я не гуру javascript, но, если это возможно, вы можете открыть iframe с http://www.whatismyip.com/automation/n09230945.asp в качестве источника и прочитать содержимое кадра.
Обновлено: это не сработает из-за междоменной безопасности.
Возможно, вы захотите попробовать это перед тем, как принять. Я думал, что это приведет к ошибке «Доступ запрещен» из-за нарушения правил междоменного сценария.
Не в iframe. Проблема в том, что вам придется передавать переменные туда и обратно между iframe и вашим основным документом. IFrame не сможет получить информацию из родительского документа, поэтому убедитесь, что вы используете его наоборот.
Почему этого не голосуют? + !. Отличная идея. Где-то внизу есть лучший ответ, но этот хороший.
@JimThio, потому что, как указано в ответе, он не будет работать из-за ограничений междоменной безопасности.
о, тогда не используйте iframe. Воспользуйтесь моим решением ниже.
Что ж, я отвлекся от вопроса, но сегодня у меня была аналогичная потребность, и хотя я не смог найти идентификатор от клиента с помощью 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 я просто загружаю это значение.
Это может быть полезно для некоторых людей с похожими требованиями, такими как ваше (например, я, пока я этого не понял).
Ваше здоровье!
-1: OP специально упоминает «без кода на стороне сервера», но вы используете некоторый C#.
Не лучше ли просто выводить <script>var uip='<%= Request.UserHostAddress %>';</script>?
Помимо использования кода на стороне сервера, никогда не следует использовать DOM для хранения данных. Это просто плохо во всем. У Хейнси есть лучшая идея просто назначить JS var.
Вы можете, ретранслируя его через сервер с помощью 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>
Note : The telize.com API has permanently shut down as of November 15th, 2015.
Хотя я ценю этот фрагмент, я считаю, что загрузка текстового содержимого JavaScript и его оценка с помощью функции представляет собой серьезную угрозу безопасности. Что, если содержимое ответа изменится и все 100+ человек здесь, проголосовавших за этот ответ и, возможно, использовавших этот фрагмент, в конечном итоге вызовут функцию с возможным небезопасным содержимым. Я бы использовал это, только если бы это была строка JSON.
Error Over Quota This application is temporarily over its serving quota. Please try again later.Это не лучший ответ, поскольку он связан с запросом на стороне сервера. В вопросе четко сказано "чистый javascript".
Мика, невозможно получить IP-адрес с помощью чистого javascript. Я предлагаю вам почитать о NAT и о том, как это работает. Вам нужен сервер, чтобы передать вам ваш IP-адрес в Интернете.
Служба сейчас не работает.
@CyrilN. да, создатель службы отключил ее, потому что ею злоупотребляли спам / вредоносное ПО. см. его пост: cambus.net/adventures-in-running-a-free-public-api
Этот интернет-скрипт сейчас постоянно нефункционален. Удаление мертвого кода превращает этот ответ в ответ «вы можете найти что-нибудь в Google». Так что это больше не ответ по определению Stack Overflow. Извините @ChadGrant, но я предлагаю вам удалить его, чтобы увидеть рабочие ответы.
Вы можете сделать 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;
}
В качестве бонуса информация о геолокации возвращается в том же вызове.
Вы также можете получить представление JSON с помощью api.hostip.info/get_json.php, а затем проанализировать JSON с помощью функции браузера, jQuery или Prototype.
есть ли ограничение на количество запросов на "api.hostip.info/get_html.php"? где я могу увидеть детали этого API
Он возвращает IP-адрес сетевого брандмауэра. не фактический IP-адрес клиента. Есть ли способ получить реальный IP-адрес клиента?
С использованием Smart-IP.net Geo-IP API. Например, используя jQuery:
$(document).ready( function() {
$.getJSON( "http://smart-ip.net/geoip-json?callback=?",
function(data){
alert( data.host);
}
);
});
«Служба временно недоступна».
написал простой api [geoip.immanuel.co/myip], чтобы получить IP-адрес клиента, ssl включен и без ограничений
Включите этот код на свою страницу: <script type = "text/javascript" src = "http://l2.io/ip.js"></script>
другой документ здесь
Хм. Смотрится интересно ... Есть ли у них ограничения?
библиотека офлайн
Существует некоторая степень всплывающих окон спама, связанных с l2.io ref: hybrid-analysis.com/sample/… позволяет встраивать ссылки, как в примере 117.254.84.212:3000/getjs?nadipdata= "{" url ":" / ip.js? Var = myip "," host ":" l2. io "," re ferer ":" website.com/…} "& screenheight = 768 & screenwidth = 1366 & tm = 1557565256073 & lib = t rue & fingerprint = c2Vw LW5vLXJlZGlyZWN0
Я собираюсь предложить метод, который я часто использую, когда хочу хранить информацию на странице 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;
}
... это лучший способ сделать это.
Не храните данные в DOM. Почему кто-то мог предположить это даже через 2 года? Если вы можете вставить что-либо в HTML-файл, просто вставьте это значение в переменную JS вот так. <script> var ip = <? php echo $ _SERVER ['REMOTE_ADDR']; ?> </script>. По крайней мере, тогда программы чтения с экрана его пропустят, а getElementById или $ ('# stupidname') не потребуется.
@fractalspawn, по той причине, что нельзя вставить php код в .js файл. Не думал об ЭТОМ, да ты умные штаны! ;)
Что ж, вы могли бы, если бы вы сделали <script type = "text / javascript" src = "path / to / fancy / javascript.php"> </script>, хотя я не уверен, зачем вам это делать. Я хочу сказать, что если PHP может вставлять что-либо в HTML, который он отображает, лучше всего было бы, чтобы он вставлял значение в переменную JS во встроенном теге скрипта, а не в элемент DOM, который вам затем пришлось бы анализировать. для использования и потенциально может быть прочитан программами чтения с экрана, если вы не примете дополнительных мер для предотвращения этого.
Нет абсолютно никакой веской причины, по которой вы не можете или не должны добавлять элементы хранения данных в DOM, и есть много веских причин для этого. Фактически, эти причины есть в моем ответе, если вы захотите прочитать его еще раз. Он надежен, прост в управлении и особенно полезен, когда ваш файл javascript находится на удаленном сайте. Говоря об удаленном скрипте, ваш пример "javascript.php" - ужасная идея и, вероятно, все равно не сработает. Подумайте об удаленных сценариях, таких как DISQUS.
Наткнулся на этот вопрос, и мне пришлось здесь поддержать @fractalspawn: вы не должны хранить данные в DOM. На самом деле его фрагмент <script>var ip = '<?php echo $_SERVER['REMOTE_ADDR']; ?>';</script> работает безупречно, и вы можете получить доступ к переменной ip в javascript, даже не проходя через dom с помощью вызова getElementByID. И, по его словам, это намного лучше для программ чтения с экрана (или даже для браузеров, отображающих текст).
@ Benjamin C. - Еще один читатель полностью упускает из виду проблему, заключающуюся в том, что файл Javascript, особенно файл библиотеки Javascript, размещенный удаленно, НЕ ОБРАБАТЫВАЕТ КОД СТОРОНЫ СЕРВЕРА. Предложение использовать "javascript.php" - абсурдно грубая уловка. Некоторые люди говорят, что данные не должны храниться в модели DOM, но никто из них не объяснил почему. Фактически, элементы TABLE являются элементами хранения данных, а также элементами LABEL. Описанный мной метод особенно хорошо работает для удаленных скриптов и html-объектов. Постарайтесь обдумать свой ответ, прежде чем голосовать против лучшего ответа.
@ Грегори Льюис: кажется, мы оба не понимаем друг друга. Я просто согласен не согласиться. Удачного кодирования! :)
@fractalspawn - Если бы я писал скрипт .js, это мгновенно аннулировало бы ваше предложение. Никто здесь толком не объяснил, почему <label><?php echo $_SERVER['remote_addr']; ?></label> - плохая идея.
Исходная проблема, на мой взгляд, заключается в том, что мы пытаемся получить IP-адрес с сервера. Предполагая, что разработчик хочет использовать эту информацию в коде JS; помещать его в DOM, а затем скрывать, является избыточным. Использование DOM для хранения произвольных данных с сервера для использования в коде JS - это то, что здесь не подходит. Если вы хотите только показать его пользователю, тогда ваш ответ в порядке (за исключением стилей скрытия). Вдобавок PHP не заботится о том, кому вы повторяете. Это могут быть данные .jpg, код .js или правила .css. IIRC, пока браузер получает то, что ожидает, источник и средства не имеют значения.
К вашему другому комментарию о том, почему хранилище данных DOM плохо ... ну, вы все еще можете остановить машину, осторожно ударившись о стену в пункте назначения, но сейчас есть более эффективные инструменты для этой работы. Теперь мы знаем лучше, и у нас есть отличные инструменты для решения этой проблемы. Я работал в месте, где DOM был просто огромным файлом конфигурации для JS, и после рестайлинга это был кошмар. Если вы чувствуете, что использование <script src = "something.php"> - это "грубый взлом", а хранение данных в DOM, которые имеют значение только внутри Javascript, - нет, тогда я действительно рад, что мы не работаем вместе и снова с радостью соглашаемся не соглашаться. :)
Да я согласен. Я действительно рад, что не работаю с кем-то, кто мог бы рассматривать сценарий на стороне сервера, такой как "javascript.php", как разумное решение для языка сценариев на стороне клиента, особенно когда мы создаем библиотеки сценариев, которые могут находиться на совершенно другом domain: / И мне кажется, я все еще не вижу недостатков использования элементов DOM для хранения данных, особенно в свете того факта, что у вас не всегда есть возможность написать библиотеку javascript типа «javascript.php».
@TARKUS Он помещает этот сценарий в html файл ... так же, как вы делаете свой лейбл. Конечно, нет веских причин помещать данные в HTML. Сделайте это просто в переменной js.
@ Totty.js он связывает файл php, а не файл javascript. Что, если это был кросс-домен? Должен быть файл .js.
В смысле это лучше: <script>var ip = <?php echo $_SERVER['REMOTE_ADDR']; ?></script>, чем ставить <label><?php echo $_SERVER['remote_addr']; ?></label>. Не нужно разбирать html в первом, это простой js.
@ Totty.js прочтите вопрос еще раз. Вы делаете предположение, что это ссылка на удаленный скрипт. Это вообще не вопрос. OP хочет получить доступ к удаленному IP. Это все.
Я бы сказал, что у Чада и Мальты есть отличный ответ. Однако они сложны. Поэтому я предлагаю этот код, который я нашел в рекламе плагинов по странам.
<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, могут работать так же без проблем.
загрузка JavaScript с удаленного сервера и вызов функций с неизвестным содержимым кажутся мне огромной угрозой безопасности (что, если содержимое функции изменится?). Я бы предпочел разобрать ответ JSON.
Ошибка 404: объект не найден
Это было очень давно. Ответ на самом деле совершенно ложный. Я не знал, что javascript не может знать IP.
о, это правильно, функция Посетители IP не предназначена для кода PHP. Это код javacript, созданный кодом php
вы можете просто использовать свой собственный сервер, чтобы распечатать код javascript, который назначает IP посетителей.
Во всех приведенных выше ответах есть серверная часть, а не чисто клиентская часть. Это должно быть предоставлено веб-браузером. В настоящее время ни один веб-браузер не поддерживает это.
Однако с этим дополнением для firefox: https://addons.mozilla.org/en-US/firefox/addon/ip-address/ Вам нужно будет попросить своих пользователей установить это дополнение. (это хорошо от меня, стороннего производителя).
вы можете проверить, установил ли его пользователь.
var installed=window.IP!==undefined;
вы можете получить его с помощью javascript, если он установлен, то var ip = IP.getClient (); var IPclient = ip.IP; // а ip.url - это URL
ip=IP.getServer();
var IPserver=ip.IP;
var portServer=ip.port;
//while ip.url is the url
//or you can use IP.getBoth();
подробнее здесь: http://www.jackiszhp.info/tech/addon.IP.html
Ужасный совет. Итак, вы просите пользователей загрузить расширение (которое, кстати, давно было удалено), которое может работать только в определенном браузере и может быть отключено в любое время, просто чтобы получить их IP-адрес? Это неэффективно, потому что есть те, кто не выдержит всего этого и просто уйдет. Лучшим способом по-прежнему остается серверный способ.
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 определяет реальный IP-адрес плюс страну
Если вы используете jQUery, вы можете попробовать:
console.info(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>
не используйте атрибут language, используйте вместо него type = "text/javascript", подробнее о MDN
как уже упоминалось в @Alex, язык устарел и используется только в устаревшем коде. Вместо этого используйте 'type = "text / javascript"' для максимальной совместимости.
просто FYI - поле типа не требуется для HTML5 (по умолчанию JS). w3schools.com/tags/att_script_type.asp
На всякий случай, если вы пропустили эти другие комментарии, вы должны использовать тип вместо языка
Для этого вы можете использовать мою службу http://ipinfo.io, которая предоставит вам IP-адрес клиента, имя хоста, информацию о геолокации и владельца сети. Вот простой пример, который регистрирует IP:
$.get("http://ipinfo.io", function(response) {
console.info(response.ip);
}, "jsonp");
Вот более подробный пример JSFiddle, который также распечатывает полную информацию об ответе, чтобы вы могли видеть все доступные сведения: http://jsfiddle.net/zK5FN/2/
Чтобы избежать проблем с политикой смешанного содержимого, измените http://ipinfo.io на //ipinfo.io или https
Мы хотим воспользоваться вашим сервисом, есть ли у вас какие-либо скидки для пользователей Stackoverflow?
@MehdiDehghani мы бесплатны до 50 тысяч запросов в месяц, за 100 тысяч с обратной ссылкой - см. ipinfo.io/contact/creditlink
Try this
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
ИЛИ ЖЕ
$(document).ready(function () {
$.getJSON("http://jsonip.com/?callback=?", function (data) {
console.info(data);
alert(data.ip);
});
});
это работает $ .get ("ipinfo.io", function (response) {alert (response.ip);}, "jsonp"); но как мне сохранить значение в переменной? кажется, что он исчезает за пределами этого цикла запроса на получение
Список всех бесплатных сервисов поиска IP-адресов можно найти в моем ответе на stackoverflow.com/questions/391979/….
Как отправить эту функцию, чтобы вернуть значение ip?
Если вы всегда включаете файл, вы можете сделать простой ajax get:
function ip_callback() {
$.get("ajax.getIp.php",function(data){ return data; }
}
А ajax.getIp.php будет такой:
<?=$_SERVER['REMOTE_ADDR']?>
<script type = "application/javascript">
function getip(json)
{
alert(json.ip);
}
<script type = "application/javascript" src = "http://jsonip.appspot.com/?callback=getip"></script>
Запускаем выше скрипт Нажмите здесь
«Эта корзина была создана анонимно, и время ее бесплатного просмотра истекло.». ИСПОЛЬЗУЙТЕ jsFiddle в следующий раз, чтобы ваши прекрасные примеры не ... истекли.
Сторонняя служба, которую рекомендует этот ответ, больше не существует, что делает ее бесполезной.
<!DOCTYPE html>
<html ng-app = "getIp">
<body>
<div ng-controller = "getIpCtrl">
<div ng-bind = "ip"></div>
</div>
<!-- Javascript for load faster
================================================== -->
<script src = "lib/jquery/jquery.js"></script>
<script src = "lib/angular/angular.min.js"></script>
<script>
/// Scripts app
'use strict';
/* App Module */
var getIp = angular.module('getIp', [ ]);
getIp.controller('getIpCtrl', ['$scope', '$http',
function($scope, $http) {
$http.jsonp('http://jsonip.appspot.com/?callback=JSON_CALLBACK')
.success(function(data) {
$scope.ip = data.ip;
});
}]);
</script>
</body>
</html>
Услуга обратного вызова 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
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?
Получите свой IP с помощью jQuery
вы можете получить свой публичный IP-адрес с помощью одной строчки JS? Существует бесплатная услуга, которая предлагает это для вас, и все, что вам нужно сделать, - это запрос на получение:
$.get('http://jsonip.com/', function(r){ console.info(r.ip); });
Чтобы приведенный выше фрагмент работал, ваш браузер должен поддерживать CORS (совместное использование запросов из разных источников). Иначе будет выброшено исключение безопасности. В старых браузерах вы можете использовать эту версию, которая использует запрос JSON-P:
$.getJSON('http://jsonip.com/?callback=?', function(r){ console.info(r.ip); });
Вы можете использовать такие веб-службы, как: http://ip-api.com/
Пример:
<script type = "text/javascript" src = "http://ip-api.com/json/?callback=foo">
<script>
function foo(json) {
alert(json.query)
}
</script>
additional example: http://whatmyip.info
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip: " + data.ip);
});
Вы можете сделать это полностью на стороне клиента и в основном на JavaScript, используя объект Flash, который может вызывать js. Flash может обращается к IP-адресу локального компьютера, что может быть не очень полезно.
У меня есть собственный API-интерфейс с laravel, поэтому я обычно делаю следующее:
$(document).ready( function() {
$.getJSON( "http://api.whoisdoma.com/v1/ip/visitor?api_key=key",
function(data){
alert( data.ip);
}
);
});
Для дополнительной безопасности я предоставляю ключ api, который необходим для получения результатов.
Вы можете использовать библиотеку 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.
Отказ от ответственности: я написал эту библиотеку
<script type = "text/javascript" src = "http://l2.io/ip.js?var=myip"></script>
<script>
function systemip(){
document.getElementById("ip").value = myip
console.info(document.getElementById("ip").value)
}
</script>
Проверить http://www.ipify.org/
Согласно им:
- You can use it without limit (even if you're doing millions of requests per minute).
- ipify is completely open source (check out the GitHub repository).
Вот рабочий пример 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
Note: Turn off Adblock Plus / uBlock & co before running the demo .. otherwise, it just won't work.
У меня ничего такого связан с командой IPify. Я просто думаю, что это до смешного круто, что кто-то предоставляет такую услугу для всеобщего блага.
Самое приятное то, что это исходит от «https», тогда как мои вызовы к помощникам по http IP блокировались, потому что они «небезопасны».
эй, он показывает мне ошибку CORS, что мне делать?
@saberprashant вы используете "HTTPS"?
@FloatingRock, нет, я использую HTTP
Есть ли в этом подвох?
Ну, если в HTML импортировать скрипт ...
<script type = "text/javascript" src = "//stier.linuxfaq.org/ip.php"></script>
Затем вы можете использовать переменную userIP (которая будет IP-адресом посетителя) в любом месте страницы.
Для перенаправления:
<script>
if (userIP == "555.555.555.55") {window.location.replace("http://192.168.1.3/flex-start/examples/navbar-fixed-top/");}
</script>
Или показать на странице: document.write (userIP);
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я являюсь автором сценария, который я сказал импортировать. Сценарий получает IP с помощью PHP. Исходный код скрипта ниже.
<?php
//Gets the IP address
$ip = getenv("REMOTE_ADDR") ;
Echo "var userIP = '" . $ip . "';";
?>
Вы не можете. Вам нужно будет спросить у сервера.
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением.
Но вроде как, правда? Я имею в виду, что если ответ просто «нет, ты не можешь», то я бы сказал, что это более правильный ответ, чем тот, за который в настоящее время проголосовали «здесь, используйте это случайное приложение appspot», что кажется опасным ответом для вверху списка.
ИМО Это правильный ответ, и его следует принять. В вопросе конкретно говорится «нет кода на стороне сервера».
Не могли бы вы уточнить? Все ответы предполагают, что вы отправляете запрос на другой сервер, но как этот сервер получает IP-адрес из запроса, который вы делаете, и почему браузер не может этого сделать?
@matthewwithanm Я не могу с этим согласиться. Я просматривал все ответы, чтобы узнать, сказал ли кто-нибудь именно это, и сам был готов предложить это в качестве ответа. Все ответы, получившие большое количество голосов, хотя и информативны, но все же отвечают на разные вопросы. Цитата на вопрос: «Мне нужно каким-то образом получить IP-адрес клиента, используя чистый JavaScript; никакого кода на стороне сервера, даже SSI». Фактически, это правильный ответ. Javascript в песочнице браузера не может этого сделать (независимо от NAT или прокси). Если нужно принять один из других ответов, вопрос следует изменить.
Это невозможно сделать только с помощью Javascript (если у клиентов нет плагина для браузера, как описано выше). Это также невозможно сделать с помощью Flash на клиенте. Но это можно сделать на клиенте с помощью Java-апплета (и javascript может с ним разговаривать), хотя он запросит полные разрешения. например См. http://www.findmyrouter.net
Вы можете использовать службу api от телиз
Если вам нужен только публичный IP-адрес клиента, сделайте следующее:
var ip = "http://www.telize.com/ip";
var response = http.request({url: ip});
и если вам нужна дополнительная информация, например, о местонахождении и т. д., вы можете сделать это:
var ipAndGeoDetails = "http://www.telize.com/geoip/"
var response = http.request({url: ipAndGeoDetails});
NOTE : The public API of telize will permanently shut down on November 15th, 2015.
Java Script для поиска IP
Чтобы получить IP-адрес, я вызываю JSON в бесплатную веб-службу.. нравиться
[jsonip.com/json, ipinfo.io/json, www.telize.com/geoip, ip-api.com/json, api.hostip.info/get_json.php]
и я передаю имя функции обратного вызова, которая будет вызываться по завершении запроса.
<script type = "text/javascript">
window.onload = function () {
var webService = "http://www.telize.com/geoip";
var script = document.createElement("script");
script.type = "text/javascript";
script.src = webService+"?callback=MyIP";
document.getElementsByTagName("head")[0].appendChild(script);
};
function MyIP(response) {
document.getElementById("ipaddress").innerHTML = "Your IP Address is " + response.ip;
}
</script>
<body>
<form>
<span id = "ipaddress"></span>
</form>
</body>
для xml-ответа код
WebRTC, который не требует поддержки сервера.
Как недавно показал новый репозиторий Github, webrtc-ip, теперь вы можете получить утечку IP-адреса пользователя общественный с помощью WebRTC. К сожалению, эта утечка не работает для частных IP-адресов из-за постепенного перехода на mDNS (по крайней мере, для WebRTC), полностью объяснил здесь. Однако вот рабочая демонстрация:
getIPs().then(res => document.write(res.join('\n')))<script src = "https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js"></script>Скомпилированный исходный код для этого репозитория можно найти здесь.
(Ранее) Окончательное обновление
Это решение больше не будет работать, потому что браузеры исправляют утечку webrtc: для получения дополнительной информации прочитайте другой вопрос: RTCIceCandidate больше не возвращает IP
Обновлять: Я всегда хотел сделать минимальную / неуплицированную версию кода, поэтому вот код ES6 Promise:
var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
/*Usage example*/
findIP.then(ip => document.write('your ip: ', ip)).catch(e => console.error(e))Примечание: Этот новый минимизированный код будет возвращать только один IP-адрес, если вы хотите, чтобы все IP-адреса пользователя (которые могут быть больше в зависимости от его сети), используйте исходный код ...
Благодаря WebRTC очень легко получить локальный 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.info('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-адрес пользователя.
откуда я взял код -> Источник
Я получил сообщение «Ошибка: конструктор RTCPeerConnection передал недопустимый RTCConfiguration - неверный URI: undefined» в Firefox 26
@BeniBela обновил код для работы с firefox 26, проверил на машине с Windows, вы можете проверить и подтвердить?
Голосуйте за, потому что здесь лучший ответ, а также спасибо за отличное репо на GitHub!
С его помощью я могу получить свой IP-адрес во внутренней сети, это здорово!
Не работает с com.android.chrome на мобильных устройствах Samsung - возвращается mac-адрес.
Предупреждение: здесь отображается не ваш общедоступный IP-адрес, а только локальный сетевой. Вы не можете использовать его для определения страны пользователей, например, если они находятся в локальной сети.
@FloatingRock, вы также можете получить общедоступный IP-адрес, используя сервер STUN (и настроить его при создании однорангового узла), и опять же, это потребует от вас обслуживания / использования сервера STUN, отображения кода сервера.
Это известно как утечка WebRTC. Должно быть исправлено всеми браузерами мэра, но это не так. Дополнительная информация здесь: privacytools.io/webrtc.html Возможно, это связано с утечкой вашего реального IP-адреса браузером Tor.
Это точно ответ 2017 года! Спасибо.
Это показывает мой личный адрес, а не мой публичный адрес.
Я думаю, что это решение больше не работает с Firefox. (Проверено с v56.0.2 (64-бит))
@mido, не могли бы вы указать на рабочий пример сервера STUN, который вы упомянули в своем ответе на @FloatingRock?
@mido Отличный лидер, однако этот код не работает в Safari ... есть предложения?
какова цель отслеживания локальных IP-адресов по сравнению с общедоступными IP-адресами?
Это можно легко обойти, включив экспериментальный флаг Chrome: Anonymize local IPs exposed by WebRTC..
Хотя ответ мне понравился, клиент может пропустить этот процесс, отключив WebRTC -restoreprivacy.com/webrtc-leaks
Можно ли получить имя пользователя, используя этот IP-адрес?
@FloatingRock Я только что отредактировал пост. Теперь, как показывает связанный репозиторий github, общедоступный IP-адрес - это единственный IP-адрес, который вы можете получить.
Одна проблема с некоторыми другими службами, которые я видел здесь, заключается в том, что они либо не поддерживают IPv6, либо действуют непредсказуемо при наличии IPv6.
Поскольку мне самому нужна была эта возможность в среде с двойным стеком, я собрал свою собственную службу IP-адресов, которую вы можете найти на http://myip.addr.space/. Также есть краткая справка на /помощь.
Чтобы использовать его с jQuery, используйте конечную точку /ip. Вы получите простой текст, содержащий IP-адрес, в зависимости от используемого поддомена:
$.get("http://myip.addr.space/ip") возвращает либо IPv6, либо IPv4, в зависимости от того, что доступно системе. (JSFiddle)
$.get("http://ipv4.myip.addr.space/ip") всегда возвращает IPv4 (или терпит неудачу, если нет IPv4).
$.get("http://ipv6.myip.addr.space/ip") всегда возвращает IPv6 (или терпит неудачу, если нет IPv6).
Есть более простой и бесплатный подход, при котором у посетителя не будет спрашиваться разрешения.
Он заключается в отправке очень простого запроса Ajax POST в http://freegeoip.net/json. Получив информацию о своем местоположении в формате JSON, вы соответствующим образом отреагируете, обновив страницу или перенаправив на новую.
Вот как вы отправляете запрос на получение информации о местоположении:
jQuery.ajax( {
url: '//freegeoip.net/json/',
type: 'POST',
dataType: 'jsonp',
success: function(location) {
console.info(location)
}
} );
Кажется, они закрылись 1 июля 2018 года.
Мне очень нравится api.ipify.org, потому что он поддерживает как HTTP, так и HTTPS.
Вот несколько примеров получения IP с помощью api.ipify.org с помощью jQuery.
https://api.ipify.org?format=json
$.getJSON("https://api.ipify.org/?format=json", function(e) {
alert(e.ip);
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>http://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>Если вы не хотите, чтобы он был в JSON, есть также текстовый ответ по HTTPS.
https://api.ipify.org
И есть также ответ в виде открытого текста по HTTP
http://api.ipify.org
Есть две интерпретации этого вопроса. Большинство людей интерпретировало «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>Получить локальный IP-адрес системы:
try {
var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection) (function () {
var rtc = new RTCPeerConnection({ iceServers: [] });
if (1 || window.mozRTCPeerConnection) {
rtc.createDataChannel('', { reliable: false });
};
rtc.onicecandidate = function (evt) {
if (evt.candidate) grepSDP("a = " + evt.candidate.candidate);
};
rtc.createOffer(function (offerDesc) {
grepSDP(offerDesc.sdp);
rtc.setLocalDescription(offerDesc);
}, function (e) { console.warn("offer failed", e); });
var addrs = Object.create(null);
addrs["0.0.0.0"] = false;
function updateDisplay(newAddr) {
if (newAddr in addrs) return;
else addrs[newAddr] = true;
var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; });
LgIpDynAdd = displayAddrs.join(" or perhaps ") || "n/a";
alert(LgIpDynAdd)
}
function grepSDP(sdp) {
var hosts = [];
sdp.split('\r\n').forEach(function (line) {
if (~line.indexOf("a=candidate")) {
var parts = line.split(' '),
addr = parts[4],
type = parts[7];
if (type === 'host') updateDisplay(addr);
} else if (~line.indexOf("c = ")) {
var parts = line.split(' '),
addr = parts[2];
alert(addr);
}
});
}
})();} catch (ex) { }
Если вы где-то используете NGINX, вы можете добавить этот фрагмент и запросить свой собственный сервер с помощью любого инструмента AJAX.
location /get_ip {
default_type text/plain;
return 200 $remote_addr;
}
Простое решение для получения IP-адреса - добавить в файл следующий код.
$.getJSON('https://api.ipify.org?format=json', function(data){
// Your callback functions like
console.info(data.ip);
localStorage.setItem('ip',data.ip);
alert(data.ip);
});
Он получит IP-адрес при загрузке страницы.
Вы можете попробовать использовать наш https://ip-api.io geo ip API. Например, с jQuery:
$(document).ready( function() {
$.getJSON("http://ip-api.io/api/json",
function(data){
console.info(data);
}
);
});
Также https://ip-api.io проверяет базы данных TOR, публичных прокси и спамеров, а также предоставляет эту информацию.
Пример ответа:
{
"ip": "182.35.213.213",
"country_code": "US",
"country_name": "United States",
"region_code": "CA",
"region_name": "California",
"city": "San Francisco",
"zip_code": "94107",
"time_zone": "America/Los_Angeles",
"latitude": 32.7697,
"longitude": -102.3933,
"suspicious_factors": {
"is_proxy": true,
"is_tor_node": true,
"is_spam": true,
"is_suspicious": true // true if any of other fields (is_proxy, is_tor_node, is_spam) is true
}
}
$.getJSON("http://jsonip.com?callback=?", function (data) {
alert("Your ip address: " + data.ip);
});
Попробуй это
$.get("http://ipinfo.io", function(response) {
alert(response.ip);
}, "jsonp");
Используйте ipdata.co.
API также предоставляет данные о геолокации и имеет 10 глобальных конечных точек, каждая из которых может обрабатывать> 800 миллионов запросов в день!
This answer uses a 'test' API Key that is very limited and only meant for testing a few calls. Signup for your own Free API Key and get up to 1500 requests daily for development.
$.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>Попробуйте это: http://httpbin.org/ip (или https://httpbin.org/ip)
Пример с https:
$.getJSON('https://httpbin.org/ip', function(data) {
console.info(data['origin']);
});
Источник: http://httpbin.org/
Прежде всего фактический ответ: Невозможно использовать код, выполняемый исключительно на стороне клиента, для определения вашего собственного 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
}
@oscar: похоже, это тот же метод (IP-адрес, видимый сервером, возвращенный JSONP), который Чад упомянул в своем ответе. Что не соответствует требованию OP «без кода на стороне сервера». Но да, это один из способов добиться этого, если вы проигнорируете это требование.