furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Jak sprawdzić zewnętrzny adres IP z pomocą Pythona.

2019.02.11 - poniedziałek / kategoria: Python / tagi: python ip /

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:

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)
Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury