Получить IP-адрес в приложении Chrome

Я разрабатываю приложение Chrome, и мне нужно получить внешний IP-адрес.

Я пытался загрузить внешние скрипты, но у меня возникали ошибки, хотя я добавлял исходники в 'content_security_policy' файла manifest.json.

Я сдался, а затем попытался сделать запрос XMLHttpRequest к веб-сайту хоста/службы IP, но запросы должны быть асинхронными, и я не смог сохранить ответ на переменную, даже используя setTimeout().

Я всегда получал undefined, потому что переменная явно устанавливалась до того, как запрос был завершен.

Итак, не могли бы вы помочь мне найти простое решение для получения IP?


person ras    schedule 07.08.2014    source источник


Ответы (1)


Этот сайт http://jsonip.com/ выводит объект JSON следующим образом:

{"ip":"xxx.xxx.xxx.xxx","about":"/about","Pro!":"http://getjsonip.com"}

Вы можете выполнить асинхронный XMLHttpRequest для этого сайта следующим образом:

var xhr = new XMLHttpRequest(),
    IP_ADDRESS;

xhr.onreadystatechange = function() {
    if (xhr.readyState==4 && xhr.status==200) {
        IP_ADDRESS = JSON.parse(xhr.responseText).ip;
        console.log('IP ADDRESS: ' + IP_ADDRESS);
        // Log it or do something else so you'll know that the response has been received
    }
}

xhr.open('GET', 'http://jsonip.com/', true);
xhr.send();

Через некоторое время вы увидите в консоли такой лог:

IP ADDRESS: 12.34.567.89
person Marco Bonelli    schedule 07.08.2014
comment
Ваш код выглядит идентично тому, что я делал ранее, но проблема в том, что если я попытаюсь console.log(IP_ADDRESS), он покажет undefined. Странно то, что когда я console.log(xhr) я вижу весь объект JSON с правильным responseText, но если я console.log(xhr['responseText'], он снова показывает undefined. Не могли бы вы мне помочь? Мне нужно сохранить IP в переменной. - person ras; 07.08.2014
comment
Он отлично работает с моим расширением для Chrome: i.imgur.com/6ZCIt6B.jpg . Убедитесь, что вы правильно скопировали ВЕСЬ мой код (и используйте его на своей фоновой странице). - person Marco Bonelli; 07.08.2014
comment
Я скопировал ваш код точно так же, как вы его разместили, но если я попытаюсь получить доступ к переменной IP_ADDRESS сразу после вашего кода, я получу undefined, потому что это асинхронный запрос. Но я думаю, что сойдет, так как мне не нужна переменная сразу после вашего кода. Ваше здоровье! - person ras; 07.08.2014
comment
Очевидно, что если вы вызовете var сразу после запроса, это будет undefined man! Вы должны создать функцию для вызова, когда запрос заканчивается. В этой функции вы знаете, что переменная существует, и вы можете ее использовать... это базовая логика программирования. - person Marco Bonelli; 07.08.2014