Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вывод курса валют (https://javascript.ru/forum/misc/72548-vyvod-kursa-valyut.html)

laimas 13.02.2018 04:23

По ссылке, это запрос текущего курса всех валют, а сервер запрашивает динамику курса и только по доллару за период в три дня совсем по другому адресу http://www.cbr.ru/scripts/XML_dynami...L_NM_RQ=R01235

Как видим ее нет на два дня нужных, когда она у них появится, это не ко мне вопрос. Если у них так криво или не оперативно изменяется база динамики курса, значит придется получать курсы в цикле за три дня, обрабатывать и ...

spinastr 13.02.2018 04:47

Цитата:

Сообщение от laimas (Сообщение 477929)
По ссылке, это запрос текущего курса всех валют, а сервер запрашивает динамику курса и только по доллару за период в три дня совсем по другому адресу http://www.cbr.ru/scripts/XML_dynami...L_NM_RQ=R01235

Как видим ее нет на два дня нужных, когда она у них появится, это не ко мне вопрос. Если у них так криво или не оперативно изменяется база динамики курса, значит придется получать курсы в цикле за три дня, обрабатывать и ...

Как мне сделать курс что бы каждый день обновлялся вот пример тут

Просто каждый день курс и стрелка?

laimas 13.02.2018 04:55

http://www.cbr.ru/scripts/XML_daily....req=13/02/2018

Что видим?

http://www.cbr.ru/scripts/XML_daily....req=12/02/2018

А теперь?

spinastr 13.02.2018 05:13

в первом 13 число и курс доллара 58.01
в втором 10 число и курс доллара 58.17

И что это значит и как решит проблему?

laimas 13.02.2018 05:27

Вот именно. Хотя днем ранее запрашивались от 11 числа и все было. В воскресенье и субботу торги не производятся и базе курса за эти дни не будет. Если запрашивать динамику текущую дату можно хоть концом месяца указывать все равно будет возращен последний курс для этой даты, а предыдущие даты, то есть диапазон нужно указывать с учетом выходных дней. При этом в выходные дни запрос к ЦБ делать не стоит, а использовать ранее полученные курсы.

То что по ссылке у кого-то, это только текущий курс, а не как вы хотите на текущий и вчерашний. При этом они не получают вчерашний курс, они сами хранят в базах предыдущий курс.

spinastr 13.02.2018 05:33

Помогите сделать все как надо, на выходные можно курс заморозить?

spinastr 13.02.2018 06:01

Цитата:

Сообщение от laimas
это только текущий курс

Можно сделать текущий кур с стрелко? На выходные пусть курс весит как и в пятницу. Много сайтов облазил и выходные курс заморожен!

laimas 13.02.2018 06:05

Цитата:

Сообщение от spinastr
Много сайтов облазил и выходные курс заморожен!

Он не заморожен, он просто не изменяется.

Позже сделаю, сейчас пока некогда, руками пока внесите курсы и значение rate в currnt.json. Кстати, курс может и не измениться, а значит стрелок вообще может и не быть, и это надо тоже изменить.

spinastr 13.02.2018 06:06

Тут тоже текущий курс доллара?
Ссылка

spinastr 13.02.2018 06:16

Цитата:

Сообщение от laimas
Позже сделаю, сейчас пока некогда

Спасибо, вам подожду, это примерно сколько ждать?

laimas 13.02.2018 06:43

Цитата:

Сообщение от spinastr
Тут тоже текущий курс доллара?

Это курсы Yahoo, и их можно получать без всякого РНР сервера. Удобно, но, бывает, что и нет ответа от этого сервера. Причина конечно мне не ведома. Если использовать Yahoo, то в нем нельзя указать дату запрашиваемую, поэтому нужно хранить на клиенте курс, чтобы сравнивать с чем-то для расчета динамики.

spinastr 13.02.2018 06:57

laimas,
Я лучше подожду может этот скрипт. Может удастся что придумать.

laimas 13.02.2018 07:05

Цитата:

Сообщение от spinastr
Может удастся что придумать.

А что тут думать, выходные надо учитывать. А вот вам нужно определиться чего нужно. Если курс в шапке понятен, то что такое в боксе у вас где два курса? А я об этом писал, что если в боксе два курса, то нужно их выводить с датами, в противном случае в боксе тоже должен быть один курс - за текущую дату.

laimas 13.02.2018 09:37

Этот записать в current.json

{"current":{"date":"13.2.2018","value":58.02,"rate ":1},"previous":{"date":"12.2.2018","value":58.17, "rate":1}}

Код current.php должен быть таким:

<?
$day = date('w');

if($day && $day<>6) { //если не воскресенье и суббота

    $dir = dirname(__FILE__);
    chdir($dir);

    $currency = json_decode(file_get_contents('current.json'));

    libxml_use_internal_errors();
    $xml = simplexml_load_file('http://www.cbr.ru/scripts/XML_daily.asp?date_req='.date('d/m/Y'));

    $date = date('j.n.Y', strtotime($xml->attributes()->Date));

    foreach ($xml->children() as $child) {
        if($child->NumCode==840) {
            $usd = round((float)str_replace(',', '.', $child->Value), 2);
            break;
        }
    }
    
    if($rate = $usd - $currency->current->value) $rate = $rate < 0 ? 1 : 2;
    
    $currency->previous = clone $currency->current;
    $currency->current->date = $date;
    $currency->current->value = $usd;
    $currency->current->rate = $rate;
    
    chmod($dir, 0777);
    file_put_contents('current.json', json_encode($currency));
    chmod($dir, 0700);

}
?>


В js коде вывода изменения в структуре массивов:

$('.'+k).html("$ " + o.value + ' <b class=' + ['','down','up'][o.rate] +'>' + ['','▼','▲'][o.rate] +'</b>').attr("title", o.date)

spinastr 13.02.2018 13:58

Цитата:

Сообщение от laimas
А что тут думать, выходные надо учитывать. А вот вам нужно определиться чего нужно. Если курс в шапке понятен, то что такое в боксе у вас где два курса? А я об этом писал, что если в боксе два курса, то нужно их выводить с датами, в противном случае в боксе тоже должен быть один курс - за текущую дату.


это просто для примера, нужно просто один бокс, как на том сайте. Удалить не проблема один див. На счёт даты, то при наведении, подсказка. Это в виде кнопки на панели курс и стрелка, там у меня переход на страницу с информерами.

laimas 13.02.2018 14:01

Это уже не мои проблемы, что для примера, а что надо.

spinastr 13.02.2018 14:05

laimas,

Вроде всё сделал, что дальше делать?

laimas 13.02.2018 14:08

Цитата:

Сообщение от spinastr
Вроде всё сделал, что дальше делать?

Радоваться. Если даты курсов будут некорректны, значит не делать запрос нужно не в субботу и воскресенье, а в воскресенье и понедельник. Для этого заменить здесь if($day && $day<>6) { 6 на 1.

spinastr 13.02.2018 14:22

Урааааа, спасибо посмотрим сегодня в 0:05 что будет!

spinastr 13.02.2018 14:22

laimas,
Ураааа, посмотрим что будет в 0:05

laimas 13.02.2018 14:32

Сегодня просто изменится, а вот изменения на выходные нужно контролировать начиная с пятницы по вторник. В субботу нет торгов, но в этот день курс будет равен пятничному, в понедельник торги еще не наступили, а значит курс также будет равен последнему, то есть пятничному. Исходя из это логично не делать запросов к ЦБ в воскресенье и понедельник.

laimas 13.02.2018 16:20

Красный цвет, это цвет тревоги, а у вас курс вырос - веселуха, а упал - покупать мыло с веревкой?

spinastr 13.02.2018 18:18

Цитата:

Сообщение от laimas
Сегодня просто изменится, а вот изменения на выходные нужно контролировать начиная с пятницы по вторник.

Как контролировать? будут с нова нули?

Цитата:

Сообщение от laimas
Красный цвет, это цвет тревоги, а у вас курс вырос - веселуха, а упал - покупать мыло с веревкой?

Я тоже так думаю, но смотрю везде один единый стандарт, зелёное ввер, красное в низ.

laimas 13.02.2018 18:27

Цитата:

Сообщение от spinastr
будут с нова нули?

Нет.
Цитата:

Сообщение от spinastr
Как контролировать?

По датам.

spinastr 13.02.2018 20:08

Цитата:

Сообщение от laimas
По датам.

В скрипте нужно менять каждые выходные что то?

spinastr 13.02.2018 20:10

spinastr,
стрелка пропала

spinastr 14.02.2018 00:20

теперь всё нормально, курс на 14 число!

laimas 14.02.2018 04:29

Цитата:

Сообщение от spinastr
нужно менять каждые выходные что то?

Заменить 6 на 1 и успокоится.

spinastr 14.02.2018 04:34

Цитата:

Сообщение от laimas
Заменить 6 на 1 и успокоится.

так?

https://pp.userapi.com/c831308/v8313...4tlfjmTHow.jpg

laimas 14.02.2018 04:36

Да.

spinastr 14.02.2018 15:55

Мне стал интересен ещё один вопрос.

На самом сайте ЦБ РФ

Смотрел на других сайтах и информеров, на завтра курса нет, получается только у ЦБ?

Можно также вывести такой курс со стрелкой на завтра или это уже закрытая информация?

laimas 14.02.2018 16:36

Что значит на завтра?

spinastr 14.02.2018 19:02

Цитата:

Сообщение от laimas
Что значит на завтра?

На сайте ЦБ уже есть курс доллара на завтра, выше ссылка есть.

Dilettante_Pro 14.02.2018 19:04

laimas,
Центробанк по итогам сегодняшних торгов назначает официальный курс на завтра.

Курсы валют
                                     14.02.2018          15.02.2018
Доллар США $                руб. 57,7701       руб. ↓57,5899
Евро €                            руб. 71,1670       руб. ↑71,2329

У них все официальные курсы по датам.

laimas 14.02.2018 19:19

Цитата:

Сообщение от spinastr
На сайте ЦБ уже есть курс доллара на завтра, выше ссылка есть.

В этой теме 300 постов с лишним и все об одном и том же - официальный курс валюты устанавливается по окончанию торгов на валютной бирже. Поэтому ваш планировщик и получает курс за предыдущий день в 0 часов. Это и будет курс на текущий день. Когда торги заканчиваются я не знаю, и будучи не финансистом не слежу за данным вопросом.

Если смысл "на завтра" означает, что и вам хочется сразу видеть курс измененный, а не просто как курс не на день текущий, то планировщик должен запрашивать курс не один раз в день, а раз в час, пол часа, четверть... бог его знает как вам горит.

А запись курса на сервере должна производится по итогам сравнения дат пришедшего курса и сохраненного ранее.

<?
$day = date('w');

if($day && $day<>1) {

    $dir = dirname(__FILE__);
    chdir($dir);

    $currency = json_decode(file_get_contents('current.json'));

    libxml_use_internal_errors();
    if($xml = simplexml_load_file('http://www.cbr.ru/scripts/XML_daily.asp?date_req='.date('d/m/Y'))) {

        $date = strtotime($xml->attributes()->Date);
        
        if($date > strtotime($currency->current->date)) {
        
            foreach ($xml->children() as $child) {
                if($child->NumCode==840) {
                    $usd = round((float)str_replace(',', '.', $child->Value), 2);
                    break;
                }
            }
    
            if($usd) {
        
                if($rate = $usd - $currency->current->value) $rate = $rate < 0 ? 1 : 2;
    
                $currency->previous = clone $currency->current;
                $currency->current->date = date('j.n.Y', $date);
                $currency->current->value = $usd;
                $currency->current->rate = $rate;
    
                chmod($dir, 0777);
                file_put_contents('current.json',json_encode($currency));
                chmod($dir, 0700);
            }
        }
    }
}
?>


PS. Можно даже убрать условие if($day && $day<>1) и запрашивать курс каждый день, все равно при равенстве дат пришедшего и сохраненного он не изменится на сервере.

spinastr 14.02.2018 22:03

laimas,

Понятно, просто скопировать и вставить?
А в js менять ничего не нужно?

spinastr 15.02.2018 00:56

spinastr,

Вроде всё работает


Верно скрипт дописал?

<script> 
//именно такое и получит Ajax 
$.getJSON("доме.ру", function(data) { 
$('.usddata').html(data.current.date);
$('.usddata2').html(data.previous.date);
//и вот тут данные этого объекта помещаются на свои места 
$.each(data, function(k, o) { 
$('.'+k).html("$ " + o.value + ' <b class=' + ['','down','up'][o.rate] +'>' + ['','▼','▲'][o.rate] +'</b>').attr("title", o.date) 
}) 
}); 
</script>

spinastr 15.02.2018 03:15

Странно на одной странице сайта, после скролинга начинает мигать мышка при наведении и показе даты

.attr("title", o.date)


На этой странице установлено два курса в div блоке. Как бы отдельная страница с полным курсом.

spinastr 15.02.2018 05:45

laimas,
Если я попробую в ваш скрипт вставить Яндекс погоду? https://pogoda.yandex.ru/static/cities.xml
То смогу тоже вывести погоду так? Как и валюту?

laimas 15.02.2018 05:55

Цитата:

Сообщение от spinastr
$('.usddata').html(data.current.date);
$('.usddata2').html(data.previous.date);

Это из каких соображений и зачем?


Часовой пояс GMT +3, время: 06:34.