Valuta árfolyam a weblapomon


 Szeretnék a weblapomra egy olyan árfolyam kijelzők, mint amilyen az eco.hu -n van.
Hogyan tudnám PHP segítségével URL keresztűl mondjuk egy <iframe> -be betölteni az eco.hu-n található valuta árfolyamtáblázatot? |
http://www.mnb.hu/engine.aspx?page=napiarfolyamok
Pl megnyitod ezt a linket fopennel, és valami ereg, stb függvény segítségével kikeresgéled belőle a számokat, és a valutanemeket. Hasonlóan a tegnap rss phaerserhez. |
Akkor ahogy megynitom, mint fájlba kikeresem a szükséges anyagot. igaz?
továbbá miért van az,hogy
$file = "http://www.hwsw.hu/xml/latest_news_rss.xml";
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
ez így nem megy.....
|
"megnyitod ezt a linket fopennel"
nem sikerül linket megnyitmon fopen-nel!!!
miért? |
| php.ini-ben le van tiltva az url_fopen vagy hasonló nevű bejegyzésben egy link megnyitása. Ugyanis nem biztonságos. Helyette használj socket-eket (lásd manual), azzal tutira menni fog. Persze ez így alacsony szintű, de valamit valamiért... |
Szerintem döntsük el, hogy most az árfolyamok kellenek, vagy a HWSW rss-e, mert aszerint kéne pharsert írni..
Az mnb oldala nem lesz jó, nagyon tele van bszva kóddal. Legyen az eco.hu:
$fp = @fopen('http://www.eco.hu/', "r"); while(!feof($fp)){ $row .= fgets($fp, 4096); } fclose($fp);
Ezzel belekerült a $row változóba a linken található oldal. Most jön az, hogy kivágod belőle ami kell, mondjuk az MNB Deviza nevű táblázatot a jobb hasábból. Ehez az kell, hogy megnézd az oldal forrását, hogy honnét lehet vágni, tehát hogy mihez igazítsd a reguláris kifejezés elejét meg a végét:
if(eregi("MNB DEVIZA</font></td></tr>(.*)</tml>", $row, $resz)) { $out = '<table>'."\n"; $out .= $resz; // ezt vágtad ki $out .= '</table>'."\n"; }
Most már benne van az $out változóban ami kell, már csak ki kell íratni, vagy előtte még cachelni sem ártana. |
| nézd már meg azt a classt, amit küldtem, nekem müxik |
ez a link elég jót ad vissza:
http://www.mnb.hu/engine.aspx?page=arfolyamtablazat&query=2005.07.27.,2005.07.27.,1,AUD,CAD,CHF,CZK,DKK,EUR,GBP,HRK,ISK,JPY,KRW,MXN,NOK,NZD,PLN,RON,SEK,SIT,SKK,TRY,USD |
Hát ja, csak ha megnézed a forrását...
Nemtudom miért nem csinál valamelyik bank RSS-elérést, vagy leglább valami emészthető XML-t. Hírek, részletes időjárás, receptek, névnap minden elérhatő már RSS-ből, csak a valuta nem |
Webservice. Erre találták ki. A weblap az ember számára szolgáltat "feldolgozandó adatot", a webservice meg gép számára. Itt van róla infó (nekem is épp a minap súgta meg egy kolléga a linket):
http://www.mnb.hu/arfolyamok.asmx
További kulcsszavak a technológiához: SOAP, WSDL. |
| erre tucc ezzel megoldást? |
HTTP/1.1 500 Internal Server Error. Date: Thu, 28 Jul 2005 17:57:50 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 1.1.4322 Cache-Control: private Content-Type: text/xml; charset=utf-8 Content-Length: 514 soap:Server Server was unable to process request. --> This is an unexpected token. The expected token is 'NAME'. Line 2, position 11. HTTP/1.1 400 Bad Request Content-Type: text/html Date: Thu, 28 Jul 2005 17:57:50 GMT Connection: close Content-Length: 20 Bad Request
nekem egy ilyet dobott vissza. valakinek ötlet? |
| És pontosan mit post-oltál el? Mert a hibaüzenetből nekem úgy tűnik, hogy nem volt jó. |
Ha minden igaz, akkor ha azt post-olod, ami ezen az oldalon felül van:
http://www.mnb.hu/arfolyamok.asmx?op=GetCurrentExchangeRates
úgy, hogy a content-length headerbe a kiemelt szöveg helyére beírod a törzsben lévő xml doksi hosszát (ha jól számoltam 312), akkor az alatta lévő válaszban a kiemelt string helyén valami ilyesmi fog szerepelni (természetesen sortörés és egyéb whitespace nélkül):
<MNBCurrentExchangeRates> <Day date="2005-07-28"> <Rate curr="AUD" unit="1">153,49</Rate> <Rate curr="CAD" unit="1">164,59</Rate> <Rate curr="CHF" unit="1">156,77</Rate> <Rate curr="CZK" unit="1">8,12</Rate> <Rate curr="DKK" unit="1">32,86</Rate> <Rate curr="EUR" unit="1">245,15</Rate> <Rate curr="GBP" unit="1">354,46</Rate> <Rate curr="HRK" unit="1">33,57</Rate> <Rate curr="ISK" unit="1">3,15</Rate> <Rate curr="JPY" unit="100">180,37</Rate> <Rate curr="KRW" unit="100">19,77</Rate> <Rate curr="MXN" unit="1">19,08</Rate> <Rate curr="NOK" unit="1">30,97</Rate> <Rate curr="NZD" unit="1">137,99</Rate> <Rate curr="PLN" unit="1">60,01</Rate> <Rate curr="RON" unit="1">69,67</Rate> <Rate curr="SEK" unit="1">26,08</Rate> <Rate curr="SIT" unit="1">1,02</Rate> <Rate curr="SKK" unit="1">6,27</Rate> <Rate curr="TRY" unit="1">152,11</Rate> <Rate curr="USD" unit="1">203,22</Rate> </Day> </MNBCurrentExchangeRates>
|
Tessék, itt a kód, ez megcsinálja a lekérdezést. A 11-edik sorban ($s) van az egész visszaadott XML, ezt a php parserével szétszeded és máris megvan az adat.
<?php
$bdy = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; $bdy.= "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"; $bdy.= "<soap:Body>"; $bdy.= "<GetCurrentExchangeRates xmlns=\"http://www.mnb.hu/webservices/\" />"; $bdy.= "</soap:Body>"; $bdy.= "</soap:Envelope>\r\n";
$req = "POST /arfolyamok.asmx HTTP/1.1\r\n"; $req.= "Host: www.mnb.hu\r\n"; $req.= "Connection: Close\r\n"; $req.= "Content-Type: text/xml; charset=utf-8\r\n"; $req.= "Content-Length: ".strlen($bdy)."\r\n"; $req.= "SOAPAction: \"http://www.mnb.hu/webservices/GetCurrentExchangeRates\"\r\n\r\n";
$fs = fsockopen("www.mnb.hu", 80); fwrite($fs, $req.$bdy); while (!feof($fs)) { $s = fgets($fs); echo $s."<BR/>"; } fclose($fs); ?>
Ha viszont a hostolt oldalon nincs engedélyezve az fsockopen, hát az szívás. Ha az 5-ös PHP-t használod, akkor abban már van gyári SOAP támogatás. Lehet, hogy azzal egyszerűbben megoldható. |
Nekem működik. Tudsz még ilyen webservice forrásokat, vagy minek hívják?
De ehez akkor mindegyikhez külön kell írni xml értelmezőt nem arra amit visszaad? |
Az MNB-ét is hetekig kerestem. Se google, se semmi eredmény. Aztán e-mailben kaptam meg a címet egy kollégától.
A különböző XML-ek parsolásáról: hát a WSDL alapvető feladata az volna, hogy azonosítsa a hívható "függvényeket", a bemeneti paramétereket és a kimeneti paramétereket típussal együtt. Erre aztán mindenféle automatikus eszköz van, a .NET például a WSDL-ből már olyan szinten kódot generál, hogy ott már csak meg kell hívni a megfelelő metódust, és az ember ölébe is pottyantak a visszaadott adatok.
Jelen esetben ez a WSDL (http://www.mnb.hu/arfolyamok.asmx?WSDL) nem a legjobban kidolgozott, mert egy teljes XML részfát ad vissza nyers string-ként, holott visszaadhatná ezt mondjuk tömbként is. |
Miért van, ha parser segítségével egy XML hírforrást akarok elérni, hogy ha megakarom nyítni az XML-t
$fp = @fopen('http://www.hwsw.hu/xml/latest_news_rss.xml', "r");
Akkor ezt az üzit kapom:
Warning: feof(): supplied argument is not a valid File-Handle resource in /home/friends-lan/public_html/xml/index.php on line 84 |
kipróbáltam az alábbi forráskódot, de nekem nem megy! Biztos PHP beállítási hiba, de mi lehet az?
ez volt a teszt:
$fp = @fopen('http://www.eco.hu/', "r");
while(!feof($fp)){
$row .= fgets($fp, 4096);
}
fclose($fp);
if(eregi("MNB DEVIZA</font></td></tr>(.*)</tml>", $row, $resz)) {
$out = '<table>'."\n";
$out .= $resz; // ezt vágtad ki
$out .= '</table>'."\n";
}
ezt kapom vissza:
Warning: feof(): supplied argument is not a valid File-Handle resource in /home/friends-lan/public_html/xml/index.php on line 82
Warning: fgets(): supplied argument is not a valid File-Handle resource in /home/friends-lan/public_html/xml/index.php on line 83
nem értem.....
|
| Nem kell saját magadnak szórakoznod fopennel meg ilyen hülyeségekkel, ennél a félmegoldásnál sokkal jobbat kapsz készen a PEAR ExhangeRates osztályával... |
Köszi átfutom, mert ez így nekem tényleg fél megoldás!
De pontosan mit tud ez a csomag? |
Egy xml árfolyamlistából tudsz vele lekérdezni árfolyamokat (a default xmlforrása tökéletes szerintem), és konvertálgatni köztük, formátumot beállítani, stb.
gyakorlatilag mindössze átkonvertálod minden érintett pénznem 1 árát forintra, és megkapod hány forintnak felel meg... |
jó ez erre a feladatra OK, csak azért próbálkozom az fopen- el, mert mi ha pl. a BÉT vagy az ECO árfolyamdiagramját szeretném betölteni a lapomra?
Tehát mindenképp azért kellene fopen, h univerzális, minden elérhető legyen.... |
| A diagrammok képek, és simán linkelheted is őket... |
egy példát tudnál mondani? nagyon életmentő lenne.
Pl.: a www.bet.hu -on bal oldalt van egy diagram, arra lenne szükségem!
nagyon hálás tudnék lenne! |
http://www.bet.hu/gfx/pic/BUX.png
simán azt csinálod, hogy
<img src="http://www.bet.hu/gfx/pic/BUX.png" alt="bux diagramm" />
bármilyen böngészővel meg tudod nézni a képek címét... |
ez így tényleg OK! gondolom a hivatkozás révén amikor frissűl a BÉT-en, akkor frissül nekem is a kép?
viszont ha már egy táblázat kellene, ami nem kép hanem HTML forrás azt már nem megy ezzel a módszerrel? |
Igen, az frissül magától.
A táblázat viszont már HTML, így ha egyéb adatokat is tartalmaz, akkor azt ki kell bányásznod valahonnan. Ez megtehető magából a html forrásból is, de én valószínűbbnek tartom, hogy az a html is valami xml féle adatforrást használ, tehát pear xml-el azt is meg lehet egyszerűen oldani, csak meg kell keresni (érdeklődni) hol a forrás. |
|