Курсы валют

Опубликовано 28 августа 2006 г. | trackback

Скрипт “Динамика курсов валют”, закачивающий курсы валют (в данной реализации USD и EUR) с сайта ЦБ РФ. Отличительной особенностью данного скрипта является то, что помимо самого курса он предоставляет и информацию об изменении курса с прошлой сессии.

По хорошему, надо дописать к этому скрипту вывод в файл и повесить вызов на cron на 12 и 13 часов каждого дня, чтобы избежать обращения к http://cbr.ru/ при каждой загрузке страницы.

<?php
function startElement($parser, $name, $attrs) {
   global $date, $val, $tag, $code;
   global $items;
 
   $codes = array('R01235', 'R01239');
 
   $tag = $name;
   switch($name) {
      case 'VALCURS':
         if (in_array('DATE',array_keys($attrs)))
            $date = $attrs['DATE'];
         break;
 
      case 'VALUTE':
         if (in_array('ID',array_keys($attrs)))
            if (in_array($attrs['ID'],$codes)) {
               $code = $attrs['ID'];
               if (!isset($items[$code]))
                  $items[$code] = array('sign'=>'',
                                        'title' => '',
                                        'value' => '',
                                        'previuos' => '');
                  $val = 's';
            } else
               $val='';
         break;
   }
}
 
function startElement2($parser, $name, $attrs) {
   global $val, $tag, $code;
   global $items;
 
   $codes = array('R01235', 'R01239');
   $tag = $name;
   if ($name=='VALUTE') {
      if (in_array('ID',array_keys($attrs)))
         if (in_array($attrs['ID'],$codes)) {
            $code = $attrs['ID'];
            $val = 's';
         } else
            $val='';
   }
}
 
function endElement($parser, $name) {
 
}
 
function characterData($parser, $data) {
   global $val, $tag;
   global $items, $code;
 
   if ($val=='s') {
      switch($tag) {
         case 'VALUE':
            $items[$code]['value'] .= str_replace(",",".",$data);
            break;
 
         case 'CHARCODE':
            $items[$code]['sign'] .= $data;
            break;
 
         case 'NAME':
            $items[$code]['title'] .= $data;
            break;
      }

   }
}
 
function characterData2($parser, $data) {

   global $val, $tag;
   global $items, $code; 

   if($val=='s' && $tag=='VALUE') {

      $items[$code]['previuos'] .= str_replace(",",".",$data);
   }

}
 
function parse($url) {
   global $items, $date;

   $items = array();
   $current = date('d/m/Y',mktime(0, 0, 0, date("m"), date("d")+1, date("Y")));

 
   parse1($url.$current);

   $date = str_replace(".","/",$date);
   list($d,$m,$y)=split("/", $date);

 
   $previous = date('d/m/Y',mktime(0, 0, 0, $m  , $d-1, $y));

   parse2($url.$previous);
   outData();

}
 
function parse1($url){
   global $items;
 

   $xml_parser = xml_parser_create();
   xml_set_element_handler($xml_parser, "startElement", "endElement");
   xml_set_character_data_handler($xml_parser, "characterData");

 
   @$fp = fopen($url, "r");
   $data = "";
   while (true) {

      @$datas = fread($fp, 4096);
      if (strlen($datas) == 0) {

         break;
      }
      $data .= $datas;
   }
 
   @fclose($fp);

   if ($data != '') {

      $xmlresult = xml_parse($xml_parser, $data);
      $xmlerror = xml_error_string(xml_get_error_code($xml_parser));
      $xmlcrtline = xml_get_current_line_number($xml_parser);

 
      if ($xmlresult) {
 
      } else
         print("Error parsing this feed !<br />Error: $xmlError , at line: $xmlCrtline");
      } else {

         print("Error while retriving feed $url");
   }
 
   xml_parser_free($xml_parser);
}

 
function parse2($url){
   global $items;
 
   $xml_parser = xml_parser_create();
   xml_set_element_handler($xml_parser, "startElement2", "endElement");
   xml_set_character_data_handler($xml_parser, "characterData2");

 
   @$fp = fopen($url, "r");
   $data = "";
   while (true) {

      @$datas = fread($fp, 4096);
      if (strlen($datas) == 0) {

         break;
      }
      $data .= $datas;
   }
 
   @fclose($fp);

   if ($data != '') {

      $xmlresult = xml_parse($xml_parser, $data);
      $xmlerror = xml_error_string(xml_get_error_code($xml_parser));
      $xmlcrtline = xml_get_current_line_number($xml_parser);

      if ($xmlresult) {

 
      } else
         print("Error parsing this feed !<br />Error: $xmlError , at line: $xmlCrtline");
   } else {

      print("Error while retriving feed $url");
   }	

   xml_parser_free($xml_parser);
}
 
function outData() {

   global $items;
   global $date;
   print($date.'<br />');

 
   $values = array_values($items);
   for($i = 0;$i < count($values);$i++) {

      print($values[$i]['value']);
      $change = round($values[$i]['value'] - $values[$i]['previuos'] , 4);

 
      print("-- ".$values[$i]['previuos']);
      print("-- ".$change."<br />");
   } 

}
 
   $url="http://www.cbr.ru/scripts/XML_daily.asp?date_req=";
   parse($url);
?>

5 Comments »

Trackback by xasima.livejournal.com
2006-08-29 16:23:32

Test for trackback and other cool stuffs…

I’ve tried to use trackback technology! It’s only the test entry…

 
2006-08-29 22:58:25

а чисто теоретически возможно его превратить в “динамику курсов акций” на ммвб?

 
Comment by shade33
2006-08-29 23:45:10

а разве ЦБ предоставляет такую информацию?

 
2006-09-06 15:21:26

ээ.. ну насчет ЦБ пока хз, я вот quote.ru насколько я знаю, точно предоставляет – с опозданием на 15 минут

 
2008-06-13 13:27:50

December poker tournaments in las vegas….

Poker tournaments las vegas. Poker tournaments in phoenix. New orleans harrah casino poker tournaments. Poker tournaments arizona. 2007 poker tournaments in las vegas. Biloxi poker tournaments. Poker tournaments michigan….

 

Or use your OpenID: