On gists
Exchange rates solution (AMI)
17.2.2022
PHP Libs
PHP
ExchangeRatesFetcher.php
Raw
#
<?php
/**
* Abstraktni trida pro stahovani kurzovnich listku ze stranek bank
*
* @date 25-02-2008
* @version 1.0
*
*/
abstract class ExchangeRatesFetcher
{
/**
* URL, odkud se kurzy stahuji
*
* @var string
*/
protected $url;
/**
* kod banky
*
* @var string
*/
protected $bank_code;
/**
* seznam kodu men, ktere chceme stahovat
*
* @var array
*/
protected $important_currencies = array('CAD', 'DKK', 'EUR', 'GBP', 'HUF', 'CHF', 'JPY', 'NOK', 'PLN', 'SEK', 'SKK', 'USD', 'RON', 'RUB', 'AUD');
/**
* pole stazenych hodnot kurzu
*
* @var array
*/
protected $exchange_rates = array();
/**
* konstruktor - nastaveni vychozich hodnot
*
* @param string URL, odkud se kurzy stahuji
*/
public function __construct($url)
{
$this->url = $url;
}
/**
* funkce vraci pole stazenych kurzu (vhodne napr. pro testovaci vypisy)
*
* @return array/false pokud nejsou stazene kurzy vraci false, jinak vraci pole stazenych kurzu
*/
public function getExchangeRates()
{
if (is_array($this->exchange_rates)) {
return $this->exchange_rates;
}
else {
return false;
}
}
/**
* funkce vraci kod banky
*
* @return string
*/
public function getBankCode()
{
return $this->bank_code;
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*/
abstract public function fetch();
}
ExchangeRatesFetcherCitibank.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek Citibank
*
* @date 27-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherCitibank extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'CBK';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$file = file_get_contents($this->url);
if (!$file) {
throw new Exception('Soubor s kurzovym listkem Citibank se nepodarilo nacist');
}
preg_match('/<table border="0" cellpadding="3" cellspacing="0" class="rates">(.*)<\/table>/isU', $file, $match);
preg_match_all('/<td class="firstcoll" style="text-align:left;">(.*)<\/tr>/isU', $match[1], $rate_lines);
$row = array();
$i = 0;
foreach ($rate_lines[1] as $rate_line) {
preg_match_all('/<td[^>]*>(.*)<\/td>/isU', $rate_line, $row[$i]);
$i++;
}
$rate_lines = array();
$i = 0;
foreach ($row as $r) {
foreach($r[1] as $val) {
$rate_lines[$i][] = trim(strip_tags($val));
}
$i++;
}
foreach ($rate_lines as $row) {
$name = $row[0];
if (in_array($name, $this->important_currencies)) {
$exchange_rate_info = new ExchangeRateInfo($name, $row[1], (float) $row[2], (float) $row[3]);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
}
ExchangeRatesFetcherCs.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek Ceske sporitelny
*
* @date 27-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherCs extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'CS';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$lines = file($this->url);
if (!$lines) {
throw new Exception('Soubor s kurzovym listkem Ceske sporitelny se nepodarilo nacist');
}
$i = 0;
$rate = array();
foreach ($lines as $line_num => $line) {
$line = trim($line);
if ($i > 1 && !empty($line)) { // hodnoty zacinaji az na 3. radku
$line = str_replace('"', '', $line);
list($country, $quota, $currency, $change_val, $sign,
$purchase_dev, $sale_dev, $middle_dev,
$purchase_val, $sale_val, $middle_val, $CNB_middle) = explode(',', $line);
$rate[$currency]['quota'] = (int) $quota;
$rate[$currency]['purchase_dev'] = (float) $purchase_dev;
$rate[$currency]['sale_dev'] = (float) $sale_dev;
}
$i++;
}
foreach ($rate as $name => $type) {
if (in_array($name, $this->important_currencies)) {
$exchange_rate_info = new ExchangeRateInfo($name, $type['quota'], $type['purchase_dev'], $type['sale_dev']);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
}
ExchangeRatesFetcherCsob.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek CSOB
*
* @date 27-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherCsob extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'CSOB';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$lines = file($this->url);
if (!$lines) {
throw new Exception('Soubor s kurzovym listkem CSOB se nepodarilo nacist');
}
$i = 0;
$rate = array();
foreach ($lines as $line_num => $line) {
$line = trim($line);
if ($i > 3 && !empty($line)) {
list($country, $quota, $currency, $change_val,
$purchase_dev, $sale_dev, $middle_dev,
$purchase_val, $sale_val, $middle_val) = explode(';', $line);
$rate[$currency]['quota'] = (int) trim($quota);
$rate[$currency]['purchase_dev'] = (float) trim($purchase_dev);
$rate[$currency]['sale_dev'] = (float) trim($sale_dev);
}
$i++;
}
foreach ($rate as $name => $type) {
if (in_array($name, $this->important_currencies)) {
$exchange_rate_info = new ExchangeRateInfo($name, $type['quota'], $type['purchase_dev'], $type['sale_dev']);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
}
ExchangeRatesFetcherEbanka.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek E-banky
*
* @date 27-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherEbanka extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'EBANKA';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$file = file_get_contents($this->url);
if (!$file) {
throw new Exception('Soubor s kurzovym listkem E-banka se nepodarilo nacist');
}
preg_match('/Kurzovn..l.stek(.*)<\/form>/is', $file, $match);
preg_match_all('/<tr[^>]*>(.*)<\/tr>/isU', $match[1], $rate_lines);
$row = array();
$i = 0;
foreach ($rate_lines[1] as $rate_line) {
preg_match_all('/<td[^>]*>(.*)<\/td>/isU', $rate_line, $row[$i]);
$i++;
}
$rate_lines = array();
$i = 0;
foreach ($row as $r) {
foreach($r[1] as $val) {
$rate_lines[$i][] = trim(strip_tags($val));
}
$i++;
}
foreach ($rate_lines as $row) {
$name = $row[2];
if (in_array($name, $this->important_currencies)) {
$exchange_rate_info = new ExchangeRateInfo($name, $row[1], (float) $row[3], (float) $row[4]);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
}
ExchangeRatesFetcherKb.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek Komercni banky
*
* @date 27-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherKb extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'KB';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$file = file_get_contents($this->url);
if (!$file) {
throw new Exception('Soubor s kurzovym listkem Komercni banky se nepodarilo nacist');
}
preg_match('/<div class="text-X">Kurzovní lístek<\/div>(.*)<\/table>/is', $file, $match);
preg_match_all('/<tr class="color-[^>]*>(.*)<\/tr>/isU', $match[1], $rate_lines);
$row = array();
$i = 0;
foreach ($rate_lines[1] as $rate_line) {
preg_match_all('/<td class="text-[^>]*>(.*)<\/td>/isU', $rate_line, $row[$i]);
$i++;
}
$rate_lines = array();
$i = 0;
foreach ($row as $r) {
foreach($r[1] as $val) {
$rate_lines[$i][] = trim(strip_tags($val));
}
$i++;
}
foreach ($rate_lines as $row) {
$name = $row[0];
$quota = str_replace(',', '.', $row[1]);
$purchase = str_replace(',', '.', $row[6]);
$sale = str_replace(',', '.', $row[7]);
if (in_array($name, $this->important_currencies)) {
$exchange_rate_info = new ExchangeRateInfo($name, $quota, $purchase, $sale);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
}
ExchangeRatesFetcherUcb.php
Raw
#
<?php
/**
* trida vyuziva tridu ExchangeRatesFetcher
*/
require_once 'ExchangeRatesFetcher.php';
/**
* trida vyuziva tridu ExchangeRatesInfo
*/
require_once 'ExchangeRatesInfo.php';
/**
* Trida pro stahovani kurzovnich listku ze stranek Unicreditbank
*
* @date 25-02-2008
* @version 1.0
*/
class ExchangeRatesFetcherUcb extends ExchangeRatesFetcher
{
/**
* konstruktor - nastaveni kodu banky
*/
public function __construct($url)
{
parent::__construct($url);
$this->bank_code = 'UCB';
}
/**
* Funkce pro stahnuti kurzovniho listku
*
* Funkce stahne kurzovni listek a ulozi ho do interni promenne $exchange_rates
*
* @throws object Exception
*/
public function fetch()
{
$xml = @simplexml_load_file($this->url);
if (!$xml) {
throw new Exception('Soubor s kurzovym listkem UCB se nepodarilo nacist');
}
$info_array = array();
foreach ($xml->children() as $exchange_rate) {
foreach ($exchange_rate->children() as $currency) {
$name = (string) $currency['name'];
$type = (string) $exchange_rate['type'];
$valid_from = (string) $exchange_rate['valid_from'];
$purchase = 0;
$sale = 0;
if (in_array($name, $this->important_currencies)) {
$info_array[$name]['quota'] = (int) $currency['quota'];
// zajimaji nas jen devizy (prodej a nakup)
if (strpos($type, '_PURCHASE_DEVIZA')) {
$info_array[$name]['purchase'] = (float) $currency['rate'];
}
if (strpos($type, '_SALE_DEVIZA')) {
$info_array[$name]['sale'] = (float) $currency['rate'];
}
}
}
}
foreach ($info_array as $name => $type) {
$exchange_rate_info = new ExchangeRateInfo($name, $type['quota'], $type['purchase'], $type['sale']);
$this->exchange_rates[$name] = $exchange_rate_info;
}
}
}
ExchangeRatesInfo.php
Raw
#
<?php
/**
* trida pro ulozeni informace o kursu meny
*
* pomocna trida pro ulozeni jednoho kursu jedne meny
*
* @date 26-02-2008
* @version 1.0
*
*/
class ExchangeRateInfo
{
/**
* zkratka nazvu meny, napr. "EUR"
*
* @var string
*/
public $currency;
/**
* mnozstvi (jednotka), napr. 1 nebo 100
*
* @var string
*/
public $quota;
/**
* deviza nakup
*
* @var string
*/
public $purchase;
/**
* deviza prodej
*
* @var string
*/
public $sale;
/**
* konstruktor - inicializace
*
* @param string $currency zkratka nazvu meny, napr. "EUR"
* @param int $quota mnozstvi (jednotka), napr. 1 nebo 100
* @param float $purchase deviza nakup
* @param float $sale deviza prodej
*/
public function ExchangeRateInfo($currency, $quota, $purchase, $sale)
{
$this->quota = $quota;
$this->currency = $currency;
$this->purchase = $purchase;
$this->sale = $sale;
}
}
ExchangeRatesStorage.php
Raw
#
<?php
/**
* trida vyuziva knihovnu pro praci s databazi
*
*/
require_once 'Db_lib.php';
/**
* Trida pro ukladani stazenych kurzovnich listku ze stranek bank
*
* @date 26-02-2008
* @version 1.0
*
*/
class ExchangeRatesStorage
{
/**
* ukazatel na objekt se stazenym kurzovnim listkem
*
* @var object ExchangeRatesFetcher
*/
private $exchange_rates_fetcher;
/**
* konstruktor - nastaveni vychozich hodnot
*
* @param object ExchangeRatesFetcher objekt, ktery stahl listek ze stranek banky
*/
public function __construct(ExchangeRatesFetcher $exchange_rates_fetcher)
{
$this->exchange_rates_fetcher = $exchange_rates_fetcher;
}
/**
* Funkce pro ulozeni stazeneho kurzovniho listku do databaze
*
* Funkce prevezme kurzovni listek z objektu ExchangeRatesFetcher a ulozi ho do databaze
*
* @throws object Exception
*/
public function store()
{
if ($exchange_rates = $this->exchange_rates_fetcher->getExchangeRates()) {
$bank_code = $this->exchange_rates_fetcher->getBankCode();
$dbh = DbMysqlFactory::createDbObject(DB_TYPE); // vytvorime link do DB s pristupy na test ci ostry server
$fetched = date('Y-m-d H:i:s');
foreach ($exchange_rates as $exchange_rate) {
$currency = $exchange_rate->currency;
$purchase = $exchange_rate->purchase;
$sale = $exchange_rate->sale;
$query = 'INSERT INTO bank_rates SET
bank_info_code = :1,
currency_code = :2,
rate_purchase = :3,
rate_sale = :4,
fetched = :5
';
$went_ok = $dbh->prepare($query)->execute($bank_code, $currency, $purchase, $sale, $fetched);
if(!$went_ok) {
echo $query.'<br />';
throw new Exception('Kurz banky '.$bank_code.' se nepodarilo ulozit');
}
}
}
else {
echo 'Neni co ukladat<br />';
}
}
}
get_exchange_rates.php
Raw
#
<?php
/**
* skript pro stahovani a ukladani kurzovnich listku bank
*
*/
if (date('H') < 9 || date('H') >= 18) {
exit;
}
set_time_limit(120); // zvysime max dobu behu skriptu
//error_reporting(E_ALL);
require '../../connection/connection.php';
define('DB_TYPE', 'prod');
require_once 'Logger.php';
require_once 'ExchangeRatesFetcherUcb.php';
require_once 'ExchangeRatesFetcherCs.php';
require_once 'ExchangeRatesFetcherCitibank.php';
require_once 'ExchangeRatesFetcherCsob.php';
require_once 'ExchangeRatesFetcherKb.php';
require_once 'ExchangeRatesFetcherEbanka.php';
require_once 'ExchangeRatesStorage.php';
Logger::initialize('../../logs/kurzy/rates-log.txt'); // inicializace logu - nastaveni jmema souboru
$log_string = '--------START--------'."\n".date('Y-m-d H:i:s')."\n";
Logger::write($log_string); // zapiseme do logu
###########################################
// URL adresy, ze kterych stahujeme
$url_ebanka = 'http://www.ebanka.cz/Osobni-finance/Cenik-sazby-kurzy/Kurzovni-listek/';
$url_unicredit = 'http://www.unicreditbank.cz/kurzy-xml.php?den='.date('j.n.Y');
$url_sporitelna = 'http://www.csas.cz/banka/portlets/exchangerates/current.do?csv=1×=&event=current&day='.date('j').'&month='.date('n').'&year='.date('Y');
$url_citibank = 'http://www.citibank.com/czech/consumer-banking/czech/docs/kurzy.jsp';
$url_csob = 'http://www.csob.cz/webcsob/kurzy/kurzynewcz.txt';
$url_kb = 'http://www.kb.cz/NASA/rateList/SRVRate?lng=cs';
###########################################
$exchange_rates_fetcher_Ucb = new ExchangeRatesFetcherUcb($url_unicredit);
try {
$exchange_rates_fetcher_Ucb->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('Unicredit,');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Ucb);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
###########################################
$exchange_rates_fetcher_Cs = new ExchangeRatesFetcherCs($url_sporitelna);
try {
$exchange_rates_fetcher_Cs->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('Ceska sporitelna,');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Cs);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
###########################################
$exchange_rates_fetcher_Citibank = new ExchangeRatesFetcherCitibank($url_citibank);
try {
$exchange_rates_fetcher_Citibank->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('Citibank,');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Citibank);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
###########################################
$exchange_rates_fetcher_Csob = new ExchangeRatesFetcherCsob($url_csob);
try {
$exchange_rates_fetcher_Csob->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('CSOB,');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Csob);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
###########################################
$exchange_rates_fetcher_Kb = new ExchangeRatesFetcherKb($url_kb);
try {
$exchange_rates_fetcher_Kb->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('KB,');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Kb);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
###########################################
$exchange_rates_fetcher_Ebanka = new ExchangeRatesFetcherEbanka($url_ebanka);
try {
$exchange_rates_fetcher_Ebanka->fetch();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
Logger::write('E-Banka');
$exchange_rates_storage = null;
$exchange_rates_storage = new ExchangeRatesStorage($exchange_rates_fetcher_Ebanka);
try {
$exchange_rates_storage->store();
}
catch (Exception $e) {
Logger::write($e->getMessage());
}
$log_string = "\n".date('Y-m-d H:i:s')."\n".'---------END---------'."\n"; // konec logovani
Logger::write($log_string);
// zapiseme do logu
//$fh = fopen('rates-log.txt', 'a');
//fwrite($fh, $log_string);
Logger.php
Raw
#
<?php
/**
* Trida pro logovani do souboru
*
* @date 03-03-2008
* @version 1.0
*
*/
class Logger
{
/**
* jmeno souboru, do ktereho logujeme
*
* @var string
*/
static private $filename = 'log.txt';
/**
* filehandler
*
* @var string
*/
static private $fh = false;
/**
* konstruktor - je jako private, aby nebylo mozno vytvorit instanci
*
*/
private function __construct()
{
}
/**
* nastaveni jmena souboru pro logovani
*
* mela by byt volana jako prvni, pokud volana neni, pouzije se vychozi nazev souboru
*
* @param string $filename jmeno souboru
*/
static public function initialize($filename)
{
self::$filename = $filename;
}
/**
* funkce pro zapis do souboru logu
*
* @param string $log_string retezec pro zapsani do logu
*/
static public function write($log_string)
{
// zapiseme do logu
if (!self::$fh) {
self::$fh = fopen(self::$filename, 'a');
}
fwrite(self::$fh, $log_string.' ');
}
}