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

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

Выход есть!

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

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

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

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

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

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

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

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

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

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

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

Для вашего удобства в последних есть курсы на сегодняшнюю и прошлую даты. Как использовать эти курсы.

Кроме того, доступны текущие курсы в формате, совместимом с библиотекой money.js и многими другими:

https://www.cbr-xml-daily.ru/latest.js

Вот и всё!

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

Timeweb

Этот проект был бы невозможен без выделенного сервера Xeon E5 Dual от Timeweb. Сервера для любых нагрузок — от Timeweb.

На сайт Timeweb

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

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

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

И такой код в начале страницы в теге <head>:

<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>
<link rel="dns-prefetch" href="https://www.cbr-xml-daily.ru/" />
<script src="//www.cbr-xml-daily.ru/daily_jsonp.js" async></script>

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

Эта функция выгружает данные курсов и сохраняет их в статической переменной внутри функции, таким образом что при повторном вызове этой функции обращения к API не будет.

<?php

function CBR_XML_Daily_Ru() {
    static $rates;
    
    if ($rates === null) {
        $rates = json_decode(file_get_contents('https://www.cbr-xml-daily.ru/daily_json.js'));
    }
    
    return $rates;
}

$data = CBR_XML_Daily_Ru();

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

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

Не пользуетесь 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 latest.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'])

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

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

Раз, не более 5 запросов в секунду, 120 запросов в минуту с одного IP и не более 10000 запросов в сутки, пожалуйста. Если вам надо больше, то вы что-то делаете не так. Попробуйте использовать кеш данных курсов валют.

Два, разместите обратную ссылку на проект в одном из следующих форматов:

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

Администрация сайта оставляет за собой право закрыть доступ для IP и сайтов, нарушающих условия использования.

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

Помогите с оплатой услуг CDN для проекта. Услуги CDN стоят примерно 1200 рублей в месяц.

Поддержать сайт

Спонсоры сайта имеют возможность обратиться к администрации сайта с вопросами и предложениями.