2012-11-07 40 views
15

Tôi đã tự hỏi nếu có một cách đơn giản để lấy địa chỉ IP công cộng của máy tính bằng Ruby.Nhận địa chỉ IP công cộng (từ xa)

+3

Tìm nạp [whatismyip] (http://www.whatismyip.com/) và phân tích cú pháp. :) –

+0

bạn có thông tin gì trong tay? tên miền?Nếu người dùng đang kết nối trực tiếp với máy chủ của bạn .. thì ip của khách hàng là ip công khai – ShadyKiller

+0

Mã sẽ chạy ở đâu trên máy tính của người dùng cuối? họ đang nói chuyện với một máy chủ bên ngoài rồi (yêu cầu web của IE) – Doon

Trả lời

26

Akamai cung cấp một "IP của tôi là gì" trang mà bạn có thể lấy:

require 'open-uri' 
remote_ip = open('http://whatismyip.akamai.com').read 

Có một vài lựa chọn thay thế mà làm điều tương tự, mặc dù:

Bạn cũng có thể sử dụng ipv4ipv6 tên miền phụ với icanhazip.com.

Nếu bạn không muốn phụ thuộc vào bên thứ ba, bạn có thể tự cuộn ứng dụng giá một dòng và triển khai miễn phí trên Heroku hoặc bất kỳ thứ gì. Nó có tính đến rằng X-Forwarded-For có thể chứa danh sách địa chỉ IP proxy được phân cách bằng dấu phẩy và chỉ trả lại IP của ứng dụng khách.

# 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]] 
} 
+0

Thật tuyệt vời, cảm ơn liên kết! – Stefan

+1

Hoặc làm 'yêu cầu' mở-uri '; đặt mở ('http://automation.whatismyip.com/n09230945.asp') .read ' –

+0

Ngoài ra còn có: 'require' open-uri '; đặt mở ("http://ifconfig.me/ip") .read' – roychri

1

tôi sử dụng curl:

my_ip = `curl http://ipecho.net/plain` 

này không sử dụng Ruby stdlib và đòi hỏi curl mặc dù.

3

Không cần cào!

Tôi sử dụng ipify, một api mở trả về địa chỉ IP công khai của bạn. Hữu ích nếu bạn muốn có một phản ứng json (không được hiển thị ở đây).

require 'net/http' 
public_ip = Net::HTTP.get URI "https://api.ipify.org" 
=> "12.3.45.678" 

Hoặc với curl:

public_ip = `curl https://api.ipify.org` 
=> "12.3.45.678" 

Đừng vui mừng, đó không phải là địa chỉ ip công cộng của tôi :)

0

Tôi muốn sử dụng một dịch vụ như http://www.whatsmyip.website/ để programatically có được IP . Sử dụng một cái gì đó như Linux curl sẽ tự động chỉ trả lại IP, nhưng nếu bạn sử dụng một ứng dụng khác nhau/ngôn ngữ bạn có thể cần phải kiểm tra API của họ.

ip = `curl http://www.whatsmyip.website` 
0

Tôi đang tìm cùng một vấn đề và tìm thấy giải pháp tuyệt vời dựa trên API.

Để có được địa chỉ IP công cộng chúng ta có thể có thể sử dụng đoạn mã sau:

require "net/http" 

ip = Net::HTTP.get(URI("https://api.ipify.org")) 
puts "My public IP Address is: " + ip 

API Site Url: https://www.ipify.org/

Đó là quá muộn để asnwer về vấn đề này nhưng tôi nghĩ rằng nó có thể là halpful cho người khác .

Các vấn đề liên quan