» » » Получаем курс валют НБУ [PHP+XML]

Получаем курс валют НБУ [PHP+XML]

 

Наш, всеми любимый, Национальный Банк никак не удосужится запустить собственное API. Приходиться обходными путями получать актуальную информацию. Я для этого решил использовать средства коммерческого банка — ПриватБанк. У них на официальном сайте функционирует страница с XML разметкой, на которой и представлены курсы обмена самых основных валют: UAH, RUR, EUR, USD и золото XAU. PHP скрипт может получать курс валют по котировкам НБУ и по собственным, внутренним курсам. Взаимодействие без использования CURL запросов, а задействована функция file_get_contents.
 
От себя добавил, функцию сохранения XML файла на локальном сервере, на случай если ссылка привата сломается. Файл храниться ровно день, затем в него подгружается новая, актуальная информация об обменных курсах валют.
 
Вот сам PHP класс:
class ExchangeRate {
	 
	    // URL, файл в формате XML
	    public $exchange_url =
	            'https://privat24.privatbank.ua/p24/accountorder?oper=prp&exchange&PUREXML&coursid=3'; // установив coursid=5, расчёт будет относительно ставок привата
	    private $xml;
	    private $carrency = 'cache/currency.xml';
	 
	    function __construct(){
	        $this->getXML();
	        return $this->xml = simplexml_load_file($this-> carrency);
	    }
	    
	     private function getXML(){
	    
	        if ( !file_exists($this-> carrency) or (time() - filemtime($this->carrency) > 86400) )
	            file_put_contents($this->carrency, file_get_contents($this->exchange_url));
	        
	    }
	    
	    private function getExchangeVal($val, $do){
	 
	         if ($this->xml!==FALSE) {
	          // все хорошо, можно работать дальше -
	          // в XML-данных нет ошибки
	
	                foreach ($this->xml as $currency) {
	                    if ($currency->exchangerate['ccy'] == $val) {
	                        $curs = floatval($currency->exchangerate[$do]);
	                   }
	                }
	        }
	     return $curs;
	    }
	    public function getExchange($val1, $val2, $summ=0, $round=6){
	        $valuta1 = $this->getExchangeVal($val1, 'buy');
	        $valuta2 = $this->getExchangeVal($val2, 'sale');
	
	        if ($val1 == 'UAH') {
	                if($summ>0) $valuta2 = $summ / $valuta2;
	                return round($valuta2, $round);
	                
	        } elseif ($val2 == 'UAH') {
	                if($summ>0) $valuta1 = $summ * $valuta1;
	                return round($valuta1, $round);
	                
	        } else {
	                $rate = $valuta1 / $valuta2;
	                if($summ>0) $rate = $rate*$summ;
	                return round($rate, $round);
	        }
	    }
	}
 
Примеры использования:

 
$er = new ExchangeRate(); //инициализируем класс
	echo $er->getExchange('USD', 'RUR', 100, 2); //меняем Доллар на Рубли; сумма 100; округляем до десятых (2 знака после запятой).
	echo $er->getExchange('RUR', 'UAH', 800, 3); //меняем рубли на Гривны; сумма 800 рублей; округляем до тысячных (3 знака после запятой).
	 
	echo $er->getExchange('UAH', 'RUR', 100); //стандартное округление в 6 знаков после ноля.
	echo $er->getExchange('EUR', 'USD'); //курс 1 единицы валюты.
 
Помните, что курс рассчитывается относительно Гривны по ставкам НБУ.
[23 апреля 2014 14:49] andriykozl:
Как прописать дизайн в пхп..? и пробел между валютами??
[23 апреля 2014 19:00] pur1tan:
Самый простой метод: http://pastebin.com/CBVepA65
[24 апреля 2014 00:50] andriykozl:
Спасибо.! я так понял на етот пхп можна и цены на бензин влепить?
[24 апреля 2014 02:02] andriykozl:
а как создать дизайн например kyrs.tpl ?
[24 апреля 2014 02:30] andriykozl:
как добавить сюда кеш?

<?
$mese[0]="-";
$mese[1]="січня";
$mese[2]="лютого";
$mese[3]="березня";
$mese[4]="квітня";
$mese[5]="травня";
$mese[6]="червня";
$mese[7]="липня";
$mese[8]="серпня";
$mese[9]="вересня";
$mese[10]="жовтня";
$mese[11]="листопада";
$mese[12]="грудня";

$giorno[0]=" ";
$giorno[1]=" ";
$giorno[2]=" ";
$giorno[3]=" ";
$giorno[4]=" ";
$giorno[5]=" ";
$giorno[6]=" ";

$gisett=(int)date("w");
$mesnum=(int)date("m");

$full_date = $giorno[$gisett]." ".date("j")." ".$mese[$mesnum];
?>
[24 апреля 2014 02:31] andriykozl:
<?
$mese[0]="-";
$mese[1]="січня";
$mese[2]="лютого";
$mese[3]="березня";
$mese[4]="квітня";
$mese[5]="травня";
$mese[6]="червня";
$mese[7]="липня";
$mese[8]="серпня";
$mese[9]="вересня";
$mese[10]="жовтня";
$mese[11]="листопада";
$mese[12]="грудня";

$giorno[0]=" ";
$giorno[1]=" ";
$giorno[2]=" ";
$giorno[3]=" ";
$giorno[4]=" ";
$giorno[5]=" ";
$giorno[6]=" ";

$gisett=(int)date("w");
$mesnum=(int)date("m");

$full_date = $giorno[$gisett]." ".date("j")." ".$mese[$mesnum];
?>
[24 апреля 2014 02:50] andriykozl:
можно ли тажить просто текст с траницы.? ис класа или Ид? и приетом установить кеш.?
[29 апреля 2014 08:05] pur1tan:
На бензин точно нет. Если нужно прикрутить всякие плюшки к скрипту - пишите через обратку, договоримся.
[4 мая 2014 16:05] andriykozl:
а можеш зробити на бензин новий скрипт..? як на delo.ua?

і на телепрограму...?

пиши skype: andriyko_vip
[4 мая 2014 16:07] andriykozl:
і тре до одного скрипта кеш додати... в пхп.!
[31 января 2016 18:47] roomianorg:
Приветствую!

Теперь инфу о курсах валют можно свободно без ограничений забирать с официального сервера НБУ, т.к. недавно там был запущен API