Pobranie tabeli kursów walut

0

Cześć, czy wie ktoś, jak pobrać aktualną tabelę kursów walut?

0

możesz wykorzystać kanał rss, na potrzeby jednego serwisu nawet znazłem taki: http://lokomotywa.pl/waluty/rss_nw_tabela_a.php, później tylko jakiś parser xml i po robocie ;)
Jeżeli ta tabela Ciebie nie interesuje to proponuję wejść na stronę i zobaczyć która bo jest ich kilka, ta konkretnie odnosi się do kursów średnich NBP

Jeden nawet jest wbudowany w delphi7, nie pamiętam nazwy, dawno nie programowałem w delphiaku od dłuższego czasu tylko php, a pamiętam, że był on bardzo wygodny w korzystaniu.

Chyba na 4p artykuł o xml i tym komponencie jest(był).

0

NBP udostępnia w XML-u kursy walut, potem TXMLDocument czy inny parser XML i gotowe.

0
Ktos napisał(a)

NBP udostępnia w XML-u kursy walut(...)

Szukałem kiedyś na stronie NBP i jakoś nie było :>
Byłbym wdzięczny za jakiś namiar ;)

0

http://nbp.pl/Kursy/KursyA.html i na samym dole jest link do czegoś takiego jak http://nbp.pl/Kursy/xml/a117z060619.xml - to chyba to :)

0
Ktos napisał(a)

http://nbp.pl/Kursy/KursyA.html i na samym dole jest link do czegoś takiego jak http://nbp.pl/Kursy/xml/a117z060619.xml - to chyba to :)

Rozumiem, że:

  1. Muszę to zapisać na dysk
  2. Nazewnictwo pliku jest zawsze: a177zXXYYZZ.xml
    XX - dzień
    YY - miesiąc
    ZZ - rok
    ??

[dopisane]
I jeszcze jedno pytanie. Czy NBP umieszczza gdzieś, z jakiego dnia jest tabela do pobrania? Bo, jeśli nie, to plik musiałbym pobierać codziennie. Bo jeśli powiedzmy nie będę pobierał przez tydzień, musiałbym potem sprawdzać, najnowszy plik, czy istnieje...

0

Ad.1.
No niestety plik trzeba pobrać, nawet jeżeli prog miałby działac tylko online, wtedy można wykorzystać temp.

Ad.2.
W moim kanale nazwa pliku jest stała, jak to się odbywa w NBP nie wiem bo dziś zobaczyłem dopiero. Moim zdaniem ten nr 117 w nazwie też coś oznacza.

Co do daty publikacji to, otwórz ten plik xml z NBP i zobacz co jest na początku:

<?xml version="1.0" encoding="ISO-8859-2"?>
<tabela_kursow typ="A">
   <numer_tabeli>117/A/NBP/2006</numer_tabeli>
   <data_publikacji>2006-06-19</data_publikacji>
   <pozycja>
      <nazwa_waluty>dolar amerykański</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>USD</kod_waluty>

      <kurs_sredni>3,2104</kurs_sredni>
   </pozycja>
0
mephir napisał(a)

Ad.2.
Co do daty publikacji to, otwórz ten plik xml z NBP i zobacz co jest na początku:

Nie o to mi chodziło.
Chodziło mi o taką rzecz, że sprawdzam gdzieś datę aktualizacji, porównuje ze swoją bazą, jeśli moja baza jest starsza, to wtedy pobieram plik i go importuje, a jeśli nie, to nic nie robię.
Napisałem do NBP, ale nikt nie odpisuje i wątpię, żeby ktokolwiek odpisał.

0

Ciężki orzech do zgryzienia z tym pliczkiem z NBP jest, ponieważ podejrzewam, że ta liczba 117 też się zmienia, to byś musiał wchodzić na stronę tą co podał Ktos i sprawdzać jak nazywa się plik, a to jest karkołomne rozwiązanie.
Ale sprawe masz prostą kiedy masz zmianę kursów. A mianowicie jak pliku tego nie ma to znaczy, że jest nowy i wtedy wchodzisz na tą stronę wyciągasz nową nazwe pliku i pobierasz. Już nie pamiętam kiedy Tabela A jest uaktualniania.
Ops. Właśnie jest nowa i zamiast 117 ma 118 więc ciągniesz na tej zasadzie, ale stary plik również został na dysku ;( Więc to odpada.

Ale jest jeszcze wyjście. Wątpie aby kursy walut mogły być stałe choćby przez dwa dni, więc zawsze możesz pobierać ten plik(http://nbp.pl/Kursy/KursyA.html) liczyć sume kontrolną i porównywać z sumą starego.
Jak się różnią to wyciągasz nazwę pliku i pobierasz ;)

Ewentualnie próbujesz pobrać plik (np. dla teraz) http://nbp.pl/Kursy/xml/a119z060621.xml, czyli z jutra jak go nie będzie to wsio - znaczy, że nie ma nowych kursów. I to chyba najprostsze rozwiązanie :>

0

Czy ja wiem, czy taki trudny :| na stronie http://nbp.pl/Kursy/KursyA.html masz tekst: "
Tabela kursów nr 118/A/NBP/2006 z dnia 2006-06-20" <- tutaj masz wszystko co potrzebne aby usyskać nazwę pliku. Wystarczy pobrać zawartość strony i np. funkcją Pos sprawdzić położenie tekstu "Tabela kursów nr". Potem to już tylko kopiowanie danych: czyli tej 118, tego A, przelatujesz PosEx'em na słowo "z dnia" i kopiojesz odpowedni datę. Na koniec wszystko sklejasz i dostajesz swoj uprawgniony link :)

0

A można od razu wyciągnąć nazwę pliku ;)

</td></tr>
<tr><td class="file"><br /><a href="xml/a118z060620.xml">powyższa tabela w formacie .XML</a><br /><br /></td></tr>
</table>
</div>
0

Witam

Jeśli chodzi o pobieranie kursów walut z internetu, powinniśmy zajrzeć na stronkę www.nbp.pl. Pobieranie aktualnego kursu walut nie powinno nikomu przysporzyć problemów, tak jak napisał mój szanowny przedmówca wystarczy tylko otworzyć stronkę www.nbp.pl/Kursy/KursyA.html, wydostać stamtąd nazwę bieżącego pliku XML i za pomocą parsera odczytać dane. A co w przypadku kiedy potrzebujemy pobrać dane o walutach z jakiegoś przedziału ? Musimy znać numer tabeli NBP oraz datę jej publikacji. Numer tabeli zmienia się kolejno dla wszystkich dni roboczych, natomiast jeśli jest sobota, niedziela lub dzień świąteczny wówczas numer tabeli się nie zmienia. Najprostszym chyba sposobem (być może nie najlepszym i najszybszym) jest po prostu przeszukanie numerów tabel od początku roku. Każdy plik zapisany na serwerze NBP przechowujący dane tabeli kursowej ma następujący format:
aNNNzRRMMDD.xml gdzie NNN to trójznakowy numer tabeli, RR to rok w postaci dwucyfrowej, MM to miesiąc w postaci dwucyfrowej, i DD to dzień w postaci dwucyfrowej.

Potrzebujemy do tego kilku zmiennych:
Integer:
N - numer tabeli
Y - rok
M - miesiąc
D - dzień

TDate:
data - będzie nam służyła do iteracji
datap - data początkowa
datak - data końcowa

String:
xml - oznacza nazwę pliku XML na serverze NBP.

Odpalamy nowy projekt w Delphi, na formularz rzucamy 2 komponenty DateTimePicker (aby umożliwić wybranie daty początkowej i końcowej dla których będziemy pobierać dane o walutach. Komponent TMemo, do którego będziemy zapisywali nazwy plików XML w celu ich późniejszego wykorzystania, oraz przycisk TButton. Poniżej znajdziecie cały kod w Delphi.

unit unit_Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, DateUtils, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    dtpPocz: TDateTimePicker;
    dtpKon: TDateTimePicker;
    memXML: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    btnPobierz: TButton;
    IdHTTP: TIdHTTP;
    procedure btnPobierzClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnPobierzClick(Sender: TObject);
var data,datap,datak:TDate;
    n,y,m,d:integer;
    xml:string;
begin
  // Czyścimy zawartość komponentu TMemo
  memXML.Lines.Clear;
  // Pobieramy datę początkową z komponentu DateTimePicker
  datap:=dtpPocz.Date;
  // Pobieramy datę końcową z komponentu DateTimePicker
  datak:=dtpKon.Date;
  // Ustawiamy numer tabeli na 1
  n:=1;
  // Pobieramy początkowy rok od którego zaczniemy przeszukwanie tabel
  y:=YearOf(datap);
  // Ustawiamy miesiąc i dzień na 1
  m:=1;
  d:=1;
  // Konstruujemy datę na początek roku (trochę nienajlepsze rozwiązanie ale :))
  data:=StrToDate(IntToStr(d)+'-'+IntToStr(m)+'-'+IntToStr(y));
  // Biegniemy dopóki data bieżąca jest mniejsza od daty końcowej
  while data<=datak do
    begin
      // Tutaj zaczynamy konstruować nazwę pliku
      xml:='a';
      // Numer tabeli w postaci XXX
      if n<10 then
        xml:=xml+'00'+IntToStr(n)
      else if (n>=10) and (n<100) then
        xml:=xml+'0'+IntToStr(n)
      else
        xml:=xml+IntToStr(n);
      xml:=xml+'z';
      // Rok w postaci XX
      xml:=xml+Copy(IntToStr(y),3,2);
      // Miesiąc w postaci XX
      if m<10 then
        xml:=xml+'0'+IntToStr(m)
      else
        xml:=xml+IntToStr(m);
      // Dzień w postaci XX
      if d<10 then
        xml:=xml+'0'+IntToStr(d)
      else
        xml:=xml+IntToStr(d);
      // Na koniec rozszerzenie .xml
      xml:=xml+'.xml';

      try
        // Próbujemy pobrać plik xml za pomocą komponentu Indy HTTP
        idHTTP.Get('http://www.nbp.pl/Kursy/xml/'+xml);
        // Jeśli plik istnieje i data bieżąca zawiera się w naszym przedziale to dodajemy go do listy
        if data>=datap then
          memXML.Lines.Add(xml);
      except
        // Wystąpił błąd: nie znaleziono pliku na serwerze, co może świadczyć o tym że jest to dzień świąteczny, sobota lub niedziela dlatego nie zwiększamy numeru tabeli tylko datę bieżącą
        data:=data+1;
        // Poniższy warunek pozwala przeskoczyć jeśli zmienił sie rok
        if y<YearOf(data) then
          n:=1;
        y:=YearOf(data);
        m:=MonthOf(data);
        d:=DayOf(data);
        Continue;
      end;
        // Jeśli wszystko było w porządku i znaleźliśmy plik tabeli to wtedy zwiększamy numer tabeli i datę bieżącą
        n:=n+1;
        data:=data+1;
        if y<YearOf(data) then
          n:=1;        
        y:=YearOf(data);
        m:=MonthOf(data);
        d:=DayOf(data);
    end;
end;

end.

Po zakończeniu wykonywania kodu, na komponencie TMemo, mamy gotową listę plików XML dla wszystkich tabel kursowych z wybranego przez nas przediału czasowego. Teraz odpalamy tylko kompoment np. TXMLDocument, podajemy kolejno nazwy plików XML (pamiętając o dodaniu adresu serwera NBP: http://www.nbp.pl/Kursy/xml/naszplik.xml) i wyciągamy wszystkie interesujące nas dane:) Chciałbym przypomnieć że na serwerze NBP znajdują sie tylko kursy od początku 2002 roku :)

Mam nadzieję że komuś to się przyda w przyszłości :)

0

Witam daje ci linka do programu który kiedyś napisałem na własne potrzeby pobiera wartości kursów z NBP i przelicza podaną kwotę na inne waluty. Może ci się przyda.

http://www6.zippyshare.com/v/12039082/file.html

program <ort>kożysta </ort>z następujących komponentów (dodatkowo):

  • janXMLParser2
  • adpEdit
  • EasyBox
  • Indy 9
0
PcSA napisał(a)

Czy ja wiem, czy taki trudny :| na stronie http://nbp.pl/Kursy/KursyA.html masz tekst: "
Tabela kursów nr 118/A/NBP/2006 z dnia 2006-06-20" <- tutaj masz wszystko co potrzebne aby usyskać nazwę pliku. Wystarczy pobrać zawartość strony i np. funkcją Pos sprawdzić położenie tekstu "Tabela kursów nr". Potem to już tylko kopiowanie danych: czyli tej 118, tego A, przelatujesz PosEx'em na słowo "z dnia" i kopiojesz odpowedni datę. Na koniec wszystko sklejasz i dostajesz swoj uprawgniony link :)

No nie bardzo... np Tabela kursów nr 1/A/NBP.... ma nazwę pliku a001......xml ale tabela nr 52 ma nazwę pliku a52....xml.
proponuję po ściągnięciu pliku html na dysk odszukać fragment i z niego pobrać nazwę pliku XML.
Ja tak robię

0

Z tego co patrzyłem to jest taki magiczny plik dir.txt w którym jest wykaz wszystkich plików z kursami - pobierasz go, odfiltrujesz te które są niepotrzebne (nie mające a na początku) i masz wykaz wszystkich plików z kursami. A że w nazwie zakodowana jest data z kiedy jest kurs to nawet nie trzeba każdego otwierać aż wybierzesz właściwy...

0

Program napisany we FreePascalu i to oldschoolowo pod konsolę, ale proszę spojrzeć na funkcje PobierzWaluty i ParsujXML:

{$apptype console}
{$mode objfpc}{$h-}
uses
  classes, httpsend, dom, xmlread, sysutils, xmldecoders, crt;

type PWaluta=^TWaluta;
     TWaluta=record
       nazwa:string;
       przelicznik:longint;
       kod_waluty:string[3];
       kurs_sredni:longint; // setne grosza
     end;

type PKursy=^TKursy;
     TKursy=record
       numer_tabeli:string;
       data_publikacji:string;
       ile_walut:longint;
       waluty:array of TWaluta;
     end;

procedure WyswietlWalute(const waluta:TWaluta);
begin
  with waluta do
  begin
    write('        ');
    textcolor(yellow);     write(kod_waluty);
    textcolor(lightgreen); write(' ',nazwa:25);
    textcolor(lightgray);  write(' : ');
    textcolor(yellow);     write(kurs_sredni/10000:0:4);
    textcolor(lightgray);  write(' : ');
    textcolor(lightgreen); writeln(przelicznik:5);
    textcolor(lightgray);
  end;
end;

procedure Klawisz;
begin
  writeln('Naciśnij klawisz...');
  readkey;
end;

procedure WyswietlWaluty(const kursy:TKursy);
var i:integer;
begin
  writeln;
  with kursy do
  begin
    textcolor(lightgray); write('Tabela kursów średnich numer ');
    textcolor(yellow);    write(numer_tabeli);
    textcolor(lightgray); write(' z dnia ');
    textcolor(yellow);    writeln(data_publikacji);
    textcolor(lightgray); write('Łącznie ');
    textcolor(yellow);    write(ile_walut);
    textcolor(lightgray); writeln(' walut.');
    writeln;
    for i:=0 to ile_walut-1 do
    begin
      if i mod 20 = 19 then Klawisz;
      WyswietlWalute(kursy.waluty[i]);
    end;
  end;
end;

procedure ZwolnijWaluty(const kursy:TKursy);
begin
  finalize(kursy.waluty);
end;

function ParsujXML(strxml:TStream):TKursy;
var xml:TXMLDocument;
    node:TDOMNode;
    nodes:TDOMNodeList;
    i:integer;
    tmp:string;
begin
  ReadXMLFile(xml,strxml);
  node:=xml.documentelement;
  nodes:=xml.getelementsbytagname('pozycja');
  result.numer_tabeli:=node.findnode('numer_tabeli').firstchild.nodevalue;
  result.data_publikacji:=node.findnode('data_publikacji').firstchild.nodevalue;
  result.ile_walut:=nodes.count;
  setlength(result.waluty,result.ile_walut);
  for i:=0 to nodes.count-1 do
    with result.waluty[i] do
    begin
      nazwa:=nodes[i].findnode('nazwa_waluty').firstchild.nodevalue;
      przelicznik:=strtoint(nodes[i].findnode('przelicznik').firstchild.nodevalue);
      kod_waluty:=nodes[i].findnode('kod_waluty').firstchild.nodevalue;
      tmp:=nodes[i].findnode('kurs_sredni').firstchild.nodevalue;
      delete(tmp,pos(',',tmp),1);
      kurs_sredni:=strtoint(tmp);
    end;
end;

function PobierzWaluty(var res:TKursy):boolean;
const adres='http://nbp.pl/Kursy/xml/';
      plik_dir='dir.txt';
      ext_xml='.xml';
var HTTP1,HTTP2:THTTPSend;
    list:TStringList;
    aktualny_plik:string;
begin
  result:=false;
  res.numer_tabeli:='NULL';
  res.data_publikacji:='0000-00-00';
  res.ile_walut:=0;
  res.waluty:=nil;
  HTTP1:=THTTPSend.Create;
  HTTP2:=THTTPSend.Create;
  list:=TStringList.Create;
  if HTTP1.HTTPMethod('GET',adres+plik_dir) then
  begin
    list.loadfromstream(http1.document);
    aktualny_plik:=list[list.count-1];
    if HTTP2.HTTPMethod('GET',adres+aktualny_plik+ext_xml) then
    begin
      res:=ParsujXML(http2.document);
      result:=true;
    end else writeln('błąd podczas pobierania kursów: ',http2.resultcode);
  end else writeln('błąd podczas pobierania listy: ',http1.resultcode);
  list.Free;
  HTTP1.Free;
  HTTP2.Free;
end;

var Waluty:TKursy;

begin
  textcolor(lightgray);
  textbackground(black);
  clrscr;
  if PobierzWaluty(Waluty) then
  begin
    WyswietlWaluty(Waluty);
    ZwolnijWaluty(Waluty);
  end;
  readkey;
end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1