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)
furas.pl