Funkcja pobiera prognozę pogody z wunderground.com na 3 dni i zwraca dane jako tablica.
Aby móc używać funkcji potrzebny jest API key do zdobycia za free na: http://www.wunderground.com/weather/api/
wunderground.com daje też obrazki które można wykorzystać. Nazwy obrazków masz w kluczu icon tablicy dla odpowiedniego dnia. Można je zdobyć tutaj: http://www.wunderground.com/weather/api/d/docs?d=resources/icon-sets
UWAGA! powinieneś cache'ować zwrotki tej funkcji a nie za każdym razem od nowa pobierać nowe dane. Po pierwsze ponieważ jest to nie wydajne, a po drugie API ma ograniczenie na 500 zapytań dziennie i 10 na minute. Wystarczy odpytywać się o nową pogodę co 15 minut, a nawet dłużej.
Kod
<?php /** * Get weather forecast information from wunderground.com * * IMPORTANT NOTE: * You should cache output of this function in some kind of cache in order to prevent requesting for forecast data * on every page refresh. wunderground.com has limits that are for now 500 request per day and 10 per minute. * So if you do not cache response you will exceed them quickly. * * @param string $_place Weather for which place? Examples: Poland/Jaslo * ( do not use local chars, only ASCII ) * if needed use some kind of string normalizer * @param string $_apiKey API key to wunderground.com, can be obtained for free using URL: * <a href="http://www.wunderground.com/weather/api/" target="_blank">http://www.wunderground.com/weather/api/</a> * @param bool $_throwException should function throws Exception instead just returning false? * @throws Exception * @return array|boolean array with data or false if request failed */ function weatherFor( $_place, $_apiKey, $_throwException = false ) { $url = "http://api.wunderground.com/api/$_apiKey/forecast/q/$_place.json"; // set request timeout $context = http://www.php.net/stream_context_create(http://www.php.net/array( 'http' => http://www.php.net/array( 'timeout' => 2 ) ) ); // request data $jsonString = http://www.php.net/file_get_contents( $url, 0, $context ); // check if request succeeded if( $jsonString === false ) { if ( $_throwException ) { throw new Exception('function weatherFor: file_get_contents failed'); } return false; } // decode JSON $weatherInfo = json_decode( $jsonString, true ); // check if response is JSON if( json_last_error() !== JSON_ERROR_NONE ) { if ( $_throwException ) { throw new Exception('function weatherFor: Response not JSON'); } return false; } // check if error in response if( http://www.php.net/isset( $weatherInfo['response']['error'] ) ) { if ( $_throwException ) { throw new Exception('function weatherFor: Error in response'); } return false; } return $weatherInfo; }
$weatherForecast = weatherFor( 'Poland/Jaslo', 'place for api key' ); if( $weatherForecast !== false ) { // u can safely use response to generate weather panel or something http://www.php.net/print_r( $weatherForecast ); } else { http://www.php.net/echo 'weather unavailable, sorry for inconvenience'; }
Nie polecam za szczególnie tego serwisu. Miałem problem z temperaturą. Na stronie pokazywała się prawidłowa, a w API kilka stopni różnicy. Po kilku mailach z prośbą o pomoc, czy wyjaśnienie problemu i braku jakiegokolwiek odezwu ze strony administracji - zrezygnowałem z tej opcji
Bo do wunderground się nie dobiera po API. Serwis ten dla miejscowości nieznanych pobiera współrzędne i interpoluje wyniki ze stacji bazowych. Często nawet nie, po prostu na pałę wrzucając dane odczytane z najbliższej stacji bazowej W Polsce jest ich nieco ponad 70. I tylko na owe stacje warto zwracać uwagę. Te łatwo wyłuskać i można ich dane jako JSON lub XML wyciągać, z pominięciem limitów oraz całego API.
Ale dotyczyło to sporego miasta w UK więc podejrzewam, że nie pominęli by go
Niemniej dzięki za info.
Nieważne czy stacja bazowa jest w Polsce czy nie. Stacje bazowe łatwo wyłapać po Id. Jeszcze na początku zeszłego roku na pewno stary layout był i w nim można było się dobrać do linków tego starego typu, omijającego oficjalne API.
Mam problem z powyższym kodem, konkretnie nie chce mi to zadziałać. Mam klucz api ze strony wunderground.com jednak nie mam pojęcia gdzie wstawić go w kodzie.
Próbowałem swoich sił na innym kodzie - działa jest tylko jeden problem nie wiem jak dopisać tam funkcję aktualizacji co np. 15min.
Jak stworzyć kod php lub html aby pobrał dane z pliku xml?
Po pierwsze, to wszystko zależy od stacji bazowych. Te rzadko mają aktualizację co minutę czy kwadrans. Najczęściej co około pół godziny lub godzinę.
Po drugie, czyli co do API. Dawno już z wunderground nie miałem do czynienia, ale normalnie przekazujesz go zazwyczaj albo jako parametr normalny w POST lub GET, albo zdarza się sporadycznie w niektórych API, że jako nagłówek.
Po trzecie, czyli co do aktualizacji... Albo wysyłasz na pałę żądanie, albo cache'ujesz wynik i tylko raz na jakiś czas go uaktualniasz. Kwestia jedynie narzędzi na Twoim serwerze dostępnych.
Po czwarte, to kto ten skrypt pisze? My czy Ty? Bo to wygląda jak zawoalowane: "Nie umiem tego, napiszcie to za mnie" A na gotowca nie licz.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)