22

How can I find the public facing IP for my net work in Python?

2
  • Yes I asked this with the intention of answering it, but it was not here and I could see someone else needing the info. Commented Oct 3, 2008 at 12:22
  • All of the answers I see above would report the IP address of any web proxy in use, not necessarily the public facing IP address of your system (anything not being run through a web proxy may have an entirely different IP address). Commented Jun 1, 2012 at 0:35

8 Answers 8

16

https://api.ipify.org/?format=json is pretty straight forward

can be parsed by just running requests.get("https://api.ipify.org/?format=json").json()['ip']

Sign up to request clarification or add additional context in comments.

1 Comment

Added +1 for something using https!
13

This will fetch your remote IP address

import urllib
ip = urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read()

If you don't want to rely on someone else, then just upload something like this PHP script:

<?php echo $_SERVER['REMOTE_ADDR']; ?>

and change the URL in the Python or if you prefer ASP:

<%
Dim UserIPAddress
UserIPAddress = Request.ServerVariables("REMOTE_ADDR")
%>

Note: I don't know ASP, but I figured it might be useful to have here so I googled.

3 Comments

php manual says that REMOTE_ADDR is "The IP address from which the user is viewing the current page." i.e., you need to put the php script on an external server to get your public ip. Also automation.whatismyip.com is not accessible. http://canihazip.com/s works.
It seems automation.whatismyip.com is no longer running, something about they want you to make an account and use their home page.
whatsmyip.com/org seem to not allow requests from unknown user-agents anymore. api.ipify.org does not seem to have that issue. Let me see if I can edit this answer.
7
import requests
r = requests.get(r'http://jsonip.com')
# r = requests.get(r'https://ifconfig.co/json')
ip= r.json()['ip']
print('Your IP is {}'.format(ip))

Reference

Comments

6

whatismyip.org is better... it just tosses back the ip as plaintext with no extraneous crap.

import urllib
ip = urllib.urlopen('http://whatismyip.org').read()

But yeah, it's impossible to do it easily without relying on something outside the network itself.

4 Comments

Neither does the link I reference, it also just returns the raw IP address.
No longer just gives plaintext.
Also seems to think I live in Kansas. We're not in Kansas anymore Toto.
whatsmyip.org/com seem to block based on User-Agent these days or some-such; api.ipify.org mentioned in another answer does not.
4

If you don't mind expletives then try:

http://wtfismyip.com/json

Bind it up in the usual urllib stuff as others have shown.

There's also:

http://www.networksecuritytoolkit.org/nst/tools/ip.php

Comments

3
import urllib2
text = urllib2.urlopen('http://www.whatismyip.org').read()
urlRE=re.findall('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',text)
urlRE        

['146.148.123.123']

Try putting whatever 'findmyipsite' you can find into a list and iterating through them for comparison. This one seems to work well.

Comments

1

This is simple as

>>> import urllib
>>> urllib.urlopen('http://icanhazip.com/').read().strip('\n')
'xx.xx.xx.xx'

Comments

0

You can also use DNS which in some cases may be more reliable than http methods:

#!/usr/bin/env python3

# pip install --user dnspython

import dns.resolver

resolver1_opendns_ip = False
resolver = dns.resolver.Resolver()
opendns_result = resolver.resolve("resolver1.opendns.com", "A")
for record in opendns_result:
    resolver1_opendns_ip = record.to_text()

if resolver1_opendns_ip:
    resolver.nameservers = [resolver1_opendns_ip]
    myip_result = resolver.resolve("myip.opendns.com", "A")
    for record in myip_result:
        print(f"Your external ip is {record.to_text()}")

This is the python equivalent of dig +short -4 myip.opendns.com @resolver1.opendns.com

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.