Как получить курсы валют php урок. Курс валют на PHP: делаем информер из XML

Добрый день дорогие друзья. Как вы знаете, недавно (11 февраля) у нас в Казахстане произошла очередная девальвация, этот "черный вторник" как его назвали многие в интернете, ударил по карману многих. Не буду писать очередную негативную статью на эту тему. Я считаю, что это не нужно. Что сделано, то сделано. Но в тот злополучный день меня очень сильно возмутило то, что нигде в интернете нельзя было узнать точный курс доллара, евро или другой иностранной валюты. Все известные и не известные (привет google) мне сайты были не доступны. Возможно некоторые сайты попали немилость казахстанских пользователей и не были готовы к такой нагрузке пользователей. Но факт остается фактом, сайты не работали.

И вечером, когда у меня страсти о девальвации начали утихать и нервы начали приходить в свое спокойное состояние, решил, что нужно написать себе маленький информер курса валют на свой уютненький бложек . Как я сказал выше виджеты других сайтов я не хотел использовать, так как эти сайты "лежали" когда весь казнет хотел узнать, этот чертов курс валют. :) Ниже привожу скрипт информера на php, думаю скрипт не нуждается в комментариях:

$amount = "1";
$from = "USD";
$from = "EUR";
$from = "RUB";
$to= "KZT";
$i=0;
while($i <= 2){
$i++;

$get = explode("",$get);
$get = explode("
",$get);



";
}
?>

Скрипт универсальный, Вы можете изменить переменную $to на другую валюту в которую хотите конвертировать, а так же увеличить или изменить массивы $from[?] , добавить другие валюты, только не забудьте изменить условие цикла, если вы увеличили количество выводимых валют. Идентификатор (название) валют Вы можете взять по ссылке - https://www.google.com/finance/converter . Как вы наверное поняли, скрипт парсит в цикле эту страницу google"a и забирает нужную для себя информацию.

Как установить этот скрипт на свой сайт? Если у вас движок wordpress, вам нужно будет установить плагин "PHP Code Widget " и выбрать этот виджет и добавить весь код туда. Это самый легкий способ. Если возникла проблема, вы всегда можете отключить плагин и все вернется как было. Сложные варианты установки скрипта не предлагаю. Можете написать мне на почту, и я постараюсь Вам помочь. Надеюсь эта статья была вам полезна. :)

P.S: Для себя я немного оптимизировал скрипт (добавил кэширование) и дал задание cron"у раз в час обновлять скрипт. Мой вариант сохраняет *.html файл и его я вывожу в виджетах, через ajax.

// Start output buffering
ob_start();

$amount = "1";
$from = "USD";
$from = "EUR";
$from = "RUB";
$to= "KZT";
$i=0;
while($i <= 2){
$i++;
$get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=$from[$i]&to=$to");
$get = explode("",$get);
$get = explode("
",$get);
$converted_amount = preg_replace("/[^0-9\.]/", null, $get);
$converted_amount = round($converted_amount,2);
echo $amount." ".$from[$i]." = ".$converted_amount." ".$to."
";
}

// saving captured output to .html file
file_put_contents("currency.html", ob_get_contents());
// end buffering and displaying page
ob_end_flush();
?>

Сохраняете скрипт в формате *.php, желательно сохранить в отдельной папке (например в папке "scripts", что бы не засорять сайт. После вам потребуется в кроне добавить задание, раз n часов обращаться к скрипту. И один через браузер раз вручную обращаетесь к скрипту, что бы он создал html файл, к которому мы в дальнейшем будем обращаться. Далее вы можете через iframe выводить скрипт в виджетах:

<script>
function show_temp()
{
$.ajax({
url: "http://вашсайт/scripts/currency.html",
cache: false,
success: function(html){
$("#currency").html(html);
}
});
}
$(document).ready(function(){
show_temp();
});

Такой способ вывода, позволит вам изменять размер шрифта, цвет шрифта или добавить любую другие эффекты через CSS (каскадную таблицу стилей).

Оптимизированный вариант скрипта, не будет нагружать сервер и постоянно обращаться к google"у. Вы можете по другому реализовать кэширование, и проверять по дате, что бы не использовать крон. Но лично я исходил из простого. Не люблю мудрить. :)

В интернете описано множество решений по получению актуальных курсов валют. Большинство решений основано на бесплатном сервисе Центробанка (подробнее о сервисе на сайте Центробанка).

Казалось бы, хороший и удобный интерфейс от главного экономического регулятора РФ, однако у него есть несколько неприятных особенностей. Самый значительный его минус в том, что IP, с которого вы будете парсить их сервис курсов валют может, быть заблокирован в любой момент совершенно неожиданно для вас. В моем случае я обновлял курс через сервис ЦБ РФ около 2 месяцев, каждый день каждые два часа (для организации очень важно иметь актуальные данные по курсу валют). Причем на сайте не указано никаких ограничений по использованию данного сервиса, более того, они предлагают свой скрипт для получения актуального курса. Если вас заблокировали, с данного IP вы даже не сможете зайти на сайт регулятора. Для заблокированных пользователей они выводят страницу с бесконечной переадресацией. Обычно блокировка длится не более 24 часов, однако нет никаких гарантий, объяснений причин и т. п. В общем и целом предоставляемый ЦБ РФ сервис ненадежен.

Еще один небольшой минус сервиса в том что приходится парсить XML, а это расход ресурсов и потеря быстродействия. Конечно, можно так настроить, что можно будет парсить всего 4-5 строк, однако в идеале и их бы сократить до одной.
В результате поиска альтернатив пришел к выводу, что достойных сервисов предоставляющих курс валюты в удобном формате, соответствующих критериям (надежность, скорость работы, простота использования), просто нет. Кто-то скажет, что можно парсить сервис Европейского ЦБ, ссылку приводить не буду, скажу лишь, что сервис почти такой же как у ЦБ РФ. Однако курсы Европейского ЦБ значительно отличаются от курсов ЦБ РФ и не подходят для использования в России.

Единственным достойным конкурентом сервису нашего ЦБ, является сервис cbrates.rbc.ru . В программе 1С уже давно используют данный сервис и за время использования он доказал свою надежность. Использовать его проще простого: если нужно получить динамику курса, используем следующую ссылку - cbrates.rbc.ru/tsv/cb/Код_курса валюты.tsv. Например, для доллара это будет ссылка cbrates.rbc.ru/tsv/cb/840.tsv В результате получаем пары дата курс, разделенных табуляцией. Разобрать такие пары на массивы проще простого.

Для получения конкретного курса на конкретную дату используется ссылка cbrates.rbc.ru/tsv/Код_валюта/год/месяц/день.tsv , например, для долара это будет cbrates.rbc.ru/tsv/840/2014/11/07.tsv . По ссылке выдается всего одна строка с порядковым номером 1 и курсом на эту дату. Парсить такую строку намного проще, чем XML - сервис нашего ЦБ, а надежность и быстродействие будут выше. Для получения курса я написал простенький класс:

Class rbc{ private $url = "http://cbrates.rbc.ru/tsv/"; private $file = ".tsv"; private $date = 0; public function __construct($date = null){ if ($date == null){ $date = time(); } $this -> date = $date; } public function get_curs($currency_code){ $url = $this -> url; $curs = 0; try{ if (!is_int($currency_code)){ throw new Exception("Передан неверный код валюты"); } $url .= $currency_code . "/"; if ($this -> date <= 0){ throw new Exception("Передана неверная дата"); } $url .= date("Y/m/d", $this -> date); $url .= $this -> file; $page = file_get_contents($url); $curs = $this -> parse($page); } catch (Exception $e) { echo "Не удалось получить курс валюты. ", $e -> getMessage(); } return $curs; } private function parse($file){ if (empty($file)){ throw new Exception("Возможно указан неверный код валюты, также возможно на указанную дату еще не установлен курс валюты, либо сервер "cbrates.rbc.ru" недоступен."); } $curs = explode(" ", $file); if (!empty($curs)){ return $curs; } else{ throw new Exception("Сервер не выдал результатов по данной валюте на указнную дату"); } } }

Использовать можно следующим образом:

$curs_today = new rbc(); //Курс сегодня echo $curs_today -> get_curs(840); //Курс долара, в скобках официальный код валюты $curs_tommorow= new rbc(strtotime("+1 day")); //Курс на завтра echo $curs_tommorow -> get_curs(840);

При создании класса передается дата в формате unix time, если нужно получить курс на дату отличную от текущей. Важно вводить код валюты в числовом виде, а не в виде текста. Можно ввести проверку кодов валют, но я не стал усложнять класс.

Я приводил пример парсера, вырезающий курс валют из HTML содержимого страницы. В этой статье рассмотрим альтернативный вариант получения информации о курсах валют из файлов формата-импорта (XML).

В условиях экономическо-политической нестабильности актуальными на новостных и городских сайтах являются информеры курса валют. Впрочем, данный вид информеров всегда был востребованным, о чем красноречиво свидетельствует обилие API и экспортных файлов (XML/JSON) у сайтов финансовой направленности. Казалось бы, получить информацию о текущем состоянии валют для своего сайта от финансовых учреждений - раз плюнуть. Но при детальном изучении вопроса, мы наталкиваемся на ряд подводных камней: либо нас просят разместить их информер (куда вшита ссылка), либо от нас требуют установить обратную ссылку или баннер, либо угрожают банить наш IP при частом обращении к их файлу импорта, либо сайт с импортными данными уже не работает и т.д.

Новостные сайты немыслимы без курса валют

Как же быть, если курсы валют так популярны и их наличие на сайте порой удерживает там посетителей? Делать информер мы будем на PHP, предъявляя ряд требований к донорам, которые будут предоставлять нам такую информацию:

  • это должен быть серьезный, старый, официальный сайт;
  • импорт должен быть в XML файле;
  • доступ к XML стабильный, открытый и бесплатный;

Информер курса валют для Украины

В Украине особый интерес вызывает курс валют от Приватбанка и НБУ. Основными валютами тут являются USD, EUR и RUB. Где взять их бесплатно и в XML?

Курс валют от Приватбанка

Крупный украинский "Приватбанк" имеет API, предоставляющий информацию о наличных и безналичных курсах валют. В данном случае нас интересует наличный курс в Приватбанке, его можно взять по адресу:

https://api.privatbank.ua/p24api/pubinfo?exchange&coursid=5

Чтобы информацию выводить на своем сайте, мы должны обработать XML. Сделаем это с помощью PHP:

row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]." - "; echo $xml->row->exchangerate["sale"]."
"; echo $xml->row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]." - "; echo $xml->row->exchangerate["sale"]."
"; echo $xml->row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]." - "; echo $xml->row->exchangerate["sale"]; } ?>

Результат работы скрипта:

USD: 24.10000 - 25.10000
EUR: 26.40000 - 27.50000
RUR: 0.34200 - 0.37000

Курс валют от НБУ

Курс основных валют в Украине (USD, EUR и RUB) от Национального Банка Украины (НБУ) можно взять у того же Приватбанка (достаточно немного модифицировать уже приведенный код):

row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]."
"; echo $xml->row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]."
"; echo $xml->row->exchangerate["ccy"].": "; echo $xml->row->exchangerate["buy"]."
"; } ?>

Результат работы скрипта (выводит курс основных валют на текущий день):

USD: 23.36832
EUR: 25.57195
RUR: 0.33762

Информер курса валют для России

Основные индикаторы финансового рынка в России - это Доллар США и Евро. Центральный банк Российской Федерации предоставляет данные о курсах различных валют в XML формате по адресу:

http://www.cbr.ru/scripts/XML_daily.asp?date_req=

Вот как вытянуть на PHP оттуда указанные валюты (хотя при желании можно забрать другие) на текущую дату (в переменную $date можно подставить любую дату и получить курс валют на указанный день):

loadXML(file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date")); $root = $dom->documentElement; $childs = $root->childNodes; $data = array(); for ($i = 0; $i < $childs->length; $i++) { $childs_new = $childs->item($i)->childNodes; for ($j = 0; $j < $childs_new->length; $j++) { $el = $childs_new->item($j); $code = $el->nodeValue; // Указываем нужные нам валюты, полный список их можно получить в файле www.cbr.ru/scripts/XML_daily.asp?date_req= в поле ... if (($code == "USD") || ($code == "EUR")) $data = $childs_new; } } for ($i = 0; $i < count($data); $i++) { $list = $data[$i]; for ($j = 0; $j < $list->length; $j++) { $el = $list->item($j); if ($el->nodeName == "Name") echo $el->nodeValue." - "; elseif ($el->nodeName == "Value") echo $el->nodeValue."
"; } } ?>

Результат работы скрипта:

Доллар США - 69,1755
Евро - 75,7472

Заключение

Парсить информацию основных валют мы научились! Но это, разумеется, еще не все. За кадром осталось оформление информера (тут уже дело вкуса) и как гарантия от сбоев информера - реализация кеширования данных. Я настоятельно рекомендую кешировать полученные данные по XML (можно на пару часов - актуальность от этого курса валют не сильно пострадает), так вы убережете себя от непредвиденных ошибок в работе парсера или ошибках на стороне самого донора (пример кеширования вы можете почерпнуть в статье, ссылка на которую размещена в начале поста).

Выгодных вам курсов валют и стабильной работы в скриптах!

Вконтакте

Оцените материал: