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

Осложнение объясняют ведущейся на сервис 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>

Курс валют ЦБ РФ для сайта на PHP

Страницы с курсом открываются медленней, чем без? Есть ответ! Вам нужно кешировать курсы. Они меняются не чаще раза в день, потому вы ничего не потеряете от обновления курсов раз в несколько часов. Для верности будем обновлять курсы раз в час:

<?php

$data = call_user_func(function () {
    $json_daily_file = __DIR__.'/daily.json';
    if (!is_file($json_daily_file) || filemtime($json_daily_file) < time() - 3600) {
        if ($json_daily = file_get_contents('http://www.cbr-xml-daily.ru/daily_json.js')) {
            file_put_contents($json_daily_file, $json_daily);
        }
    }

    return json_decode(file_get_contents($json_daily_file));
});

echo "Обменный курс USD по ЦБ РФ на сегодня: {$data->Valute->USD->Value}";

Что делает этот код:

  1. Ранее скаченные курсы будем держать в daily.json в текущем каталоге.
  2. Если файла нет или он был изменён больше чем час назад...
  3. Выгрузим новые курсы и проверим что скачка прошла успешно (функция вернула данные, а не false).
  4. Сохраним успешно выкачанные курсы в файл.
  5. Получим данные из файла, распарсим JSON и вернём объект с курсами валют ЦБ РФ.
  6. Всю операцию делаем внутри анонимной функции, чтобы случайно не перезаписать переменные, используемые в остальном коде.

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

Не пользуетесь PHP? Нет проблем! Добавьте такой код в /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->Valute->USD->Value}";

Или так:

import json

with open('/var/cache/cbr/daily_json.js') as data_file:
    data = json.load(data_file)

print(data['Valute']['USD']['Value'])

Да, вот так просто! Работает и оффлайн.

Условия использования

Разместите обратную ссылку на проект: <a href="https://www.cbr-xml-daily.ru/">Курсы ЦБ РФ в XML и JSON, API</a>

Не более 500 запросов с одного IP в час, пожалуйста.

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

Поддержите проект материально.