Jak stáhnout kurzy měn pomocí skriptu v PHP?

phpNa tomto webu jsme se několikrát zabývali možnostmi, jak jednoduché věci (jako je výpočet indikátorů nebo exekuce obchodů přes API) naprogramovat. Ve VB.NET, protože to je můj „primární“ programovací jazyk. Není ale jediný. Dnes (bude to opravdu primitivní) si ukážeme, jak stáhnout kurzovní lístek, resp. vytáhnout z něj příslušná data pomocí nástrojů, které nám nabízí programovací jazyk PHP.

Co je PHP

Stručně řečeno je PHP skriptovací (nebo programovací) jazyk, který se často používá na webu. Zájemce o hlubší studium můžu odkázat na seriál, který vycházel na webu linuxsoft.cz, případně na špičkový blog v češtině (http://php.vrana.cz/), případně na oficiální dokumentaci.

Pozn.: Ten můj seriál na linuxsoftu je 12 let starý, tak to prosím berte s rezervou. principy jistě platí, ale ten jazyk už je mnohem dál.

Kde brát kurzovní lístek

Kurzovní lístek dnes vydává a na internetu nabízí ke stažení každá lepší banka. Podstatné pro jednoduché zpracování v PHP je najít kurzovní lístek, který je v nějakém standardizovaném formátu. Standardizovaným formátem přitom myslíme například HTML, XML nebo (a to je úplně nejlepší varianta) prostý text.

Jako prostý text zveřejňuje kurzovní lístek třeba ČNB, ukázka je tady, nebo ČSOB, ukázka je tady. Postup, jak z kurzovního lístku dostat hodnotu – řekněme – kurzu USD „devizy střed“ tedy spočívá v následujícím:

  1. Stáhnout textový soubor s kurzovním lístkem
  2. Vytahat z něj hodnotu, kterou potřebujeme
  3. Tuto hodnotu dále zpracovat (já ji jen vypíšu do prohlížeče)

Jak na to v PHP

Následuje kód v PHP i s komentáři, snad srozumitelný:

<?
function kurzmeny () {
  // adresa URL s kurzy
  $url="https://www.csob.cz/portal/lide/produkty/kurzovni-listky/kurzovni-listek/-/date/kurzy.txt"; 
  // tu stáhneme a umístíme do pole $radky (co řádek, to prvek pole)
  $radky = file($url);  
  // najdeme řádek resp. řádky, kde se vyskytuje výraz "USD"
  $matches = preg_grep("/USD/", $radky);
  // najdeme první z nich (my víme, že v našem případě bude jeden)
  // ale počítač je blbej a neví to
  $match=array_values($matches)[0];        
  // jde o text rozdělený středníky, rozsekáme po střednících
  $obsahradku = explode(";", $match);
  // sedmý prvek je údaj "devizy střed"
  // ale PHP čísluje od nuly, takže "šestý"
  $kurz = $obsahradku[6];
  // a ten vrátíme
  return ($kurz);  
}
echo kurzmeny();
?>

Kód skutečně funguje, má pouze jednu nevýhodu, a to tu, že při každém dotazu skript stahuje celý soubor s kurzy znovu. V praxi to moc nevadí, protože ten soubor je malý, nicméně abychom bance ulehčili a svůj kód zrychlili, lze implementovat i nějakou tu cache.

To by se dělalo tak, že při prvním stažení se soubor někam uloží (stačí na disk) a při dalším spuštění se nejprve podíváme, jestli už soubor není na disku. Pokud tam je a není příliš starý, použijeme údaje ze souboru, pokud JE starý, stáhneme znovu z webu.

<?
function kurzmeny () { 
  // takže, z cache nebo z webu?
  $cachetime = 60*60; // 1 hodina
  // místo na disku pro uložení souboru
  $cachefile = "kurzy.txt";
  // jestliže soubor existuje a není moc starý
  if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) { 
    // v tom případě z cache
    $radky = file($cachefile);
  }
  else {  
    // buď je starý, nebo vůbec neexistuje, nezbývá než z webu
    $url="https://www.csob.cz/portal/lide/produkty/kurzovni-listky/kurzovni-listek/-/date/kurzy.txt";
    $radky = file($url);     
    // a uložíme do cache
    file_put_contents($cachefile, $radky);
  } 
  // najdeme řádek resp. řádky, kde se vyskytuje výraz "USD"
  $matches = preg_grep("/USD/", $radky);
  // najdeme první z nich (my víme, že v našem případě bude jeden)
  // ale počítač je blbej a neví to
  $match=array_values($matches)[0];        
  // jde o text rozdělený středníky, rozsekáme po střednících
  $obsahradku = explode(";", $match);
  // sedmý prvek je údaj "devizy střed"
  // ale PHP čísluje od nuly, takže "šestý"
  $kurz = $obsahradku[6];
  // a ten vrátíme
  return ($kurz);  
}
echo kurzmeny();
?>

Chovat se to bude tak, že při prvním spuštění aplikace stáhne lístek z webu, a pokud se skript pustí znovu dříve než po hodině, berou se údaje z disku.

Skript lze samozřejmě upravit, například tak, že zobecníme hledání na všechny možné měny, nebo ošetříme chyby atd., to by už ale bylo nad rámec jednoduché ukázky. Vidíme tedy, že i primitivní skript nám může hodně pomoci; data lze pak dostat například do Excelu a tam s nimi dále pracovat.

Příspěvek byl publikován v rubrice Nezařazené. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

6 komentářů u Jak stáhnout kurzy měn pomocí skriptu v PHP?

  1. Honza napsal:

    No ty kraso.. z toho serialu na linuxsoftu jsem se deset let zpatky ucil :-)

    • admin napsal:

      Hříchy nezralého mládí. Ovšem na svou dobu to fakt nebylo špatný, tenkrát moc zdrojů nebylo.

  2. Pixel napsal:

    Já používám Google docs tabulky – mají funkci GoogleFinance, data jsou aktuální
    =GoogleFinance(„CURRENCY:GBPCZK“)

    I když rozumím, že není na škodu si ukládat kurzy měn třeba do své tabulky. K tomu bych na PHP raději použil doplněk – dělá v podstatě to samé co tvoje skripty https://github.com/h4kuna/exchange

  3. Lukáš Kříž napsal:

    Ahoj, jsem rád, že to tu je ;-)

    trochu jsme ti ten script přepsal

    0) {
    $contentLine = explode(„;“, reset($matches));
    if (isset($contentLine[$this::$soldRow])) {
    $output = $contentLine[$this::$soldRow];
    }
    } else {
    throw new Exception(„Curse is not find in currency list.“);
    }
    return $output;
    }
    }

    $currency = new Currency();
    try {
    $course = $currency->getActualSoldCurs(„USD“);
    echo $course;
    } catch (Exception $e) {
    echo „Error: “ . $e->getMessage();
    }

  4. Lukáš Kříž napsal:

    Nepodařilo se mi to vložit tady to je http://pastebin.com/EFPaKG6P

Napsat komentář

Vaše emailová adresa nebude zveřejněna.