Używanie Pythona do wysyłania żądań do katalogu EODATA na NSIS
Ten artykuł zawiera przykłady wysyłania zapytań do katalogów EODATA opisanych w tym artykule Podręcznik API katalogu EOData na NSIS.
Adresy URL używane do wysyłania tych żądań mogą powodować problemy podczas korzystania na przykład z polecenia curl w Bashu. Na przykład następujący adres URL:
https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=not contains(Name,'S2') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-03T00:10:00.000Z
zawiera między innymi znak dolara, spacje i nawiasy. Muszą one być odpowiednio poprzedzone odwrotnym ukośnikiem i/lub zakodowane, aby upewnić się, że żądanie jest prawidłowe. Na przykład Bash może zinterpretować $filter jako zmienną $filter, gdy w rzeczywistości jest ona częścią adresu URL.
W tym artykule omawiamy ten problem poprzez:
wklejenie adresu URL do jednego pliku,
wklejenie treści żądania do innego pliku (w razie potrzeby),
utworzenie kolejnego pliku z kodem w języku Python
a następnie jego wykonanie.
Wymagania wstępne
Nr 1 Zainstalowane środowisko Python
Ten artykuł został napisany dla prostych środowisk Python działających w systemie Ubuntu 22.04 i Windows Server 2022. Inne systemy operacyjne (takie jak Windows 11) i środowiska (takie jak PyCharm) mogą również działać, ale wykracza to ą poza zakres tego artykułu.
Poniższe artykuły zawierają sekcje dotyczące instalacji środowiska Python:
Jeśli twój system to Ubuntu możesz też użyć virtualenvwrapper: Jak zainstalować Python virtualenv lub virtualenvwrapper na NSIS Cloud
Nr 2 Biblioteka Pythona o nazwie requests
Musisz zainstalować pakiet Pythona o nazwie requests. Można to zrobić za pomocą narzędzia pip:
pip install requests
W systemie Ubuntu 22.04 można również zainstalować tę bibliotekę globalnie za pomocą narzędzia apt:
sudo apt install python3-requests
Co zostanie omówione?
Wysyłanie żądań GET
Wysyłanie żądań POST
Wysyłanie żądań GET
Większość linków znalezionych w instrukcjach API to żądania GET, które nie mają żadnej treści.
Utwórz skrypt o nazwie send_get.py i wprowadź do niego następującą treść:
import requests
from requests.utils import requote_uri
# Open URL from file
url = open('link1.txt').read()
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.get(url_encoded_cleared)
print(response.json())
Utwórz plik o nazwie link1.txt w tym samym katalogu co skrypt send_get.py, który zawiera link, do którego chcesz uzyskać dostęp. W tym pliku może być tylko jeden adres URL.
Za pomocą terminala przejdź do katalogu, w którym znajduje się skrypt i plik link1.txt i uruchom skrypt:
python3 send_get.py
python send_get.py
Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.
Przykład 1: OData API
Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):
https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=contains(Name,'S1A') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-21T00:00:00.000Z
Ten link wyszukuje produkty, które:
zawierają w swojej nazwie frazę S1A, oraz
mają datę rozpoczęcia wykrywania późniejszą niż 2022-05-03T00:00:00.000Z i wcześniejszą niż 2022-05-21T00:00:00.000Z.
Powinno to zwrócić 20 najlepszych wyników.
Wykonaj skrypt. W tym przykładzie użyto terminala GNOME i gedit w systemie Ubuntu 22.04. Zwróć uwagę, że gedit opisuje ten kod jako Python 2, mimo że w rzeczywistości jest używany Python 3.
Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.
Przykład 2: Usunięte produkty ODATA API
Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):
https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/DeletedProducts?$filter=not contains(Name,'S1') and DeletionDate gt 2023-04-01T00:00:00.000Z and DeletionDate lt 2023-05-30T23:59:59.999Z&$orderby=DeletionDate
Ten link wyszukuje usunięte produkty, które:
mają nazwę, która nie zawiera frazy S1, oraz
mają datę usunięcia ustawioną na późniejszą niż 2023-04-01T00:00:00.000Z i wcześniejszą niż 2023-05-30T23:59:59.999Z.
Wyniki są sortowane według daty usunięcia. Powinno zostać zwrócone 20 najlepszych wyników.
Wykonaj skrypt:
Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.
Przykład 3: API OpenSearch
Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):
https://catalogue.nsiscloud.polsa.gov.pl/resto/api/collections/Sentinel2/search.json?startDate=2021-07-01&completionDate=2021-07-31
Ten link wyszukuje produkty Sentinel-2, które mają 2021-07-01 i 2021-07-31 jako odpowiednio początkową i końcową datę obserwacji.
Wykonaj skrypt:
Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.
Wysyłanie żądań POST
Utwórz plik o nazwie send_post.py i wprowadź do niego następujący kod:
import requests
import json
from requests.utils import requote_uri
# Open URL from file
url = open('link2.txt').read()
# Open body from file and convert it to JSON object
query = open('body.json')
body = json.load(query)
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.post(url_encoded_cleared, json=body)
print(response.json())
Przedstawiony powyżej skrypt działa podobnie jak skrypt przedstawiony w poprzedniej sekcji.
Adres URL powinien jednak tym razem zostać umieszczony w pliku link2.txt, a nie link1.txt.
Treść żądania należy umieścić w pliku body.json.
Wszystkie pliki wymienione w tej sekcji powinny znajdować się w tym samym katalogu.
Przejdź do tego katalogu za pomocą terminala i uruchom kod w języku Python:
python3 send_post.py
python send_post.py
Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.
Przykład: OData API
Użyjmy linku z sekcji ** Zapytanie według listy** z artykułu
/eodata/OData-API-Manual-for-NSIS-CloudEODATA-Catalogue
aby wyszukiwać wiele nazw produktów jednocześnie:
https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products/OData.CSC.FilterList
Umieść ten link w pliku link2.txt.
Umieść treść znalezioną w tym artykule w pliku body.json:
{
"FilterProducts":
[
{"Name": "S1A_IW_GRDH_1SDV_20141031T161924_20141031T161949_003076_003856_634E.SAFE"},
{"Name": "S3B_SL_1_RBT____20190116T050535_20190116T050835_20190117T125958_0179_021_048_0000_LN2_O_NT_003.SEN3"},
{"Name": "xxxxxxxx.06.tar"}
]
}
Wykonaj skrypt: