Чтобы получить ваш внешний ip, вы можете сделать запрос DNS на сервер opendns со специальным именем хоста "myip.opendns.com":
from subprocess import check_output
ip = check_output(["dig", "+short", "@resolver1.opendns.com",
"myip.opendns.com"]).decode().strip()
В Windows вы можете попробовать nslookup
.
В Python stdlib отсутствует модуль dns, который позволял бы указывать пользовательский dns-сервер. Вы можете использовать сторонние библиотеки, например, Twisted , чтобы сделать запрос DNS:
from twisted.internet import task # $ pip install twisted
from twisted.names.client import Resolver
from twisted.python.util import println
def main(reactor):
opendns_resolvers = [("208.67.222.222", 53), ("208.67.220.220", 53)]
resolver = Resolver(servers=opendns_resolvers, reactor=reactor)
# use magical hostname to get our public ip
return resolver.getHostByName('myip.opendns.com').addCallback(println)
task.react(main)
Вот то же самое, используя dnspython
library :
import dns.resolver # $ pip install dnspython
resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = ["208.67.222.222", "208.67.220.220"]
print(resolver.query('myip.opendns.com')[0])