Курс доллара

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Курс доллара

Сообщение Amarok » Пт фев 21, 2014 5:25 pm

Пытаюсь вытащить курс доллара.
Создаю веб-переменную, в поле ссылка пишу http://www.cbr.ru/scripts/RssCurrency.asp.
В поле Шаблон поиска вбиваю <br> Доллар США (.+?)<br>.
И не работает. Где ошибка?
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Курс доллара

Сообщение LutsenkoDenis » Пт фев 21, 2014 10:08 pm

При иcпользовании Rss, важно знать номинал валюты(отношение к рублю) т.к. в RSS'ке можно заметить следующие строки:
Белорусский рубль - 36,5228
Доллар США - 35,6828
Отношение к рублю у них такое 36,5228 рублей за 10000 белорусских рублей и 35,6828 рублей за 1 доллар США

И кстати, не проще опрашивать общедоступный сервис центробанка РФ?
Заодно и парсить ничего не нужно будет...

Веб - сервис: http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx

При работе без использования .NET Framework для доступа к веб - сервису необходимо установить SOAP клиент и MSXML4.0 с сайта Microsoft.
SOAP Toolkit 3.0
MSXML 4.0

Описание методов сервиса:
GetCursOnDate(On_date) получение курсов валют на определенную дату (ежедневные курсы валют), GetSeldCursOnDate (ежемесячные курсы валют)
Аргументы:
On_date - Дата запроса для курсов, формат - System.DateTime
Результат:
XML документ в формате System.Data.Dataset, содержащий таблицу [ValuteCursOnDate],
таблица содержит поля:
Vname - Название валюты
Vnom - Номинал
Vcurs - Курс
Vcode - Цифровой код валюты
VchCode - Символьный код валюты
Последний раз редактировалось LutsenkoDenis Сб фев 22, 2014 12:49 am, всего редактировалось 1 раз.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Курс доллара

Сообщение LutsenkoDenis » Сб фев 22, 2014 12:24 am

Давным давно писал класс для получения курса, но у себя найти не смог.
Из того что было в инете нашел этот класс. Работает.

Вобщем вот...
ExchangeRatesCBRF.php

Код: Выделить всё

<?php

/**
 * ExchangeRatesCBRF short summary.
 *
 * ExchangeRatesCBRF description.
 *
 * @author idivision.ru
 * @author LDV at silvergate.ru
 */
class ExchangeRatesCBRF
{
   var $rates;
   
   /**
    * @param mixed $date 
    */
   function __construct($date = null)
   {
      $client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL"); 
      if (!isset($date)) $date = date("Y-m-d"); 
      $curs = $client->GetCursOnDate(array("On_date" => $date));
      $this->rates = new SimpleXMLElement($curs->GetCursOnDateResult->any);
   }

   /**
    * Return currency rate(array or false) by national currency code
    * @param mixed $code digital or string currency code
    * @return array 
    */
   function GetRateArray($code)
   {
      //Этот метод получает в качестве параметра цифровой или буквенный код валюты и возвращает ее курс
      $code1 = (int)$code;
      if ($code1 != 0) 
      {
         $result = $this->rates->xpath('ValuteData/ValuteCursOnDate/Vcode[.=' . $code . ']/parent::*');
      }
      else
      {
         $result = $this->rates->xpath('ValuteData/ValuteCursOnDate/VchCode[.="' . $code . '"]/parent::*');
      }
     
      if (!$result)
         return false; 
      
      return $result[0];
   }
   
   /**
    * Return currency rate(value or false) by national currency code
    * @param mixed $code digital or string currency code
    */
   function GetRate($code)
   {
      $curs = $this->GetRateArray($code);

      if ($curs === FALSE)
         return false;
      
      $vc = (float)$curs->Vcurs;
      $vn = (int)$curs->Vnom;
      
      return ($vc/$vn);
   }
} 
Пример использования:

Код: Выделить всё

require_once("ExchangeRatesCBRF.php");

// текущая дата
$currentDate = new DateTime(date('Y-m-d'));

// курсы на текущую дату
$rates = new ExchangeRatesCBRF();
// один Белорусский рубль
$oneByr = $rates->GetRate("BYR"); 
// один Российский рубль = Белорусских рублей
$oneRur = round(1 / $oneByr);
// массив с данными о курсе валюты
$cursArray = $rates->GetRateArray("BYR");

echo "Курсы валют на " . $currentDate->format('Y-m-d') . "<br />";
echo "один Белорусский рубль = " . $oneByr . "<br />";
echo "один Российский рубль = " . $oneRur . " Белорусских рублей" . "<br />";
echo "Массив с данными о курсе:<br />";
print_r($cursArray);

// курсы на завтрашнюю дату
$cursDate = $currentDate->modify('+1 day')->format('Y-m-d');
$rates = new ExchangeRatesCBRF($cursDate);
// один Белорусский рубль
$oneByr = $rates->GetRate("BYR"); 
// один Российский рубль = Белорусских рублей
$oneRur = round(1 / $oneByr);
// массив с данными о курсе валюты
$cursArray = $rates->GetRateArray("BYR");
echo "<br /><br />";
echo "Курсы валют на " . $currentDate->format('Y-m-d') . "<br />";
echo "один Белорусский рубль = " . $oneByr . "<br />";
echo "один Российский рубль = " . $oneRur . " Белорусских рублей" . "<br />";
echo "Массив с данными о курсе:<br />";
print_r($cursArray);
 
Результат:

Код: Выделить всё

Курсы валют на 2014-02-21
один Белорусский рубль = 0.00367218
один Российский рубль = 272 Белорусских рублей
Массив с данными о курсе:
SimpleXMLElement Object ( [Vname] => Белорусский рубль [Vnom] => 10000 [Vcurs] => 36.7218 [Vcode] => 974 [VchCode] => BYR )

Курсы валют на 2014-02-22
один Белорусский рубль = 0.00365228
один Российский рубль = 274 Белорусских рублей
Массив с данными о курсе:
SimpleXMLElement Object ( [Vname] => Белорусский рубль [Vnom] => 10000 [Vcurs] => 36.5228 [Vcode] => 974 [VchCode] => BYR ) 
Если всем интересно и нужно, то предлагаю:
1. Закинуть класс в папку lib проекта(MDM).
2. Дабы каждый раз не дёргать сервис, можно написать скрипт, который будет по расписанию опрашивать ЦБ РФ и сохранять данные в базу данных. Хранить в базе до следующего обновления скриптом..
3. В данный класс можно добавить реализацию других доступных методов центробанка.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Курс доллара

Сообщение PAV » Вт апр 01, 2014 3:46 pm

А никто не писал себе алгоритм отслеживания курса валют?
Типа: предупреждение, если курс резко изменился, если изменил направление, если за неделю серьезные изменения?
Написать не проблема, но вдруг уже кто сделал?
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Курс доллара

Сообщение PAV » Вт апр 15, 2014 8:40 pm

Так себе коды работают.
Вот этот сценарий лучший, как по мне:

Код: Выделить всё

$file = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y"));
$xml = $file->xpath("//Valute[@ID='R01235']");
$valute = strval($xml[0]->Value);
$dollar = str_replace(",",".",$valute);
echo $dollar;
sg("ThisComputer.USDrate",$dollar); 
$xml = $file->xpath("//Valute[@ID='R01239']");
$valute = strval($xml[0]->Value);
$euro = str_replace(",",".",$valute);
echo $euro;
sg("ThisComputer.EUROrate",$euro);
 
Последний раз редактировалось PAV Пн апр 28, 2014 1:02 pm, всего редактировалось 1 раз.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Курс доллара

Сообщение LutsenkoDenis » Вт апр 15, 2014 11:35 pm

ну и чем он лучше?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Курс доллара

Сообщение PAV » Ср апр 16, 2014 5:19 am

Короче и понятней.
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Курс доллара

Сообщение Amarok » Ср апр 16, 2014 7:13 am

кстати, да; заработало сразу
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Курс доллара

Сообщение LutsenkoDenis » Ср апр 16, 2014 8:34 am

1. как может быть три строки длиннее пяти мне не понять точно. :)
2. т.к. ваш пример не учитывает номинал валюты, то он работает, но только в случае отношения 1ед. валюты к рублю. Например 1евро = 49 рублей. В случае, например белорусских рублей, ваш код вернет не совсем корректное значение. Т.к. 10000 бел.руб = 36 рублей. А не 1 бел.руб. = 36 руб.
3. Повторно используете код str_replace(",",".",$valute);, но это уже совсем мелочь конечно :)
4. Получать валюту по международному коду валюты корректней,чем по какому-то внутреннему ID центробанка, который может в принципе поменяться в любой момент :)

В любом случае, как говориться на вкус и цвет...
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
PAV
Сообщения: 949
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва
Благодарил (а): 68 раз
Поблагодарили: 94 раза

Re: Курс доллара

Сообщение PAV » Чт апр 17, 2014 6:26 am

;) Если видели мои посты на форуме, то обратили внимание, что я полный нуб в php и проч, посему я стараюсь использовать может не самые красивые, но простые и рабочие примеры. Опыт подсказывает, что через какое-то время количество информации перерастет в качество и тогда возможно займусь оптимизацией.
Я очень радуюсь, когда код работает "с форума", т.е. не надо ничего править и разбираться как он фунциклирует.
В моем понимании на данный момент это и есть оптимальный код ;)
Разбираться с каждым модулем, сценарием и проч я уже заколебался, если честно. Особенно учитывая то, что большинство форумчан уже наступало на эти грабли. Именно поэтому я активно наполняю Библиотеку - чтобы самому не забыть и чтобы следующий ищущий не парился, а тупо копировал. У меня, к сожалению, не получается тупо копировать - никто не дает ;) Приходится разбираться и с php и nix и проч.

А по поводу кода - вот у меня ваш код не заработал сразу, а разбираться было лень ;)
Ответить