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

spinastr 08.02.2018 14:53

laimas,

Спасибо вам! Но я не понимаю, у меня на стороннем хостинге есть место, туда залито два скрипта, php ссылки на них выше. Они отображают курс всё работает хорошо, есть крон который планирует и обновляет.

Но я ничего не понимаю что выше написано)))

Если можно всё точно по порядку разложить я на сервере сделаю и добавлю нужный файл.

spinastr 08.02.2018 14:54

Цитата:

Сообщение от j0hnik (Сообщение 477295)
<li>
	<div class="wow fadeInLeft animated" style="visibility: visible; animation-name: bounceIn;">
		<a href="index/grafik_kursa_valjut/0-167" title="СЮДА ВЫВЕСТИ ДАТУ - Посмотреть курс валют">
			<div id="usd"></div> 
		</div>
	</a>
</li>


Старайтесь форматировать, так будут ошибки заметнее.
Посмотрите внимательно


Не понял, как нужно написать в скрипте что бы туда добавить дату?

j0hnik 08.02.2018 15:05

<li>
	<div class="wow fadeInLeft animated" style="visibility: visible; animation-name: bounceIn;">
		<a href="index/grafik_kursa_valjut/0-167" title="СЮДА ВЫВЕСТИ ДАТУ - Посмотреть курс валют">
			<div id="usd"></div> 
		</a>
	</div>
</li>


найдите отличия?? ;)


$('#usd').parent().attr('title', data.Date +"- Посмотреть курс валют");

spinastr 08.02.2018 15:08

$('#usd').html("$&nbsp;&nbsp;" +data.Valute.USD.Value.toFixed(2) +trend);
$('#usd').parent().attr('title', data.Date +"- Посмотреть курс валют");


В скрипт добавить новый массив?

j0hnik 08.02.2018 15:10

$('#usd').html("$&nbsp;&nbsp;" +data.Valute.USD.Value.toFixed(2) +trend).parent().attr('title', data.Date +"- Посмотреть курс валют");


вот так можно сразу

spinastr 08.02.2018 15:16

j0hnik,

Спасибо, работает.

Сейчас друга попросил, он зашёл с телефона и у него показывает вообще вчерашний курс.

ЧТо делать? пипец какойто)))

тут описано

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

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



Может это выход из положения? у меня есть хостинг может там как что сделать?

laimas 08.02.2018 15:22

Цитата:

Сообщение от spinastr
у меня на стороннем хостинге есть место, туда залито два скрипта

Не надо двух скриптов выполняющих одну задачу. Используя xml, получить курс доллара:

if(PHP_SAPI == 'cli') {
    //установить директорию, все необходимые подключения производить относительно этой директории
    chdir(dirname(__FILE__));
 
    //получение курса доллара
    $prev = date('d/m/Y', strtotime('-1 day')); //предыдущая дата
    $curr = date('d/m/Y'); //текущая дата

    $xml = simplexml_load_file('http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$prev.'&date_req2='.$curr.'&VAL_NM_RQ=R01235');

    $usd_prev = $xml->Record[0]->Value; //курс за предыдущую дату
    $usd_curr = $xml->Record[1]->Value; //курс за текущую дату
    
    //здесь сохранить полученные курсы
    //если сохранять не в базе, то в закрытой от прямого доступа директории  
}


Этот скрипт должен выполнять планировщик в 0 часов.

Второй скрипт должен быть скриптом отдающим курсы, которые он должен получать из сохраненных. И это будут index.php. В нем код:

header('Access-Control-Allow-Origin: имя вашего домена, который запрашивает курс');
//получить сохраненные курсы, и отдать их в виде JSON
//как конкретно, зависит от того как сохранялось
//отдаем курс клиенту и выход
exit($currency);

spinastr 08.02.2018 15:30

Так))

Я создаю два файла PHP, первый файл это первый скрипт, второй файл это второй скрипт.

Добавляю в папку

Заливаю в папочку на свой хостинг

Ставлю таймер в кроне на индех.пхп

А дальше что?

как отдуда вытянуть на мой сайт где нету php в формате $ 56.77 ▲

Нужно наверно какойто скрипт создать, который будет передавать данные в блок?

laimas 08.02.2018 15:51

Скрипт первый, это тот который должен запускать cron. Если планировщик сервера позволяет запускать скрипты из закрытых папок, то хорошо, создать такую папку, например, current, в которую и поместить этот скрипт. В эту же папку поместить и файл .htaccess с содержанием:

<Files *>
Deny from all
</Files>

Пусть сохранение полученного курса будет в файл, в json формате. То есть со строки 15 этого файла должно быть:

file_put_contents('current.json', json_encode['usd'=>[
    date('j.n.Y', strtotime($curr)) => $usd_curr, //текущая дата => курс
    date('j.n.Y', strtotime($prev)) => $usd_prev //предыдущая дата => курс
]]);


Клиент обращается к этому домену, то есть будет запрос к index.php. В нем заменить exit($currency) на:

exit(file_get_contents('current/current.json'))


Клиент получит json

{usd: {
      '8.2.2018' : 'xx.xxxx',
      '7.2.2018' : 'xx.xxxx'
   }
}

spinastr 08.02.2018 19:54

laimas,

Верно всё сделал?

Nexus 08.02.2018 20:54

Цитата:

Сообщение от laimas
file_put_contents('current.json', json_encode['usd'=>[
    date('j.n.Y', strtotime($curr)) => $usd_curr, //текущая дата => курс
    date('j.n.Y', strtotime($prev)) => $usd_prev //предыдущая дата => курс
]]);

Вы случаем не потеряли скобки функции "json_encode"?

laimas 08.02.2018 20:55

А больше картинки не нашлось?

Последнее, подробнее и практически полное. Более писать подробности не буду.

1) Создать на сервере папку current, с правами 644 (уточнить у хостера), закрыв прямой доступ к ней через .htaccess, то есть поместить этот файл в папку current. Этот файл так и называется - с точкой вначале без всяких подстановок kurs и прочей белиберды, а также не имеет никакого расширения. В нем должны быть строки которые я ранее приводил.

2) Узнать - если на сервере cron выполняет скрипты из закрытого каталога, то код следующего файла поместить в папку current под именем current.php. Если нет, то поместить его под этим именем в корень документов (это там где и индексный файл), при этом код этого файла поместить в условие показанное ниже:
<?
if(PHP_SAPI == 'cli') {
    //тут далее код файла current.php, естественно без РНР тегов <? и ?>
}
?>


current.php
<?
$dir = dirname(__FILE__);
chdir($dir);

libxml_use_internal_errors();
if($xml = simplexml_load_file('http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.date('d/m/Y', strtotime('-2 day')).'&date_req2='.date('d/m/Y').'&VAL_NM_RQ=R01235')) {
    $last = round((float)str_replace(',', '.', current($xml->Record[0]->Value)), 2);
    $usd_prev = round((float)str_replace(',', '.', current($xml->Record[1]->Value)), 2);
    $usd_curr = round((float)str_replace(',', '.', current($xml->Record[2]->Value)), 2);
    
    chmod($dir, 0777); //уточнить у хостера
    
    file_put_contents('current.json',
        json_encode([
            'current' => [
                'date' => date('j.n.Y'),
                'value' => $usd_curr,
                'rate' => $usd_curr > $usd_prev ? '▲' : '▼' 
            ],
            'previous' => [
                'date' => date('j.n.Y', strtotime('-1 day')),
                'value' => $usd_prev,
                'rate' => $usd_prev > $last ? '▲' : '▼'
            ]
        ], JSON_UNESCAPED_UNICODE)
    );
    
    chmod($dir, 0644); //уточнить у хостера
}
?>


Курс за три дня, чтобы динамику предыдущего дня получить. JSON ответа:

{"current":{"date":"8.2.2018","value":56.95,"rate":"▼"},"previous":{"date":"7.2.2018","value":57.22,"rate":"▲"}}


index.php
<?
header('Access-Control-Allow-Origin: http://h116641.s08.test-hf.su');
header('Vary: Origin');
header('Access-Control-Allow-Methods: GET');
header('Content-type: application/json; charset=utf-8');
exit(file_exists('current/current.json') ? file_get_contents(current/current.json) : json_encode(false));
?>


<Files *> к РНР отношения не имеет, это в .htaccess, в РНР файле это:

<Files *>
header ....

просто вызовет фатальную ошибку.

На клиенте:

$.getJSON(url домена, function(data) {
    if(data) {
        //думаю дальше пояснять уже не надо
    } else {
        //еще не было сохраненного курса на сервере
        //решать не мне что делать, но можно на сервер поместит json файл, к котором прописать вручную данные, а cron обновлять будет
    }  
})

laimas 08.02.2018 21:19

Цитата:

Сообщение от Nexus
случаем не потеряли скобки функции "json_encode"?

Слава богу, что вообще что-то есть, клава на батарейках, ближе к концу ресурса то теряет, то пиииииииииииишет лишнее. :D

spinastr 09.02.2018 01:03

Цитата:

Сообщение от Nexus (Сообщение 477330)
Вы случаем не потеряли скобки функции "json_encode"?

Нужно там двойные скобки поставить?

spinastr 09.02.2018 01:26

Спасибо всем кто
мне помогает очень благодарен.


Но я не понимаю 70% что там выше написано)))


в них добавил всё как есть выше. на хостинге www.host-food.ru есть крон.

Что дальше делать? Я сижу в инвалидной коляске и делаю сайт небольшого портала города, решил вывести курс доллара в обычный числовой формат $ 56.77 ▲

Если кто может, покажите очень подробно что делать, дальше?

laimas 09.02.2018 02:16

spinastr,
может пора определится, что нужно?

Читайте внимательно, вникайте, мечетесь как белка в колесе.
Я выделил красным имя файла .htaccess для вас специально, чтобы раз и навсегда вы уяснили, что в рамках веб сервера Apache, это специальное зарезервированное имя.

.htaccess.txt - это все что угодно, но не .htaccess
xxxx.htaccess - это все что угодно, но не .htaccess
xxxx.htaccess.txt - это все что угодно, но не .htaccess

Правильно только так .htaccess !!!

Это сложно тоже понять, что на севере должна быть такая структура каталог-файлы:

current
   .htaccess
   current.php
index.php


Как правильно задать путь cron на файл current/current.php в описаниях планировщика на хостах написано, если нет возможности просто выбора файла.

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

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

spinastr 09.02.2018 02:52

laimas,

Нужно, передать курс цифры образец $ 56.77 ▲

Есть хостинг с кроном, на нём стоит динамическая обложка vk, скрипт, который берёт вакансии с сайта и через api ucoz, автоматически публикует объявление. (php дорого не подключа на самом юкозе)

На хостинге создать скрипты которые передадут на мой сайт числа, который я от стилизую через php.

Я понял про структуру, папка и в ней 3 файла. Так у меня и получилось.


Что делать дальше?

laimas 09.02.2018 03:24

Цитата:

Сообщение от spinastr
Я понял про структуру, папка и в ней 3 файла

Блин, ну слов нет. Читать не торопясь и внимательно.

1) Есть ведь рабочий сайт, которому и нужны курсы, ну что мешает через FTP посмотреть структуру его каталогов/файлов?
Хост выдает вам готовую структуру каталогов, в которой будут один особенный каталог, который и будет является доменом для доступа извне на этот хост. Этот каталог называется публичным и для домена является корнем документов. Имя этого каталога может быть какое угодно: docs, html, etc и прочие фантазии хоста.

То есть запрос в браузере http://domain/ или http://domain означает, что сервер обеспечит доступ к публичному каталогу домена. Но чтобы браузер что-то получил сервер запускает индексный файл публичной папки. Имя индексного файла тоже может быть любым, это определяется настройками на сервере. По умолчанию для РНР, как серверного языка, таким именем является index.php.

А когда говорят - "создать на сайте папку ....", то это означает - в корне документов (в публичной папке) создать эту папку.

Если бы я сказал создать папку current для того чтобы в браузере иметь доступ к ней по адресу http://domain/current/, тогда бы сервер для ответа браузеру искал в этой папке также индексный файл, то есть таковой был бы нужен. Но я постоянно твержу, что эта папка будет закрыта для прямого доступа посредством файла .htaccess и запрос ее или любых файлов из нее вернет 403 - доступ запрещен. Это и требуется.

То есть структура папок и файлов на сервере должна быть (в корне документов, хрен знает как этот каталог на вашем сервере называется)

current - папка с файлами в корне документов, в ней 2 файла: .htaccess и current.php.

Файл index.php расположен в корне документов, а не в папке current.

Что непонятного?

laimas 09.02.2018 03:36

Не вываливайте картинки размером с футбольное поле, они бесят, ибо не всегда я за компом с экраном Full HD, могу и с меньшего разрешения работать.

2) На сервере под Unix системами папки и файлы имеют права, обычно у папок права 644, что и видно по вашей картинке. Но в папку с такими правами скрипт не сможет что-то записать, будет ошибка. Для этого дают права, бывает достаточно и 755, но чаще используют полные 777, а после записи вновь возвращают 644. Файл current.php записывает полученные курсы в файл в папку current, поэтому в скрипте и задаются права на папку функцией chmod():

chmod($dir, 0777); - тут дали права на запись

записали в файл

chmod($dir, 0644); - вернули прежние права

Две эти строки кода имеют комментарий //уточнить у хостера. Дело в том, что права можно задать как 777 и как 0777. С нулем или нет, это и нужно определить, для этого есть техподдержка, да и просто faq на хосте по наиболее частым вопросам есть.

Узнать и в коде прописать как надо - с нулем или без.

spinastr 09.02.2018 03:36

laimas,
index.php

Вытащить в корень?

Может лучше из готового скрипта вытащить данные?

spinastr 09.02.2018 03:56

laimas,

вот тут ошибка 403


у хостера спросил про права и нули жду ответа

laimas 09.02.2018 04:02

3) и важное

Почему закрытая папка с запретом на внешний доступ? Потому, что файлы конфигураций, системные/служебные файлы не являются публичными. Если разрешить вызов (значит его запуск) файла current.php браузером, то любой желающий может генерировать запросы к ЦБ, что может закончится плачевно - ЦБ заблокирует доступ к своим ресурсам для вашего сайта.

Можно вообще разрешить доступ к этому сайту только одному домену - сайту который у вас и выводит курс на странице. Это можно сделать также посредством .htaccess, но который будет располагаться в корне документов (еще раз прочесть 1), чтобы вспомнить что это такое). В этом .htaccess можно указать IP сайта который выводит курс. Все. Всем остальным будет отлуп, включая и поисковых роботов, им там тоже делать нечего. Но это для справки и делать не обязательно, просто закроем папку current.

Но нужно выяснить - на хосте будут ли исполняться РНР скрипты из закрытой папки. Это только в техподдержке можно узнать. Если запускаются, то все ОК, и вся структура на сайте будет такая как описано выше. Но если нет, то в папке current будут только два файла: .htaccess и файл с курсами, который будет записывать скрипт - current.json.

А файл current.php придется вынести из папки в корень документов. То есть структура на сервере будет такая:

current
    .htaccess
    current.json
current.php
index.php


Но в этом случае файл current.php становится доступным для внешнего доступа, то есть не проблема его запускать в браузере по адресу http://domain/current.php. Чтобы этого не допустить, в этом случае можно разрешить запуск скрипта в этом файле только если он будет запущен из под командной строки, что и будет в случае запуска его по cron. Для этого код файла current.php немного дополнить, поместив код в условие if(PHP_SAPI == 'cli') { тут код }, о чем я писал ранее. В коде current.php также нужно будет заменить путь записываемого файла, вот эта строка file_put_contents(\'current.json\', должна быть такой - file_put_contents(\'current/current.json\',



При этом для php скриптов доступ к закрытой папке никак не ограничен так как они выполняются от имени владельца.

Понятно что нужно выяснить и что сделать если ...?

laimas 09.02.2018 04:07

Цитата:

Сообщение от spinastr

Кто будет читать пост https://javascript.ru/forum/477344-post56.html и вникать что и как? Ну сколько можно говорить об этом бедном индексном файле и где он должен быть? С какого хрена он оказался в папке current?

Вот адрес это должно быть адресом сайта http://h116641.s08.test-hf.su/index.php или просто http://h116641.s08.test-hf.su/. А доступ к http://h116641.s08.test-hf.su/current/ и должен возвращать 403! Читать https://javascript.ru/forum/showpost...0&postcount=62

spinastr 09.02.2018 04:07

Вот сделал так

https://pp.userapi.com/c840226/v8402...zHVvKcS8ns.jpg


на хостинге папка www там файл index.php. И папка current с двумя файлами ( .htaccess и current.php)

ссылка http://h116641.s08.test-hf.su/index.php - в корне

spinastr 09.02.2018 04:15

Всё верно сделал никто не сможет поменять что то? так как файл current.php закрыт .htaccess А index.php в корне?

Теперь что делать ждать ответ тех поддержки?

laimas 09.02.2018 04:27

4)

Я не буду разбираться что есть что среди ваших доменов, какой РНР, какой хочет курс у РНР. Я напишу условно, далее сами подставляйте реальное в код.

Пусть домен (сайт) запрашивающий курс валюты у ЦБ, это http://domain_1
Домен который выводит курс на страницу и которому он и нужен, это домен http://domain_2

Тогда код индексного файла будет таким:

<?
header('Access-Control-Allow-Origin: http://domain_2');
header('Vary: Origin');
header('Access-Control-Allow-Methods: GET');
header('Content-type: application/json; charset=utf-8');
exit(file_get_contents('current/current.json'));
?>


Я убрал проверку наличия файла курса, вот эту строку:
exit(file_exists('current/current.json') ? file_get_contents(current/current.json) : json_encode(false));

Приготовьте такой файл (current.json) и поместите его в папку current. Это можно сделать запустив и current.php, но не хочу еще кучи долгих пояснений, поэтому возьмите этот текст как исходный:

{"current":{"date":"8.2.2018","value":56.95,"rate" :"▼"},"previous":{"date":"7.2.2018","value":57.2 2,"rate":"▲"}}

В браузере запросить курс за три дня http://www.cbr.ru/scripts/XML_dynami...L_NM_RQ=R01235, указав в параметрах: date_req1=минус два дня от текущей даты, date_req2=текущую дату, в формате dd/mm/YYYY. Ручками все просчитать, заменив в тексте выше, и этот текст сохранить в папке current под именем current.json.

На клиенте Ajax запрос будет к http://domain_1/, а проверка пришел ли ответ будет уже не в плане есть ли уже курс на http://domain_1, он гарантированно есть, а в плане вернул ли вообще сервер ответ (ошибки и т.п.).

laimas 09.02.2018 04:29

Цитата:

Сообщение от spinastr
Всё верно сделал никто не сможет поменять что то? так как файл current.php закрыт .htaccess А index.php в корне?

Да.

Цитата:

Сообщение от spinastr
Теперь что делать ждать ответ тех поддержки?

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

spinastr 09.02.2018 04:43

индекс файл изменил, подставил доммен сайта.

создать пустой файл (current.json) в блокноте в utf-8 и загрузить в (current)?


Дальше это куда?

{"current":{"date":"8.2.2018","value":56.95,"ra te" :"▼"},"previous":{"date":"7.2.2018","value":5 7.2 2,"rate":"▲"}}

Я не знаю js и php как что дальше запрашивать не знаю

spinastr 09.02.2018 04:45

Мой хостинг не забъётся от запросов? у меня на хостинге всего 50 мб

laimas 09.02.2018 04:55

Дополнение к посту https://javascript.ru/forum/showpost...4&postcount=66

Можно приготовить файл current.josn и не ручками. Хороший хост не только предоставляет услуги планировщика, но и имеет хороший сервис по нему. Если в число таких сервисов входит и возможность запуска планировщика в ручную, нужно просто запустить его, не дожидаясь 0:00 часов.

spinastr 09.02.2018 04:57

У меня в папке 3 файла верно?



внутри current.json такой текст?
{"current":{"date":"8.2.2018","value":56.95,"ra te" :"▼"},"previous":{"date":"7.2.2018","value":5 7.2 2,"rate":"▲"}}

Верно?

spinastr 09.02.2018 05:00

в файле индекса, появилась строчка, которая написана в current.json

laimas 09.02.2018 05:01

Цитата:

Сообщение от spinastr
Мой хостинг не забъётся от запросов? у меня на хостинге всего 50 мб

Доступный объем на диске не является регулятором запросов к сайту. Макс. число одновременных запросов к сайту определено конфигурацией хоста.

Код индексного файла для РНР интерпретатора, это хрен знает какая маленькая доля мимисекундочки, чтобы думать о нагрузке.

spinastr 09.02.2018 05:01

у меня есть авто выполнение скрипта

laimas 09.02.2018 05:01

Цитата:

Сообщение от spinastr
У меня в папке 3 файла верно?

Да.
Цитата:

Сообщение от spinastr
внутри current.json такой текст?
{"current":{"date":"8.2.2018","value":56.95,"ra te" :"▼"},"previous":{"date":"7.2.2018","value":5 7.2 2,"rate":"▲"}}

Верно?

Да.

spinastr 09.02.2018 05:02

Что дальше делать?

laimas 09.02.2018 05:03

Цитата:

Сообщение от spinastr
у меня есть авто выполнение скрипта

Ну значит все верно, хост работает.

Если в заголовке указан верный домен, то теперь только за клиентом вопрос.

spinastr 09.02.2018 05:05

laimas,

Если в заголовке указан верный домен, то теперь только за клиентом вопрос.

Это в индексе? Там прописан мой доммен, хостинга.


Что значит за клиентом вопрос?

spinastr 09.02.2018 05:06

Автообнавление скрипта нужно включать самому я ещё невключал

laimas 09.02.2018 05:06

Цитата:

Сообщение от spinastr
Что дальше делать?

Открыть первые посты темы, где показывался код обработки запроса к "https://www.cbr-xml-daily.ru/daily_json.js, заменить это адрес на домен своего РНР сайта, и в функции учесть имена свойств своего json, а также то, что он уже возвращает все готовое - дату, курс, стрелочки, значит просто получить их из data и вывести на страницу.


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