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

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

Выход есть!

1. Подключаете этот скрипт со встроенной библиотекой money.js.

<script src="https://www.cbr-xml-daily.ru/money.js"></script>

2. Конвертируете из любой валюты в любую по курсам ЦБ РФ.

fx(100).from("USD").to("RUB");
fx(15).from("USD").to("GBP");

Всё! Вот так просто.

А если без скриптов?

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

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

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

Вот и всё!

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

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

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

<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 и хостинг обходятся в сумму порядка 25600 рублей в месяц.

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

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