Вы не авторизованы.
Обыскал весь форум, и гууугл, и удивился, что никому в Украине не интересен этот вопрос.
Если плохо искал, направьте в нужную тему.
Помогите пожалуйста решить задачку периодической загрузки текущего коммерческого курса валют (доллара и евро) из какого-нибудь банка Украины, для занесения его в переменные CURR_USD и CURR_EUR.
Для информации нашел в Приватбанке следующую статью, но так как в этом языке мало чего понимаю, то не могу реализовать эту загрузку:
Нужен ли для этого крон?
Для получения наличных курсов валют и драгоценных металлов, необходимо послать GET запрос на адрес:
https://privat24.privatbank.ua/p24/acco … p;coursid=
где:
coursid - идентификатор курсов в системе банка. Не обязательный параметр. По умолчанию возвращает курс банка по трем основным валютам (рубль, доллар, евро) и курс золота. Может принимать следующие значения:
* 3 - курсы НБУ
* 5 - курсы Приватбанка по всем валютам
Например, для того что-бы получить курс НБУ Вам необходимо сформировать и отправить следующий запрос:
https://privat24.privatbank.ua/p24/acco … ;coursid=3
В ответе на этот запрос Вы получаете следующий ответ:
<account_order>
<support/>
<version buildNum="2042" buildDate="Thu Nov 29 10:40:45 EET 2007"/>
<logged sessioncount="1073" visitscount="298"/>
<locale language="ru">
<date id="20090807T17:21:59" traditional="07.08.2009">07 авг 2009,Пт 17:21:59</date>
</locale>
<request url_base="https://privat24.privatbank.ua/p24/" url="/accountorder" os="Win" win="Y" ie="N"/>
<info>
<role id="2"/>
<dump exchange="" oper="prp" PUREXML="" coursid="3"/>
</info>
<row>
<exchangerate ccy="EUR" base_ccy="UAH" buy="11.35000" sale="11.35000"/>
</row>
<row>
<exchangerate ccy="USD" base_ccy="UAH" buy="8.10000" sale="8.10000"/>
</row>
</account_order>
где Вас интересуют узлы exchangerate и его аттрибуты, которые имеют следующие заначения:
* ccy - код валюты (о том какие они существуют, Вы можете посмотреть здесь)
* buy - курс покупки
* sale - курс продажи
Всем спасибо за отклик.
Отредактировано velopro (2010-06-10 10:46)
Неактивен
Всем холла!
nictboom, плохой код. Смотри, возьмем посещаемость в 300 человек в сутки, каждый из которых просмотрит 20 страниц магазина, получиться что 6000 раз будет загружаться и парситься xml. Это увеличение нагрузки на сервер, это увеличение времени генерации страниц, и да, если ufs_kiev_ua лег - то будет сыпать ошибками.
velopro
Так загрузить наличные курсы валют всех банков можно на том же ufs - http://ufs.com.ua/xml/cash_fx.php
Например так:
$mfo = 305299; //МФО ПриватБанка, можно вписать другой нужный банк $cource = array(); //Массив с курсами, нужно пользовать как $cource['USD'] $url = @file_get_contents("http://ufs.com.ua/xml/cash_fx.php"); if($url){ $xml = new SimpleXMLElement($url); foreach($xml->currency as $c) {switch($c['name']){ case "USD": foreach($c->bank as $b) if($b['mfo']==$mfo) $cource['USD']=floatval($b->bid); break; case "EUR": foreach($c->bank as $b) if($b['mfo']==$mfo) $cource['EUR']=floatval($b->bid); break; case "RUR": foreach($c->bank as $b) if($b['mfo']==$mfo) $cource['RUR']=floatval($b->bid); break; }}}
Если нужно конкретно с Привата грузить, то по аналогии пишите парсер, у меня проблема с openssl, поэтому https распарсить не могу.
all
Хранить полученные курсы нужно локально (var_export, file_put_contents, да что угодно), обновлять их каждые 2-4 часа, например. Если текущая дата больше чем дата файла плюс 4 часа, локать файл курсов, загружать курс, записывать в файл, дата файла соответственно измениться. Получаеться, что нужно всего одну маленькую проверку и все, нагрузка не увеличиваеться. С кроном еще легче.
Неактивен
СПАСИБО mihbel
Всем холла (интересно это на каком языке
)!
nictboom, плохой код.
Зато первый отклинувшийся. Лучше скажем - специфический код.
Хранить полученные курсы нужно локально (var_export, file_put_contents, да что угодно)
Ну не дорос я еще до таких "вершин", покажите пожалуйста, что нужно дописать после вашего кода, чтобы курс валют попал в переменные CURR_USD и CURR_EUR.
С кроном еще легче
Именно, хотелось бы решать эту задачу с помощью крона, по моему это самый оптимальный вариант. Опять же, какой файл нужно вписывать в крон?
В общем хотелось бы чтобы все выглядело так: крон ежечасно, спокойно, не нагружая чужой сайт, загружает курс валют, они записываются в свои переменные. Соответственно при изменении курса меняется и стоимость товара, зафиксированного в данной валюте. Покупатель видит правильную стоимость.
Неактивен
Решил вернуться к начатой теме и о "чудо" - сайт ufs.com.ua с курсами валют повис.
При запросе, в переменные выдает конечно нули, и соответственно на сайте происходит деление на ноль и куча ошибок
Warning: Division by zero in /home/motor/domains/moto-r.org/public_html/test1/includes/hits.php on line 36
.....
Естественно к основной задаче добавляется дополнительная задача - определение повисшего сайта с котировками, и если ноль - то переход на ручной ввод курсов или на последний сохраненный курс.
Кому это интересно делитесь мыслями.
Кстати, до сих пор не разобрался, как полученный курс передать нужным переменным? Сейчас все выглядит так: когда в админке ставишь галку на автозагрузку валют и нажимаешь кнопку "сохранить" курсы загружаются и появляются каждый в своем поле. Но на расчет цены товара это не влияет, она считается по старому курсу. Только после того, как второй раз нажмешь "сохранить", тогда когда в полях валют уже новые курсы, то только в этом случае цена товара вычисляется по новым курсам.
Подскажите кто-нибудь, как же все таки правильно оформить загрузку валют (с учетом последних новостей), и что писать в кроне?
Доработку предложенную mihbel вписал в файл includes/admin/conf.php
//curansy values
if (CONF_CURRENCY_AUTO == 1)
{
$mfo = 305299; //МФО ПриватБанка, можно вписать другой нужный банк
$cource = array(); //Массив с курсами, нужно пользовать как $cource['USD']
$url = @file_get_contents("http://ufs.com.ua/xml/cash_fx.php");
if($url){
$xml = new SimpleXMLElement($url);
foreach($xml->currency as $c)
{switch($c['name']){
case "USD": foreach($c->bank as $b) if($b['mfo']==$mfo) $cource['USD']=floatval($b->ask); break;
case "EUR": foreach($c->bank as $b) if($b['mfo']==$mfo) $cource['EUR']=floatval($b->ask); break;
}}}
define("CURR_USD", round($cource['USD'], 2));
define("CURR_EUR", round($cource['EUR'], 2));
}
else {
define('CURR_USD', CONF_CURRENCY_USD);
define('CURR_EUR', CONF_CURRENCY_EUR);
}
Отредактировано velopro (2010-08-03 13:34)
Неактивен
Расскажите как для Беларуси сделать? Буду очень признателен.
Неактивен
пока знатоки молчат
Неактивен
rvv написал:
Расскажите как для Беларуси сделать? Буду очень признателен.
Ну еще можно заняться извращением
На ЦБ РФ есть же курс руб/бел. (что там у Вас)
Берем этот курс, и начинаем вспоминать математику, из него можно вычислить отношение к доллару и евро
Неактивен
sibbear написал:
rvv написал:
Расскажите как для Беларуси сделать? Буду очень признателен.
Ну еще можно заняться извращением
На ЦБ РФ есть же курс руб/бел. (что там у Вас)
Берем этот курс, и начинаем вспоминать математику, из него можно вычислить отношение к доллару и евро
Уважаемый sibbear, а можно поподробнее.(((
Отредактировано rvv (2010-09-10 05:53)
Неактивен
Нет, это точно извращение, причем оно не решает проблему.
У нас в одном банке один курс, в другом - другой, а пересчет через Россию вообще даст что-то третье.
Расчеты у меня с поставщиками фиксируются по курсу определенного банка. Так что это не выход.
Неактивен
velopro:
если у Вашего банка есть что то вроде представленного на данной сборке(xml или php) welcom.
Неактивен
Все что нашел пока, вот здесь - http://bank-ua.com/export/currrate.xml
Помогите уж пожалуйста nictboom добить этот вопрос. И упомяните про крон тоже, никогда с ним еще не работал.
Неактивен
velopro:
до крона так и не дошел. оставил прежний/изначальный вариант. изменил только некоторые поля/значения и формулы. у меня весь продукт/товар вводится в $-ах. если мне нужно делаю пересчёт в том же xls-e если для экспорта.
Отредактировано nictboom (2010-10-01 22:23)
Неактивен
не совсем вас понял, прежний/изначальный вариант - это какой?
Неактивен
да стандартный вариант из 30-ки, только другой банк + незначительные изменения в prod_det.php и categ.php(формула)
Отредактировано nictboom (2010-10-04 12:57)
Неактивен
жаль, меня он не устраивает.
что же тогда означало ваше велком?
Неактивен
Для своего проекта использую курсы валют в xml. Нравиться что бесплатно и есть курсы по многим банкам.
Отредактировано dimbarak (2012-02-27 01:53)
Неактивен
где ж там бесплатно?
Неактивен
Дают доступ если разместить ссылку, полностью бесплатно.
Неактивен
https://api.privatbank.ua/p24api/pubinf … ;coursid=4 - курсы можно брать здесь.
А вот как их передать в настройки самому интересно!!!
Неактивен