Как получить официальные курсы валют на заданную дату на PHP. PHP-скрипт для загрузки курсов валют Скрипт курса валют

23.05.2022
Редкие невестки могут похвастаться, что у них ровные и дружеские отношения со свекровью. Обычно случается с точностью до наоборот

Многие из Вас неоднократно видели, что на некоторых сайтах выводятся курсы валют . Разумеется, администраторы этих сайтов сами ежедневно их не меняют (надеюсь). Они их подгружают с сайта ЦентроБанка. И в этой статье я дам код PHP-скрипта для загрузки курсов валют с сайта ЦентроБанка и вывода их на страницу.

Привожу сразу код скрипта:

$date = date("d/m/Y"); // Сегодняшняя дата в необходимом формате
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; // Ссылка на XML-файл с курсами валют
$content = file_get_contents($link); // Скачиваем содержимое страницы
$dom = new domDocument("1.0", "cp1251"); // Создаём DOM
$dom->loadXML($content); // Загружаем в DOM XML-документ
$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;
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." рублей
";
}
}
?>

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

В интернете немало скриптов, которые показываю курсы валют. Но мне нужен был курс доллара и евро от центрального банка. Я решил поискать скрипты, которые покажут официальные курсы валют на заданную дату . Я наткнулся на интересную статью jQuery сортировка таблицы . Там в скрипте "PHP парсер курсов валют " грабится xml-документ с помощью регулярных выражений. В ограблении кода активно используются регулярные выражения. Скрипт классно работает, но имеет свои особенности. Он выводит таблицу в HTML с большим количеством валют. Мне нужно сформировать из таблицы с курсами валют массив JSON . Этот массив подобен колбасе. Именно так называют программисты подобный массив. Бывают очень большие колбасы в большом количестве)))

/* * getArr() * курсы валют от центрального банка * происходит парсинг xml-документа * */ function getArr() { $url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=". date("d/m/Y",strtotime("+0 day")); $cbr_xml = str_replace(array("\n","\r","\t"),"",getContentPage($url)); if(preg_match_all("~ (.*?) ~i",$cbr_xml,$Valute)) { foreach($Valute as $data) { preg_match("~ (.*?) ~i",$data,$CharCode); preg_match("~ (.*?) ~i",$data,$NumCode); $arr[$CharCode]["num_code"].= $NumCode; preg_match("~ (.*?) ~i",$data,$Nominal); $arr[$CharCode]["nominal"] = $Nominal ; preg_match("~ (.*?) ~i",$data,$Name); $arr[$CharCode]["name"].= toUtf8($Name); preg_match("~ (.*?) ~i",$data,$Value); $arr[$CharCode]["value"].= $Value; $i++; } return $arr; } } function getContentPage($url) { $c = curl_init($url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); $text = curl_exec($c); curl_close($c); return $text; } //кодируем в Utf8 function toUtf8($str) { return mb_convert_encoding($str, "utf-8", "windows-1251"); } $arr = getArr(); echo json_encode($arr); /* { "EUR":{"num_code":"978", "nominal":"1", "name":"\u0415\u0432\u0440\u043e", "value":"63,6090"}, "USD":{"num_code":"840", "nominal":"1", "name":"\u0414\u043e\u043b\u043b\u0430\u0440 \u0421\u0428\u0410", "value":"58,0374"} }*/

Вы можете просмотреть как сегодняшний курс валюты, так и курс за вчерашний день . Функция strtotime("+0 day") позволяет менять время. Конечно сколько нулей не плюсуй все равно значение переменной не изменится. Я оставил эту часть кода для того чтобы в любой момент можно было изменить время. Мне пришлось немного переделать массив. Я использовал переменную $CharCode как ключ для массива. В моём большом массиве есть множество других массивов и обращаться к определённому массиву можно только по ключу (EUR). В моём случае переменная $CharCode принимает следующие значения:

  1. AUD => Австралийский доллар
  2. AZN => Азербайджанский манат
  3. GBP => Фунт стерлингов Соединенного королевства
  4. AMD => Армянские драмы
  5. BYR => Белорусские рубли
  6. BGN => Болгарский лев
  7. BRL => Бразильский реал
  8. HUF => Венгерский форинт
  9. DKK => Датских крон
  10. USD => Доллар США
  11. EUR => Евро
  12. INR => Индийских рупий
  13. KZT => Казахстанских тенге
  14. CAD => Канадский доллар
  15. KGS => Киргизский сом
  16. CNY => Китайский юань
  17. MDL => Молдавских леев
  18. NOK => Норвежских крон
  19. PLN => Польский злотый
  20. RON => Новый румынский лей
  21. XDR => СДР (специальные права заимствования)
  22. SGD => Сингапурский доллар
  23. TJS => Таджикский сомони
  24. TRY => Турецкая лира
  25. TMT => Новый туркменский манат
  26. UZS => Узбекский сум
  27. UAH => Украинская гривна
  28. CZK => Чешских крон
  29. SEK => Шведских крон
  30. CHF => Швейцарский франк
  31. ZAR => Южноафриканский рэнд
  32. KRW => Вон Республики Корея
  33. JPY => Японская иена

Меня интересует только USD и EUR. Я не стал удалять из

Добрый день дорогие друзья. Как вы знаете, недавно (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"у. Вы можете по другому реализовать кэширование, и проверять по дате, что бы не использовать крон. Но лично я исходил из простого. Не люблю мудрить. :)

Сломалась стиральная машина? 1v.kz поможет! - Ремонт стиральных машин в Алматы :

Специалисты со всех районов города

В некоторых случаях при работе с коммерцией возникает необходимость получения актуальной информации о курсе той или иной валюты. Центробанк – лучший источник таких данных, а учитывая то, что он предоставляет открытую и своевременно обновляемую информацию о курсе валют в формате XML – грех ею не воспользоваться.

Функция эта выглядит следующим образом:

Function get_currency($currency_code, $format) { $date = date("d/m/Y"); // Текущая дата $cache_time_out = "3600"; // Время жизни кэша в секундах $file_currency_cache = __DIR__."/XML_daily.asp"; if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $out = curl_exec($ch); curl_close($ch); file_put_contents($file_currency_cache, $out); } $content_currency = simplexml_load_file($file_currency_cache); return number_format(str_replace(",", ".", $content_currency->xpath("Valute")->Value), $format); }

В ней строки:

$date = date("d/m/Y"); // Текущая дата $cache_time_out = "3600"; // Время жизни кэша в секундах

отвечают за дату (в нашем случае она текущая) и время жизни кэша соответственно. Поскольку ЦБ не так часто обновляет данные о валютах, не стоит докучать ему просто так при каждом их использовании. Значения в этих строках (по желанию) можете изменить на свои.

Использование функции следующее:

Echo get_currency("USD", 3);

Здесь «USD » – символьный код валюты (в нашем случае – это доллар США), а «3 » – количество знаков после запятой.

Допустимый перечень валют, предоставляемых ЦБ РФ (на момент написания статьи) в виде «символьный код валюты – номинал и название»:

AUD – 1 австралийский доллар AZN – 1 азербайджанский манат GBP – 1 фунт стерлингов Соединенного королевства AMD – 100 армянских драмов BYN – 1 белорусский рубль BGN – 1 болгарский лев BRL – 1 бразильский реал HUF – 100 венгерских форинтов HKD – 10 гонконгских долларов DKK – 10 датских крон USD – 1 доллар США EUR – 1 евро INR – 100 индийских рупий KZT – 100 казахстанских тенге CAD – 1 канадский доллар KGS – 100 киргизских сомов CNY – 10 китайских юаней MDL – 10 молдавских леев NOK – 10 норвежских крон PLN – 1 польский злотый RON – 1 румынский лей XDR – 1 СДР (специальные права заимствования) SGD – 1 сингапурский доллар TJS – 10 таджикских сомони TRY – 1 турецкая лира TMT – 1 новый туркменский манат UZS – 10 000 узбекских сумов UAH – 10 украинских гривен CZK – 10 чешских крон SEK - 10 шведских крон CHF – 1 швейцарский франк ZAR – 10 южноафриканских рэндов KRW – 1 000 вон Республики Корея

Надеюсь, функция найдет свое место в вашем проекте. Если остались вопросы или что-то показалось непонятным – обязательно пишите об этом в комментариях под данной статьей.

В некоторых случаях при работе с коммерцией возникает необходимость получения актуальной информации о курсе той или иной валюты. Центробанк – лучший источник таких данных, а учитывая то, что он предоставляет открытую и своевременно обновляемую информацию о курсе валют в формате XML – грех ею не воспользоваться.

Функция эта выглядит следующим образом:

Function get_currency($currency_code, $format) { $date = date("d/m/Y"); // Текущая дата $cache_time_out = "3600"; // Время жизни кэша в секундах $file_currency_cache = __DIR__."/XML_daily.asp"; if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.cbr.ru/scripts/XML_daily.asp?date_req=".$date); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $out = curl_exec($ch); curl_close($ch); file_put_contents($file_currency_cache, $out); } $content_currency = simplexml_load_file($file_currency_cache); return number_format(str_replace(",", ".", $content_currency->xpath("Valute")->Value), $format); }

В ней строки:

$date = date("d/m/Y"); // Текущая дата $cache_time_out = "3600"; // Время жизни кэша в секундах

отвечают за дату (в нашем случае она текущая) и время жизни кэша соответственно. Поскольку ЦБ не так часто обновляет данные о валютах, не стоит докучать ему просто так при каждом их использовании. Значения в этих строках (по желанию) можете изменить на свои.

Использование функции следующее:

Echo get_currency("USD", 3);

Здесь «USD » – символьный код валюты (в нашем случае – это доллар США), а «3 » – количество знаков после запятой.

Допустимый перечень валют, предоставляемых ЦБ РФ (на момент написания статьи) в виде «символьный код валюты – номинал и название»:

AUD – 1 австралийский доллар AZN – 1 азербайджанский манат GBP – 1 фунт стерлингов Соединенного королевства AMD – 100 армянских драмов BYN – 1 белорусский рубль BGN – 1 болгарский лев BRL – 1 бразильский реал HUF – 100 венгерских форинтов HKD – 10 гонконгских долларов DKK – 10 датских крон USD – 1 доллар США EUR – 1 евро INR – 100 индийских рупий KZT – 100 казахстанских тенге CAD – 1 канадский доллар KGS – 100 киргизских сомов CNY – 10 китайских юаней MDL – 10 молдавских леев NOK – 10 норвежских крон PLN – 1 польский злотый RON – 1 румынский лей XDR – 1 СДР (специальные права заимствования) SGD – 1 сингапурский доллар TJS – 10 таджикских сомони TRY – 1 турецкая лира TMT – 1 новый туркменский манат UZS – 10 000 узбекских сумов UAH – 10 украинских гривен CZK – 10 чешских крон SEK - 10 шведских крон CHF – 1 швейцарский франк ZAR – 10 южноафриканских рэндов KRW – 1 000 вон Республики Корея

Надеюсь, функция найдет свое место в вашем проекте. Если остались вопросы или что-то показалось непонятным – обязательно пишите об этом в комментариях под данной статьей.

Последние материалы сайта