Jak sprawdzić zewnętrzny adres IP z pomocą Pythona.
Aby sprawdzić swój zewnętrzny adres IP można wykorzystać strony WWW, które taką informację udostępniają w postaci zwykłe tekstu lub JSON zamiast strony pełnej HTML, na której trzeba szukać IP za pomocą np. BeautifulSoup
lub lxml
)
Przykładowe strony, które takie dane przesyłają to:
- httpbin.org (JSON: https://httpbin.org/ip)
- myip.com (JSON: https://api.myip.com)
- ifconfig.me (JSON: https://ifconfig.me/all.json, text: ifconfig.me/ip)
Pierwsza ze stron jest przydatna nie tylko do pobierania IP ale też do testowania najróżniejszych zapytań (requestów) i sprawdzania jakie dane wysłaliśmy.
Strony tego typu raczej nie wymagają specjalnych ustawień (np. nagłówków USER-AGENT
) lub wysyłania danych POST
więc wystarczy do tego standardowy moduł urllib.request
i nie trzeba w tym celu instalować modułu requests
.
import urllib.request
import json
#----------------------------------------------------------------------
url = 'https://httpbin.org/ip'
response = urllib.request.urlopen(url)
data = response.read()
data = json.loads(data)
ip = data['origin']
print(ip)
#----------------------------------------------------------------------
url = 'https://api.myip.com'
response = urllib.request.urlopen(url)
data = response.read()
data = json.loads(data)
ip = data['ip']
print(ip)
#----------------------------------------------------------------------
url = 'https://ifconfig.me/all.json'
response = urllib.request.urlopen(url)
data = response.read()
data = json.loads(data)
ip = data['ip_addr']
print(ip)
#----------------------------------------------------------------------
url = 'https://ifconfig.me/ip'
response = urllib.request.urlopen(url)
data = response.read()
ip = data.decode()
print(ip)
Pierwsze trzy przykłady otrzymują dane jako JSON i (oprócz URL) różnią się tylko nazwą pola w słowniku data
.
Ostatni przykład otrzymuje zwykły tekst z samym IP - a właściwie otrzymuje ciąg bajtów, który trzeba samemu dekodować do tekstu w unicode.
Ponieważ stron przesyła dane jako UTF-8
więc wystarczy użyć .decode()
z domyślnym argumentem.
JSON - load() i loads()
Moduł json
ma dwie podobne funcje do zamiany danych JSON na pythonowy słownik: loads()
i load()
.
Pierwsza (loads
) jako parametr oczekuje tekstu (stringu - i stąd litera s
w jego nazwie) lub ciągu bajtów.
Dlatego też trzeba wywołać .read()
dla response
aby pobrać tekst (ciąg bajtów).
data = response.read()
data = json.loads(data)
Druga (load
) jako parametr oczekuje uchwytu do pliku (file handler
) lub obiektu pliko-podobnego (file-like object
), który zawiera metodę read()
i wtedy nie trzeba wywoływac .read()
bo load()
samo za nas to zrobi.
data = json.load(response)
Requests
Gdyby ktoś jednak wolał używać modułu requests
to kod wyglądał by tak
import requests
#----------------------------------------------------------------------
url = 'https://httpbin.org/ip'
response = requests.get(url)
data = response.json()
ip = data['origin']
print(ip)
#----------------------------------------------------------------------
url = 'https://api.myip.com'
response = requests.get(url)
data = response.json()
ip = data['ip']
print(ip)
#----------------------------------------------------------------------
url = 'https://ifconfig.me/all.json'
response = requests.get(url)
data = response.json()
ip = data['ip_addr']
print(ip)
#----------------------------------------------------------------------
url = 'https://ifconfig.me/ip'
response = requests.get(url)
ip = response.text
print(ip)
Buy a Coffee