Aktuális időjárás kijelzése egyszerűen
Néhány helyen láthatjuk, hogy az aktuális időjárást megjelenítik a honlapokon. Ezek közül akad olyan is, ahol nemcsak az aktuális hőmérsékletet, hanem az időjárásnak megfelelő piktogramot is mutatják. Ennek elkészítésére ad lehetőséget a Yahoo! Weather RSS feed-je is, amelyre most bemutatunk egy példát.
Kezdők problémája
Kezdők számára az alap problémát az szokta jelenteni, hogy az RSS feed-et milyen úton dolgozzuk fel. Erre rengeteg megoldás létezik. Az első, leginkább időigényes, ha saját XML értelmezőt írunk. Véleményem szerint halva született ötlet, mert rengeteg RSS feed értelmezőt találni, illetve PEAR tárházban is található néhány csomag, amik jól használhatóak. De mi van akkor, ha nem tudunk, vagy nem akarunk PEAR csomagokat, vagy külön osztályokat használni a feed értelmezésére. Egyszerűnek tűnhet egy olyan megoldás, ami az XML-t többdimenziós tömbbe konvertálja. Mielőtt nekiugranánk e megoldás elkészítésének, gondoljuk végig, hogy nem mi fogjuk a kereket feltalálni, és lehet, hogy valaki már kész, vagy használható félmegoldást publikált a neten. Ha XML-t akarunk konvertálni PHP tömbbe vagy fordítva, használjuk az XMLize.php-t.
Mivel most az egyszerűségre törekszünk, nem fogjuk teljes egészében felhasználni, csak néhány kódrészletet emelünk ki belőle, amik az XML => PHP tömb irányú konverzióhoz kellenek.
XML => PHP tömb konverzió
A konverzióval kapcsolatos részletekbe, most nem mennék bele, az ötletadóként felhasznált osztály honlapján megtalálhatjuk az eredeti kódot, leírást, illetve példákat. Annyit fűznék hozzá, hogy ennek segítségével, az XML-ből nagyon egyszerűen lehet a megfelelő értékeket kiolvasni, és egyszerű, kevésbé összetett feladatok megoldására tökéletesen alkalmas a megoldás, azt leszámítva, hogy nem a legelegánsabb. De megjegyzem: most az egyszerűségre törekszünk.
Rendben. Meg vannak az adatok, mi kell még?
Attól, hogy az adatokat kinyertük, még nem vagyunk készen. Nem tartom etikusnak, hogy a piktogramokat mindig a Yahoo! szervere szolgálja ki, ezért le kell azt töltenünk, és feltöltenünk a saját weblapunk tárhelyére. A fájlok listáját következő link tartalmazza: image_list.txt. Senkinek nem kell nekiállnia egyesével letöltenie. Az egész példa letölthető összecsomagolva (aktuális időjárás kijelzése - forráskód), amiben megtalálhatóak a Yahoo! által használt piktogramok. Tetszés szerint ezeket bármilyen képekre le lehet cserélni.
Jelenleg rendelkezésre állnak az adatok, és a piktogramok. Egyetlen problémát még az jelenti, hogy nem kellene minden egyes oldalletöltésnél lekérdezni a Yahoo! szerverétől az adatokat. Jó lenne gyorsítótárazni az eredményeket. A funkció ellátására tartalmazza a példa, a következő függvényeket:
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | private function read_cache() { $ret = false; if (file_exists($this->_cache_file) && is_readable($this->_cache_file)) { $cache = unserialize(file_get_contents($this->_cache_file)); if ($cache && ($cache['timestamp']+$this->_cache_lifetime >= time()) && md5(serialize($cache['result'])) == $cache['hash']) { $this->_result = $cache['result']; $this->_has_result = true; $ret = true; } } return $ret; } private function update_cache() { $fp = fopen($this->_cache_file, 'w'); if (!$fp) throw new Exception('Nem lehet irni a cache file-t!'); $cache_str = serialize(array( 'timestamp' => time(), 'result' => $this->_result, 'hash' => md5(serialize($this->_result)), )); fwrite($fp,$cache_str,strlen($cache_str)); fclose($fp); } public function empty_cache() { if ($this->read_cache()) unlink($this->_cache_file); } |
A függvények nevei beszédesek. Az update_cache(); a meglévő adatokból generálja a cache fájlt, amit a read_cache() függvény tud beolvasni. Ezzel elérhető hogy nem kell minden oldalletöltésnél elkérni az adatokat a Yahoo! szerverétől. Az empty_cache() függvény szolgál a cache ürítésére, ha erre bármilyen okból szükségünk lenne.
Példa a használatra
Az osztály használata nagyon egyszerű, első lépésként be kell hívni az osztályt tartalmazó php állományt, majd pedig példányosítjuk az osztályt.
require_once('yahooWeather.class.php'); $yahooWeather = new yahooWeather();
Példányosításkor a konstruktorban megadható paraméterek és alapértelmezett értékeik a következők:
new yahooWeather($cache_file = 'yahoo_weather.cache', $cache_lifetime=3600, $feed_url = 'http://xml.weather.yahoo.com/forecastrss?p=HUXX0002&u=c');
A $cache_file, a gyorsítótárazáshoz használt állomány neve. Ennek írhatónak kell lennie, illetve ha nincs létrehozva, akkor a fájlt tartalmazó könyvtárban a PHP-nek tudnia kell állományt létrehozni. A $cache_lifetime az az idő másodpercben, amennyi időközönként a Yahoo! szerverétől le akarjuk kérdezni az információt. A $feed_url, az RSS feed címe, ami alap esetbe a budapesti adatokat Celsius fokban tartalmazza. További városok vagy mértékegységekhez használatos RSS feed-ek címét a következő oldalról kiindulva határozhatjuk meg: Yahoo! RSS Feed
Az adatok megjelenítésére a következő lehetőséget biztosítja az objektum:
//kép kódjának lekérdezése $yahooWeather->image_code; //hőmérséklet $yahooWeather->temp;
Az osztály nagyon könnyen módosítható, ha más RSS feed-et akarunk használni, vagy más adatokra van szükségünk, például előrejelzésre az aktuális adatok helyett. Módosítás csak a 88-89 sorban elhelyezett kódot kell. Ezek a sorok mondják meg, hogy az feed mely eleme melyik változóban kerüljön elhelyezésre:
88 89 | $this->_result['image_code'] = $array['rss']['#']['channel']['0']['#']['item']['0']['#']['yweather:condition']['0']['@']['code']; $this->_result['temp'] = $array['rss']['#']['channel']['0']['#']['item']['0']['#']['yweather:condition']['0']['@']['temp']; |
Demo és letöltés
A működő példaoldal megtekinthető: Aktuális időjárás kijelzése egyszerűen - példa. A forráskód letölthető: aktuális időjárás kijelzése - forráskód.


31 hozzászólás, szólj hozzá Te is!
MacGyver
Szia!
Próbaképp feltettem változtatás nélkül a zip-ben található file-okat, és még nem is változtattam rajtuk semmit, de már most nem működnek. Sajnos annyira nem értek hozzá, hogy meg tudjam állapítani, mi a gond, van valami ötleted?
Itt van:
http://www.zivatar.hu/tmp/weather/index.php
és itt:
http://macgyver.dyn.elte.hu/weather/index.php
Kösz, Enikő
2008. 05. 12.
MacGyver
Kétszer írtam hogy változatás nélkül
2008. 05. 12.
Polonkai Gábor
Szia!
A második helyen már kaptam hibaüzenetet. Ebből arra következtetek, hogy a PHP verziód 4-es lesz. Sajnos a példa legalább 5-ös verziót követel meg.
2008. 05. 13.
András
Sziasztok,
van valakinek 5lete arra, hogy hogyan lehet egyéb infókat is megjeleníteni?
pl. szélirány, sebesség, előrejelzés x napra…
Köszönöm:
András
2008. 05. 13.
MacGyver
De kár, akkor ez nem fog működni…
2008. 05. 13.
Polonkai Gábor
András,
előrejelzést is küld a yahoo, tehát az megoldott, csak a 88-89.sort kell módosítani. De maga a példa könnyen átalakítható bármilyen xml formátum feldolgozására. Ötletem viszont nincs, hogy szélirány-adatokat honnan lehet beszerezni.
MacGyver,
Aki kicsit tud php-ben programozni, az könnyen át tudja alakítani a példát, hogy működjön PHP4 alatt is.
2008. 05. 13.
MacGyver
A szélirány ott van a yahoo-s forráskódjában:
30° az ÉÉK.
PHP-ben programozni sajnos kicsit sem tudok. Bár a zivatar.hu-n más lehet a gond, az admin felület azt írja, hogy a PHP verzió 5.2.4
2008. 05. 14.
MacGyver
Kiszedte, akkor még egyszer:
yweather:wind chill=”16″ direction=”30″ speed=”6.44″
2008. 05. 14.
Polonkai Gábor
macgyver:
A zivatar.hu-n nem ír ki semmilyen hibaüzenet sem. Próbáld meg, hogy az index.php elejére beszúrod ezt:
< ?php
error_reporting (E_ALL ^ E_NOTICE);
ini_set('display_errors',true);
?>
Ekkor elvileg ki kellene írnia, hogy mi a gond. Ha sikerült, akkor mutasd meg, vagy írd meg a hibaüzenetet. Valószínűnek tartom, hogy a weboldalt üzemeltető szerver úgy lehet beállítva, hogy a fopen függvény nem nyithat meg más szerver által szolgáltatott tartalmat. Ilyenkor más megoldást kell találni, pl.: CURL.
2008. 05. 16.
MacGyver
Bemásoltam:
update_cache() #1 /hosting/raid1/domains/zivatar.hu/www/tmp/weather/yahooWeather.class.php(21): yahooWeather->processFeed() #2 /hosting/raid1/domains/zivatar.hu/www/tmp/weather/index.php(26): yahooWeather->__get(’image_code’) #3 {main} thrown in /hosting/raid1/domains/zivatar.hu/www/tmp/weather/yahooWeather.class.php on line 52
2008. 05. 16.
Polonkai Gábor
A probléma az, hogy a könyvtárban nem tud fájlt létrehozni a php, nincs jogosultsága. Ezt úgy tudod orvosolni, hogy ftp-n keresztül létrehozol egy könyvtárat, mondjuk legyen a neve “temp”, abban a könyvtárban ahol az index.php is van. Ennek 777-es jogot adsz, és a következő sort használod az index.php 18. sorában: $yahooWeather = new yahooWeather(’temp/yahoo_weather.cache’);
2008. 05. 18.
MacGyver
Éljen, működik!
Nagyon köszönöm!
Vizsgaidőszak után be is üzemelem
2008. 05. 27.
Kakó Gábor
Hali!
Már kerestem egy hasonló leírást, nagyon köszi.
De nekem előrejelzés is kellene, de kezdő lévén nem nagyon tudom mit hol, meg mire állítsak.
És WAMP serveren tökéletesen működik, de az extrán nem. Televágja hibakóddal a képernyőt.
Tudnál e nekem segíteni?
2008. 06. 24.
Polonkai Gábor
Szia Gábor,
Küldj egy emailt nekem, a polonkaig (kukac) freemail.hu-ra, az extra.hu-s url-el, és ránézek hogy mi lehet a gond.
2008. 06. 24.
Kakó Gábor
Köszi a segítséget.
A sok hiba kód eltűnt, de a cURL-lal sem megy.
Szóval mást tárhelyre talán jó lesz.
Az előrejelzéses dologban tudnál segíteni?
Kakó Gábor
2008. 06. 25.
Polonkai Gábor
A 88-89. sort kell átírni, ha jól emlékszem a ‘yweather:condition’-t kell ‘yweather:forecast’-re.
2008. 06. 25.
Maczkó János
Kedves Gábor!
Köszönöm a példát, nagyon örülök neki.
Milyen más adatok nyerhetők ki a yahoo!-s weatherből?
Mivel láthatnám a nyers XML-t?
A Yahoo Weathernek van valami hivatalos ismertetése?(sajnos én nem találtam)
Üdv
Maczkó János
2008. 08. 06.
Polonkai Gábor
Szia János,
A Yahoo weather feed-ről bővebb információt itt találtsz: http://developer.yahoo.com/weather/
Ha vmilyen kérdésed lenne vagy valamire kíváncsi vagy kérdezz nyugodtan!
2008. 08. 07.
Maczkó János
Köszönöm a segítséget.
http://maczkojanos.opensourcesetup.com/pd/_block_available_dates.php
Eddig ennyi sikerült, azonban a szél adatai kifognak rajtam, meg az előrejelzés részletei.
Üdv:
Maczkó János
2008. 08. 08.
Polonkai Gábor
Hogy érted, hogy kifogtak? Nem sikerült kibányászni az XML-ből?
2008. 08. 12.
Kis Zoltán
Kedves Gábor!
Örülök hogy rátaláltam a blogodra, gondolom rendszeres látogató leszek, a php-t csak szeretném ismerni és próbálok ismereteket gyüjtetni.
üdv.
Kis Zoltán
2008. 08. 29.
Polonkai Gábor
Kedves Zoltán,
Köszöntelek az oldalon, remélem sikerül majd hasznos információkat gyűjtened.
2008. 09. 02.
GÁBOR
Hello!
ATW szerverre felraktam a zip-ben található fájlokat, de nem müködik:
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in /demo/yahooWeather.class.php on line 4
mi lehet a hiba?
2008. 10. 13.
PÉTER
Hogyan lehet magyarul kiirni azt, hogy most felhős az idő, vagy napos stb.?
2008. 10. 13.
Polonkai Gábor
Gábor:
Kérlek nézdd meg hogy jól töltötted-e fel, ha igen, akkor valószínű, hogy csak 4-es php verzió van a szerveren. A fenti példa pedig legalább 5-ös verzióval működik.
Péter:
Az első dolgod, hogy az itt található táblázatban szereplő elnevezéseket lefordítod magyarra: http://developer.yahoo.com/weather/#codes
Ezután a példa index.php fájljában a < ?=$yahooWeather->image_code?> rész visszaad egy számot. A feladat hogy az adott szám alapján a lefordított táblázatból kikeresed a megfelelő szöveget, és így megkapod a magyar nyelvű meghatározást.
2008. 10. 24.
Péter
Azt tudom hogy a image_code?> rész egy számot ad vissza, de hogyan tudok “csatolni” egy számhoz egy szöveget? Tömbbel próbálkoztam, de nem sikerült! Igy kéne nem? –> Pl.: 20-as szám = Ködös idő.
2008. 11. 06.
Polonkai Gábor
Kell egy ilyen tömb:
$idoKodok = array(
20 => ‘ködös idő’,
21 => ‘napos idő’,
22 => ‘nincs idő’,
);
Ha ez meg van, akkor pedig így tudod használni:
echo ‘ilyen idő van: ‘. $idoKodok[$yahooWeather->image_code];
2008. 11. 21.
Nagy István
Sziasztok, hogy lehet más adatot megjeleníteni ezt sikerült
$this->_result[’text’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’text’];
, de ezeket már nem tudom összehozni
$this->_result[’chill’] = $array[’rss’][’#'][’channel’][’0′][’#'][’yweather:wind’][’0′][’#'][’item’][’0′][’@'][’chill’];
Előre is köszönöm
2009. 10. 08.
Polonkai Gábor
Sajnos sokan próbáltak támadni a példakódot futtatva, leginkább szlovák szerverekről, ezért a példát levettem az oldalról. A forráskód azonban továbbra is letölthető.
2010. 04. 01.
idojaras
Szia!
Szeretnénk egy 3 napos időjárás jelzőt szerezni oldalunkra, de sehol se találtunk megoldást. Van valami ötleted, hogy honnan tudnánk találni?
Ha tudsz valami jó kódot örömmel fogadnánk.
Honlap címe az emailben olvasható.
üdv.
2010. 05. 16.
Polonkai Gábor
Mai, holnapi és holnap utáni időjárás kijelzéséhez egy kis segítség:
$this->_result[’mai_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’code’];
$this->_result[’mai_temp’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:condition’][’0′][’@'][’temp’];
$this->_result[’holnapi_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’code’];
$this->_result[’holnapi_min’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’low’];
$this->_result[’holnapi_max’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’0′][’@'][’high’];
$this->_result[’holnaputani_image_code’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’code’];
$this->_result[’holnaputani_min’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’low’];
$this->_result[’holnaputani_max’] = $array[’rss’][’#'][’channel’][’0′][’#'][’item’][’0′][’#'][’yweather:forecast’][’1′][’@'][’high’];
2011. 05. 24.
Hozzászólás írása: “Aktuális időjárás kijelzése egyszerűen”