Подскажите, где можно получать курсы валют, сейчас получаю с сайта cbr.ru XML файл, но порой вылетает ошибка, PHP что не удалось открыть стрим.
как правильно подключаться к cbr?
или дайте ссылку на другой ресурс, где можно получать курсы!
function getCurs($moneyCode){
// создаем объект для работы с XML
$xml = new DOMDocument();
// ссылка на сайт банка
$url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=' . date('d.m.Y');
// получаем xml с курсами всех валют
if ($xml->load($url)){
// массив для хранения курсов валют
$result = array();
// разбираем xml
$root = $xml->documentElement;
// берем все теги 'Valute' и их содержимое
$items = $root->getElementsByTagName('Valute');
// переберем теги 'Valute' по одному
foreach ($items as $item){
// получаем код валюты
$code = $item->getElementsByTagName('CharCode')->item(0)->nodeValue;
// получаем значение курса валюты, относительно рубля
$value = $item->getElementsByTagName('Value')->item(0)->nodeValue;
// записываем в массив, предварительно заменив запятую на точку
$result[$code] = str_replace(',', '.', $value);
}
// возвращаем значение курса, для запрошенной валюты
return $result[$moneyCode];
}else{
// если не получили xml возвращаем false
return false;
}
}
Ответ
ЦБ РФ не любит когда вы делаете больше чем сколько-то запросов в день. Ваш скрипт делает запрос к сервисам ЦБ РФ каждый раз когда кто-то открывает страницу. Если у вас хотя бы 1000 просмотров страниц в день, то это значит 1000 обращений к сервису ЦБ РФ. Этого количества вполне может быть достаточно чтобы забанить вас.
Если даже у вас нет никаких посетителей, на том же сервере что и ваш могут быть другие сайты, у которых такой же скрипт. Или даже хуже: автор встречал случаи когда для конвертации валют в прайс-листе для каждой строчки и для каждой валюты делался запрос за курсами валют. В прайс-листе было под тысячу позиций, а это значит для каждого скаченного прайс-листа к сайту ЦБ РФ делалось несколько тысяч запросов. Будь я вебмастером сайта ЦБ РФ, я бы тоже за такое внёс любые IP в чёрный список!
Так или иначе, попасть в чёрный список сайта ЦБ РФ очень просто. В этом случае вы будете получать такую ошибку:
failed to open stream: Redirection limit reached
Ошибка возникает потому что сайт ЦБ РФ передаёт вам куки и просит их сохранить и использовать при следующем запросе. То есть, вам придётся эмулировать браузер. И даже если вы будете эмулировать браузер, с вашим скриптом вы всё равно можете попасть в бан, из которого эмуляцией браузера не выбраться: все запросы к сайту ЦБ РФ будут сбрасываться. Как ни крути, вашим скриптом нельзя пользоваться.
Частично нивелировать проблему можно если кешировать данные после получения как минимум на несколько часов. Всё равно они обновляются лишь пару раз в день. Это сработает если это ваш выделенный сервер и никто больше кроме вас не использует похожие скрипты, засыпающие ЦБ РФ запросами.
function getCBRRates()
{
$xml_daily_file = __DIR__.'/daily.xml';
// кеш на четыре часа
if (!is_file($xml_daily_file) || filemtime($xml_daily_file) < time() - 7200) {
if ($xml_daily = file_get_contents('http://www.cbr.ru/scripts/XML_daily.asp')) {
file_put_contents($xml_daily_file, $xml_daily);
}
}
$result = array();
foreach (simplexml_load_file($xml_daily_file) as $el) {
$result[strval($el->CharCode)] = (float) strtr($el->Value, ',', '.');
}
return $result;
}
echo getCBRRates()['USD'];
Ещё лучше будет показывать данные прямо на стороне клиента, минуя серверную часть. Данные в подходящем формате можно взять с известного зеркала с курсами ЦБ РФ. Этот сайт хорошо себя зарекомендовал давней и надёжной работой.
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) {
$('#EUR').text(data.Valute.EUR.Value.toFixed(2));
});
€1 = руб.
Аналогично можно показывать курсы других валют, показывать изменение курса относительно прошлого дня, и так далее.
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) {
console.log(data.Valute.EUR);
console.log(data.Valute.USD);
console.log(data);
});
Если вы посмотрите, там есть все необходимые данные и даже отсылки к архиву курсов валют.
Комментариев нет:
Отправить комментарий