Мне было интересно, был ли простой способ получить общедоступный IP-адрес компьютера с помощью Ruby.
Получить общедоступный (удаленный) IP-адрес
Ответ 1
Akamai предоставляет страницу "Что такое IP-адрес", которую вы можете выбрать:
require 'open-uri'
remote_ip = open('http://whatismyip.akamai.com').read
Есть несколько альтернатив, которые делают одно и то же:
- http://whatismyip.akamai.com
- http://ipecho.net/plain
- http://icanhazip.com
- http://ipogre.com
- http://ident.me
- http://bot.whatismyipaddress.com
Вы также можете использовать субдомены ipv4
и ipv6
с ipogre.com
и icanhazip.com
.
Если вы не хотите зависеть от третьей стороны, вы можете сворачивать свой собственный в однострочном приложении стойки и развернуть это бесплатно на Heroku или что-то еще. Он принимает во внимание, что X-Forwarded-For
может содержать список прокси-адресов, разделенных запятыми, и возвращает IP-адрес клиента.
# config.ru
run lambda { |env|
remote_ip = env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR']
remote_ip = remote_ip.scan(/[\d.]+/).first
[200, {'Content-Type'=>'text/plain'}, [remote_ip]]
}
Вы можете попробовать его на экземпляре Heroku в http://remote-ip.herokuapp.com.
Ответ 2
Нет необходимости соскабливать!
Я использую ipify, открытый api, который возвращает ваш общедоступный IP-адрес. Полезно, если вам нужен ответ json (не показан здесь).
require 'net/http'
public_ip = Net::HTTP.get URI "https://api.ipify.org"
=> "12.3.45.678"
Или с curl:
public_ip = `curl https://api.ipify.org`
=> "12.3.45.678"
Не волнуйтесь, это не мой общедоступный IP-адрес:)
Ответ 3
Я использую curl:
my_ip = `curl http://ipecho.net/plain`
Это не использует Ruby stdlib и требует завитки.
Ответ 4
Я бы использовал сервис, например http://www.whatsmyip.website/, чтобы программно получить IP. Использование чего-то вроде Linux curl автоматически вернет IP-адрес, но если вы используете другое приложение/язык, вам может потребоваться проверить их API.
ip = `curl http://www.whatsmyip.website`
Ответ 5
Я ищу ту же проблему и нашел отличное решение на основе API.
Чтобы получить общедоступный IP-адрес, мы можем использовать приведенный ниже код:
require "net/http"
ip = Net::HTTP.get(URI("https://api.ipify.org"))
puts "My public IP Address is: " + ip
URL-адрес веб-сайта: https://www.ipify.org/
Это слишком поздно, чтобы успокоиться, но я подумал, что это может быть для других.