e-ogloszenia.info

Etykiety

niedziela, 24 lipca 2016

Jak automatycznie pobierać kursy walut NBP ?

Automatyczne pobieranie kursów poszczególnych walut z sieci to niekiedy złożone zadanie, z którym jednak każdy zawodowy twórca systemów informatycznych prędzej czy później musi się zmierzyć.
W niniejszym artykule, który przeznaczony jest dla średnio zaawansowanych i zaawansowanych programistów, chciałbym przestawić uproszczoną wersję opracowanej przeze mnie i wielokrotnie zastosowanej w wielu środowiskach produkcyjnych, metodę pobierania z sieci średniego kursu danej waluty z wybranej daty oraz automatycznego wstawiania tej wartości do formularza HTML w aplikacjach web.

Kursy walut z API NBP
Kursy walut dla aplikacji web - API NBP - Jak to działa


Jak dobrze wiadomo, w aplikacjach o charakterze finansowym, bądź biznesowym, dość często pojawia się konieczność wpisywania aktualnego kursu danej waluty do przetwarzanego na serwerze formularza. Po co więc za każdym razem wchodzić na witrynę Narodowego Banku Polskiego NBP, szukać tam tabeli kursów z danego dnia, odczytywać z niej wartości i przepisywać, bądź kopiować i wklejać do formularza, skoro można w sposób w pełni zautomatyzowany pobierać wartości kursów i wstawiać je do fomularza web za jednym wciśnięciem przycisku? Zautomatyzowane rozwiązanie może okazać się bardzo przydatne, szczególnie w przypadku konieczności codziennego, częstego odczytu wartości kursów walut, np. w aplikacjach web związanych z eksportem i fakturowaniem.
Przedstawiona tutaj metoda automatycznego pobierania średniego kursu Euro, obowiązującego dla konkretnej daty, wymaga zastosowania zarówno skryptów jQuery - po stronie przeglądarki - jak i skryptów php po stronie serwera oraz uproszczonego, przykładowego kodu html, koniecznego do osadzenia w nim formularza.
Chciałbym z góry zaznaczyć, że działającym przykładem zastosowania przedstawionego tutaj rozwiązania jest witryna Kursy Walut mojego autorstwa.

Założenia wstępne


Przedstawiony w niniejszym artykule przykład jest zupełnie "nagi" i ma służyć jedynie jako materiał szkoleniowy. Nie zastosowałem w nim żadnych dodatkowych funkcji, oprócz tych, które są niezbędne do zwyczjnego zadziałania mechanizmu. Aby jednak mechanizm mógł mieć zastosowanie w środowisku produkcyjnym, powinien on zostać opatrzony przez programistę w należyte środki bezpieczeńśtwa.

Skąd pobierać kursy walut?


Jedynym wiarygodnym źródłem kursów walut jest Narodowy Bank Polski. Jak powszechnie wiadomo, NBP od bardzo dawna udostępnia na swojej oficjalnej witrynie tabele kursów walut. Od dość niedawna jednak została uruchomiona dodatkowa poddomena NBP http://api.nbp.pl/, pod którą są umieszczane kursy walut w formatach .xml oraz .json dla celów programistycznych. Stąd właśnie będziemy pobierać kursy dla celów przedstawionego tutaj przykładu. Pliki API NBP są generowane po stronie serwera NBP, w sposób zależny od zapytania HTTP wysłanego przez klienta. Warto wstępnie zapoznać się z różnymi, możliwymi parametrami zapytań: http://api.nbp.pl/#kursyParams. Wstępne zapoznanie się z instrukcjami znajdującymi się w witrynie API NBP znacznie ułatwi zrozumienie mojego przykładu.

Jak to działa?


Pod adresem http://api.nbp.pl/api/exchangerates/rates/A/EUR/ znajdują się dane aktualnie obowiązującego średniego kursu Euro. Aby jednak uzyskać informacje dotyczące kursu Euro dla konkretnie wybranej daty, należy dołączyć datę do zapytania, np. http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22
Należy zwrócić uwagę na fakt, iż możemy w ten sposób uzyskać pliki z danymi kursów, zarówno w formacie JSON jak i XML. Aby zrobiło się trochę ciekawiej, w niniejszym przykładzie posługuję się formatem XML!

Aby uzyskać informacje o kursach w formacie XML należy dodać odpowiedni parametr do naszego przykładowego zapytania: http://api.nbp.pl/api/exchangerates/rates/A/EUR/2016-07-22?format=xml

Gdy klikamy w przycisk "Pobierz i wstaw" w formularzu, którego źródło HTML przedstawiam poniżej, osadzony w sekcji HEAD kod jQuery wywołuje skrypt php api_nbp_tab_A_xml.php, przekazując mu interesującą nas datę w zmiennej $_POST. Skrypt php sprawdza czy szukany przez nas plik xml istnieje w lokalnym katalogu, a jeśli nie, to stara się go uzyskać ze zdalnego serwera NBP. Jeśli plik ze średnim kursem naszej przykładowej waluty, dla wybranej daty, nie został już uprzednio skopiowany na nasz lokalny katalog, skrypt php api_nbp_tab_A_xml.php stara się odnaleźć takowy zdalny plik kursu średniego Euro dla wybranej przez nas daty, wywołując odpowiednie zapytanie HTTP. Jeśli plik zostaje odnaleziony na zdalnym serwerze, skrypt php kopiuje go do lokalnego katalogu /xml, jeśli natomiast plik nie zostaje odnaleziony, wówczas skrypt zwraca odpowiedni komunikat.

W kolejnym etapie skrypt jQuery wysyła lokalne zapytanie XMLHttpRequest, tworząc objekt tej klasy, w celu odniesienia się do ewentualnie skopiowanego lokalnego pliku, po czym, jeśli odpowiedź lokalnego sewera jest pozytywna i plik jest "gotowy" - czyli mamy:
xhttp.readyState == 4 && xhttp.status == 200
, wówczas następuje przetwarzanie zawartości pliku poprzez funkcje getRates() i wydobywanie z niego interesujących nas wartości, które są wstawiane do formularza poprzez:
$("#kurs_euro1").val(rateInt);
$("#kurs_euro2").val(rateDec);
$("#kurs-result").html(tab);
$("#tabela_nbp").val(tab);


Formularz HTML




CSS



Kod jQuery




Skrypt PHP


Oto zawartość wywoływanego przez powyższy kod jQuery skryptu api_nbp_tab_A_xml.php:
define('XML_FILES_PATH', $_SERVER['DOCUMENT_ROOT']."xml/");

function isValidDate($date) {
$d = DateTime::createFromFormat('Y-m-d', $date);
return $d && $d->format('Y-m-d') === $date;
}

function URL_exists($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}

// Jeżeli data jest prawidłowa
if (isValidDate($_POST['data'])) {

// Jeżeli plik xml jeszcze nie istnieje w lokalnym katralogu
if(!file_exists(XML_FILES_PATH.$_POST['data'].".xml")) {

// Jeżeli istnieje dokument xml
if(URL_exists("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml")) copy("http://api.nbp.pl/api/exchangerates/rates/A/EUR/".$_POST['data']."?format=xml", XML_FILES_PATH.$_POST['data'].".xml");
else die('Tabela nie została odnaleziona!');

if (file_exists(XML_FILES_PATH.$_POST['data'].".xml")) die('Zaimportowano tabelę!'); else die('Proba zaimportowania tabeli nie powiodła się!');

} else die('Tabela istnieje!');

} else die('Proszę wybrać datę!'); -


Działający przykład


Działający przykład przedstawionej tutaj metody można przetestować pod adresem http://kursy-walut.info


Czy artykuł okazał się pomocny?


Jeśli artykuł spodobał się lub okazał się pomocny uprzejmie proszę o udostępnianie go w sieci. W razie pytań służę pomocą. Proszę o komentarze.

9 komentarzy:

  1. Witam,

    czy jest możliwość udostępnienia skryptu w takiej formie, by działał na stronie www wyświetlając jedynie wskazane waluty na aktualny dzień? Przygotowuję stronę dla banku, ale nie jestem programistą i niezbyt dobrze czuje się w skryptach.

    OdpowiedzUsuń
    Odpowiedzi
    1. Taki skrypt kiedyś zrobiłem i znajduje się on na stronie kursy-walut.info. W prawej bocznej sekcji strony głównej jest możliwość wybrania waluty i daty ;-) Czy o coś takiego Ci chodzi? Jeśli tak to daj znać, a w wolnym czasie postaram się Ci to jakoś udostępnić i wyjaśnić... Pozdrawiam

      Usuń
    2. Hej, dziękuję a odpowiedź, w dodatku tak szybką :) Chodzi mi o yświetlanie np. wybranych kursów (powiedzmy USD, EUR, GPB) na podstawowej stronie i możliwość kliknięcia w tabelę z wszystkimi kursami - nawet takimi, jak na wyświetlane jest to w centrum strony kursy-walut.info. Nie chciałbym klikać w pobranie tabeli, a wyświetlać od razu tabelę na aktualny dzień.

      Usuń
    3. W takim razie masz wszystko dokładnie opisane w tym artykule. Dodatkowo warto sobie poczytać pomoc dotyczącą API NBP na stronie nbp.pl. W witrynie kursy-walut.info zastosowałem opisane tutaj podstawy działania mechanizmu. Skrypty są tam jednak długie i złożone, tabele są pobierane automatycznie i wrzucane do odpowiednich katalogów, które też są tworzone automatycznie według potrzeby. Do tego stosuję zarówno skrypty PHP, jak i JQuery, a także metody AJAX. Jeśli masz jakieś konkretne pytania to chętnie postaram się pomóc.

      Usuń
    4. Czy mógłbym prosić o zuploadowanie gdzieś pliku PHP jako cały plik? :)

      Usuń
    5. To nie jest takie proste... Witryna składa się z dużej ilości plików php, wykonujących różne czynności, a także złożonego kodu AJAX. Wszystkie pliki sa logicznie powiązane z całą funkcjonalnością witryny i z ustawieniami wstępnymi, w których są np. definiowane stale itp. Funkcjonalność witryny zapewniona jest też odpowiednią strukturą drzewa katalogów, w których zapisywane są automatycznie ściągane z serwisu NBP tabele w formacie XML, skąd są one następnie odczytywane przez skrypty Jquery. Sam plik php nic Ci nie pomoże. Musisz zaprojektować i wdrożyć całą funkcjonalność, na której Ci zależy. Moja witryna dodatkowo stosuje szablony PEAR HTML ITX, więc skrypty php z nich korzystają. Nie ma konkretnego pliku php, który wykona całe zadanie o którym pisałeś. To na czym Tobie zależy jest dokładnie opisane w tym artykule. Z czym masz konkretnie problem? Napisz, to postaram się pomóc.

      Usuń
    6. W prawym widoku głównej strony wybierasz walutę i datę, wówczas uruchamia się skrypt JQuery, który możesz podejrzeć w kodzie źródłowym strony. Co on robi? Otóż wywołuje skrypt PHP, który sprawdza czy tabela dla wybranej waluty i daty została już pobrana z serwera NBP, a jeśi nie to ją pobiera. Następnie, po zakończeniu działania skrypty PHP, ten sam skrypt JQuery wyświetla na stronie wartość dla waluty i daty. Czy skrypt PHP, który sprawdza czy tabela istnieje, a ewentualnie pobiera ją z NBP i zapisuje w odpowiedniej lokalizacji rozwiąże Twói problem? Jeśli tak to daj znać. To jest krótki i prosty skrypcik, więc mogę go tutaj gdzieś umieścić...

      Usuń
    7. Szukałem po prostu rozwiązania typu "kopiuj-wklej", niestety moja wiedza odnośnie skryptów JS i JQuery nie jest tak zaawansowana, by móc wykonać i zrozumieć własny skrypt. Całość chciałem osadzić w czystym HTML'u i w wersji zakodowanej pod WordPress. Na marginesie gratuluję efektu końcowego skryptu, który wygląda świetnie :)

      Usuń
    8. Nie da się w tak prosty sposób tego zrobić ;-) Skoro tworzysz w WordPress to spróbuj którejś w wtyczek z kursami walut ;-) Np. https://wordpress.org/plugins/kursy-walut-nbp/

      Usuń

Dodaj komentarz