В последнее время технические ресурсы Банка России работают ненадежно. Усложнено получение данных о текущих курсах валют: от разработчиков требуют ставить специальные заголовки, данные не загружаются с первого раза. В следствие чего старые скрипты перестали работать.

Осложнение объясняют ведущейся на сервис DDoS атакой, но ведь нам от этого не легче.

Выход есть!

Достаточно заменить старые ссылки на сервисы ЦБ РФ на ссылки на нашем ресурсе, и получать все те же самые данные без какой-либо переделки старых скриптов.

Если вы использовали такую ссылку для получения котировок на сегодня:

http://www.cbr.ru/scripts/XML_daily.asp

То вам подойдет любая из двух ниже, в зависимости от того, нужна ли вам перекодировка в UTF-8 или устроит исходная 1251:

http://www.cbr-xml-daily.ru/daily.xml
http://www.cbr-xml-daily.ru/daily_utf8.xml

Если вы использовали английскую версию:

http://www.cbr.ru/scripts/XML_daily_eng.asp

То на замену вам подойдую любые из этих:

http://www.cbr-xml-daily.ru/daily_eng.xml
http://www.cbr-xml-daily.ru/daily_eng_utf8.xml

Кроме файлов с курсами в формате XML на нашем ресурсе вы можете получить данные в формате JSON и JSONP:

http://www.cbr-xml-daily.ru/daily_json.js
https://www.cbr-xml-daily.ru/daily_jsonp.js

Последние доступны и по https тоже. Для вашего удобства в них есть курсы на сегодняшнюю и прошлую даты. Посмотрите сами.

Вот и всё!

Время, которое вы бы потратили на переписывание и обновление старых приложений, теперь вы можете использовать и для более приятных занятий.

Как показать текущие курсы валют на сайте?

Нет ничего проще! Добавьте такой код:

<div id="USD">Доллар США $ — 00,0000 руб.</div>
<div id="EUR">Евро € — 00,0000 руб.</div>

<script>
function CBR_XML_Daily_Ru(rates) {
	function trend(current, previous) {
		if (current > previous) return ' ▲';
		if (current < previous) return ' ▼';
		return '';
	}
	
	var USDrate = rates.Valute.USD.Value.toFixed(4).replace('.', ',');
	var USD = document.getElementById('USD');
	USD.innerHTML = USD.innerHTML.replace('00,0000', USDrate);
	USD.innerHTML += trend(rates.Valute.USD.Value, rates.Valute.USD.Previous);

	var EURrate = rates.Valute.EUR.Value.toFixed(4).replace('.', ',');
	var EUR = document.getElementById('EUR');
	EUR.innerHTML = EUR.innerHTML.replace('00,0000', EURrate);
	EUR.innerHTML += trend(rates.Valute.EUR.Value, rates.Valute.EUR.Previous);
}
</script>
<script src="//www.cbr-xml-daily.ru/daily_jsonp.js"></script>

Как получить последние курсы со стороны сервера?

Добавьте такой код в /etc/cron.hourly/cbr:

#!/bin/sh
set -e
mkdir -p /var/cache/cbr
cd /var/cache/cbr
for file in daily_utf8.xml daily.xml daily_eng.xml daily_eng_utf8.xml daily_json.js
do wget --timestamping --no-verbose https://www.cbr-xml-daily.ru/$file
done 2>&1 | xargs -I{} logger --tag $0 --id=$$ "{}"

Затем дайте права на выполнение

sudo chmod +x /etc/cron.hourly/cbr
И сделайте первую загрузку
sudo /etc/cron.hourly/cbr

Эта программа будет поддерживать самую актуальную версию данных о курсах валют во всех форматах в каталоге /var/cache/cbr/

Использовать их можно, например, так:

<?php
$data = json_decode(file_get_contents('/var/cache/cbr/daily_json.js'));
echo "Обменный курс USD по ЦБ РФ на сегодня: {$data->USD->Value}";

Да, вот так просто!

Понравилось? Помогло? Сберегло время?