Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kurs walut
Forum PHP.pl > Forum > PHP
Lonas
Hej uzywalem dotychczas skryptu ktory pokazywal mi kurs walut z NBP - czy NBP cos zmienil ? teraz wyskakuje komunikat :


Warning: fopen(http://www.nbp.pl/kursy/) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/users/jakarusa/public_html/CMS/test.php on line 29
Błšd przy łšczeniu

a skrypt wyglada tak :
  1. <?php
  2. /*********************************
  3.  * Kursy walut *
  4.  * Copyrigt Š by Jacek Kowalski *
  5.  *  *
  6.  * Wersja 1.0 dla Skryptoteka.pl *
  7.  *********************************/
  8. // Początek pobierania linku do kursu walut w formacie XML...
  9. $a = "0";
  10. $connect = fopen("http://www.nbp.pl/kursy/kursya.html", "r") or die("Błąd przy łączeniu");
  11. while (!feof ($connect)) {
  12.  $a++;
  13.  $buffer = fgets($connect, 4096) or die("Błąd przy odczycie");
  14.  if($a=="166") {
  15.  $link = $buffer;
  16.  }
  17. };
  18. fclose($connect) or die("Błąd przy zamykaniu połączenia");
  19. // Koniec pobierania linku do kursu walut w formacie XML
  20.  
  21. // Wycinanie linku
  22. $link1 = strstr($link, 'xml');
  23. $link2 = substr($link1, '0', '19');
  24. $link = "http://www.nbp.pl/kursy/".$link2;
  25. // Koniec. Link w zmiennej $link.
  26.  
  27. // Pobieranie arkusza XML
  28. $a = "0";
  29. $connect = fopen($link, "r") or die("Błąd przy łączeniu");
  30. while (!feof ($connect)) {
  31.  $a++;
  32.  $buffer = fgets($connect, 4096) or die("Błąd przy odczycie");
  33.  if($a=="4") {
  34.  $datak = $buffer;
  35.  }
  36.  elseif($a=="3") {
  37.  $numerk = $buffer;
  38.  }
  39.  elseif($a=="6") {
  40.  $waluta1 = $buffer;
  41.  }
  42.  elseif($a=="8") {
  43.  $symbol1 = $buffer;
  44.  }
  45.  elseif($a=="9") {
  46.  $kurs1 = $buffer;
  47.  }
  48.  elseif($a=="30") {
  49.  $waluta2 = $buffer;
  50.  }
  51.  elseif($a=="32") {
  52.  $symbol2 = $buffer;
  53.  }
  54.  elseif($a=="33") {
  55.  $kurs2 = $buffer;
  56.  }
  57.  elseif($a=="24") {
  58.  $waluta3 = $buffer;
  59.  }
  60.  elseif($a=="26") {
  61.  $symbol3 = $buffer;
  62.  }
  63.  elseif($a=="27") {
  64.  $kurs3 = $buffer;
  65.  }
  66.  elseif($a=="54") {
  67.  $waluta4 = $buffer;
  68.  }
  69.  elseif($a=="56") {
  70.  $symbol4 = $buffer;
  71.  }
  72.  elseif($a=="57") {
  73.  $kurs4 = $buffer;
  74.  }
  75. };
  76. fclose($connect) or die("Błąd przy zamykaniu połączenia");
  77. // Pobrano arkusz XML i wyniki do zmiennych.
  78. // Wyświetlanie...
  79. echo " <b><center><font SIZE="1" color="black" face="verdana">NBP z dnia <br>".$datak."</b></center></font><br> <font SIZE="1" color="black" face="verdana">".$waluta1."</FONT><br> <font SIZE="1" color="black" face="verdana"><b>(".$symbol1.")</b></FONT> <b> <font SIZE="1" color="black" face="verdana">".$kurs1."</b></FONT><br> <font SIZE="1" color="black" face="verdana">".$waluta2."</font> <br> <font SIZE="1" color="black" face="verdana"><B>(".$symbol2.")</B> </font><B> <font SIZE="1" color="black" face="verdana">".$kurs2."</font></B><br> <font SIZE="1" color="black" face="verdana">".$waluta3."</font> <br> <font SIZE="1" color="black" face="verdana"><B>(".$symbol3.")</font></B> <font SIZE="1" color="black" face="verdana"> <B>".$kurs3."</font></B><br> <font SIZE="1" color="black" face="verdana">".$waluta4."</font><br> <font SIZE="1" color="black" face="verdana"> <B>(".$symbol4.")</font></B> <font SIZE="1" color="black" face="verdana"> <B> <font SIZE="1" color="black" face="verdana">".$kurs4."</font></B><br>"
  80. ?>
cadavre
Wpisz sobie w pasku adresu przeglądarki:
http://www.nbp.pl/kursy/

Dowiesz się czy NBP coś zmienił...
Lonas
eh.. to juz sprawdzalem w adresie nic sie nie zmienilo ..
pytam czy mogli cos zablowkowac.. bo link uzywany w skrypcie dziala

http://www.nbp.pl/kursy/kursya.html
eyedropper
a link http://www.nbp.pl/kursy/xml/a005z070108.xml ?
nie lepiej z xmla winksmiley.jpg ?
tiraeth
@eyedropper: Jeżeli chcesz z XMLa przy użyciu simplexml_load_file, to działa to wolniej niż przez zwykłe file + preg_match smile.gif

  1. <?php
  2. $txtData = 'http://www.nbp.pl/kursy/kursya.html';
  3. if ( $txtParsed = @implode('', file($txtData)) )
  4. {
  5. if ( preg_match_all('#<tr valign="middle">(.*?)</tr>#is', $txtParsed, $r) )
  6. {
  7. $r = $r[1];
  8. foreach ( $r as $txtMoney )
  9. {
  10. if ( preg_match_all('#<td class="bg(1|2)">(.*?)</td>#is', $txtMoney, $s) )
  11. {
  12. $s = $s[2];
  13. $arrMoneys[] = array('name' => $s[0], 'code' => $s[1], 'exchange' => $s[2]);
  14. }
  15. }
  16.  
  17. print_r($arrMoneys); // Ta zmienna ma tablice z kursami walut
  18. }
  19. else
  20. {
  21. echo 'HTML structure doesn't match the regular expression.';
  22. }
  23. }
  24. else
  25. {
  26. echo 'Cannot load HTML file from <b>'.$txtData.'</b>. Please check your URL!';
  27. }
  28. ?>


Taki kod zajmuje mi (down: 1Mb/s) 0.34685s
Lonas
Ale dlaczego ten skrypt wczesniej dzialal ? co sie zmienilo ?
cadavre
Zapytaj NBP. My tu ekspertami systemów NBP nie jesteśmy. tongue.gif
sf
Jeśli skrypt ciągle pobierałeś to na pewno Ci to zablokowali winksmiley.jpg Należało użyć jakiegoś cache, który przechowuje przez 24h plik.
Kahir
Witam,
w linijce 13 $buffer jest kasowany przy każdym przejściu przez pętlę, w związku z czym zmienna $link2 jest pustym ciągiem i skrypt próbuje pobrać zawartość katalogu do którego nie ma dostępu ("/kursy/").
Dodaj kropkę:
  1. <?php
  2. $buffer .= fgets($connect, 4096) or die("Błąd przy odczycie");
  3. ?>
cmike
  1. <?php
  2. $txtData = 'http://www.nbp.pl/kursy/kursya.html';
  3. if ( $txtParsed = @implode('', file($txtData)) )
  4. {
  5.  $link = $txtParsed;
  6. $link1 = strstr($link, 'xml');
  7. $link2 = substr($link1, '0', '19');
  8. $dt = substr($link2, '9', '6');
  9. $d = $dt[4].$dt[5];
  10. $m = $dt[2].$dt[3];
  11. $r = "20".$dt[0].$dt[1];
  12. $dat_wal = $r.'.'.$m.'.'.$d;
  13. $link = "http://www.nbp.pl/kursy/".$link2;
  14. }
  15.  
  16. $wersja = phpversion();
  17. if ($wersja[0]>4)
  18. {
  19. $xml = simplexml_load_file($link);
  20. foreach ($xml->pozycja as $wpis)
  21. {  
  22. echo "<li>".$wpis->nazwa_waluty."(".$wpis->kod_waluty.") ->kurs średni: ".$wpis->kurs_sredni."</li>";
  23. }
  24. }
  25. else
  26. {
  27. $xml_link = $link;
  28. $currentTag = "";
  29. $startpos = 0;
  30. $encoding = 0;
  31. $xml_items = array();
  32.  
  33. function startTag($parser, $name, $attrs)
  34. {
  35. global $currentTag, $startpos;
  36. $currentTag = $name;
  37. if ($currentTag=='POZYCJA') $startpos++;
  38. }
  39.  
  40. function endTag($parser, $name)
  41. {
  42.  global $currentTag;
  43.  $currentTag = "";
  44. }
  45.  
  46. function characterData($parser, $data)
  47. {
  48. global $currentTag, $startpos, $xml_items;
  49. if ($startpos > 0) {
  50.  switch ($currentTag) {
  51.  case 'NAZWA_WALUTY' : $xml_items[$startpos]['NAZWA_WALUTY'] .=$data; break;
  52.  case 'KOD_WALUTY': $xml_items[$startpos]['KOD_WALUTY'].=$data; break;
  53.  case 'KURS_SREDNI': $xml_items[$startpos]['KURS_SREDNI'].=$data; break;
  54.  }
  55.  
  56. } else {
  57.  
  58.  
  59. }
  60.  
  61. }
  62.  
  63. $xml_link = parse_url($xml_link);
  64.  
  65. $header = "GET ".$xml_link["path"].(isset($xml_link["query"]) ? "?".$xml_link["query"] : false)." HTTP/1.0rn";
  66. $header .= "Host: ".$xml_link['host']."rn";
  67. $header .= "Content-type: application/x-www-form-urlencodedrn";
  68. $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; www.inteco.win.pl)rn";
  69. $header .= "Content-length: " . strlen($request) . "rnrn";
  70.  
  71. if ($xml_read = @fsockopen($xml_link['host'], ($xml_link['port']>0 ? $xml_link['port'] : 80) , $err_num, $err_msg, 10)) {
  72.  
  73.  fputs($xml_read, $header . $request);
  74.  
  75.  $xml_parser = xml_parser_create();
  76.  xml_set_element_handler($xml_parser, "startTag", "endTag");
  77.  xml_set_character_data_handler($xml_parser, "characterData");
  78.  
  79.  while ($data = fread($xml_read, 4096)) {
  80. if ((empty($encoding)) && (preg_match("#<?xml.+(|encoding="([w-]+)").*questionmark.gif>#i",$data,$enc))) {
  81. $encoding = preg_replace("#<?xml.+encoding="([w-]+)".*?>#s","1",$enc[0]);
  82. $data = preg_replace('#(.*?)(<?xml)#s','2',$data);
  83. }
  84.  
  85. if (!empty($encoding)) {
  86. if (!xml_parse($xml_parser, $data, feof($xml_read))) {
  87. die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
  88.  
  89. }
  90. }
  91.  }
  92.  
  93.  xml_parser_free($xml_parser);
  94. }
  95. echo '<table width="100%" border="0" cellspacing="1" cellpadding="0" align="center" class="tbl-border">';
  96. for ($i=1;$i<count($xml_items);$i++)
  97. {
  98. if($xml_items[$i]['KOD_WALUTY']=="USD" || $xml_items[$i]['KOD_WALUTY']=="EUR") {
  99. if($klasa=="tbl1") {$klasa="tbl2";} else {$klasa="tbl1";}
  100. echo '<tr>
  101. <td class="'.$klasa.'">'.$xml_items[$i]['NAZWA_WALUTY'].'</td><td class="'.$klasa.'" align="center">'.$xml_items[$i]['KOD_WALUTY'].'</td><td class="'.$klasa.'" align="center"><b>'.$xml_items[$i]['KURS_SREDNI']."</b></td>
  102. </tr>";
  103. }
  104. }
  105. echo '</table>';
  106. }



To przykładowy kod - mnie interesował tylko dolar i euro.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.