Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Algorytmy, klasy, funkcje _ [funkcja] Pogoda z wunderground.com na kolejne 3 dni

Napisany przez: jaslanin 31.03.2013, 20:24:55

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

  1. <?php
  2.  
  3. /**
  4.  * Get weather forecast information from wunderground.com
  5.  *
  6.  * IMPORTANT NOTE:
  7.  * You should cache output of this function in some kind of cache in order to prevent requesting for forecast data
  8.  * on every page refresh. wunderground.com has limits that are for now 500 request per day and 10 per minute.
  9.  * So if you do not cache response you will exceed them quickly.
  10.  *
  11.  * @param string $_place Weather for which place? Examples: Poland/Jaslo
  12.  * ( do not use local chars, only ASCII )
  13.  * if needed use some kind of string normalizer
  14.  * @param string $_apiKey API key to wunderground.com, can be obtained for free using URL:
  15.  * <a href="http://www.wunderground.com/weather/api/" target="_blank">http://www.wunderground.com/weather/api/</a>
  16.  * @param bool $_throwException should function throws Exception instead just returning false?
  17.  * @throws Exception
  18.  * @return array|boolean array with data or false if request failed
  19.  */
  20. function weatherFor( $_place, $_apiKey, $_throwException = false ) {
  21.  
  22. $url = "http://api.wunderground.com/api/$_apiKey/forecast/q/$_place.json";
  23.  
  24. // set request timeout
  25. $context = http://www.php.net/stream_context_create(http://www.php.net/array(
  26. 'http' => http://www.php.net/array(
  27. 'timeout' => 2
  28. )
  29. )
  30. );
  31.  
  32. // request data
  33. $jsonString = http://www.php.net/file_get_contents( $url, 0, $context );
  34.  
  35. // check if request succeeded
  36. if( $jsonString === false ) {
  37.  
  38. if ( $_throwException ) {
  39. throw new Exception('function weatherFor: file_get_contents failed');
  40. }
  41.  
  42. return false;
  43. }
  44.  
  45. // decode JSON
  46. $weatherInfo = json_decode( $jsonString, true );
  47.  
  48. // check if response is JSON
  49. if( json_last_error() !== JSON_ERROR_NONE ) {
  50.  
  51. if ( $_throwException ) {
  52. throw new Exception('function weatherFor: Response not JSON');
  53. }
  54.  
  55. return false;
  56. }
  57.  
  58. // check if error in response
  59. if( http://www.php.net/isset( $weatherInfo['response']['error'] ) ) {
  60.  
  61. if ( $_throwException ) {
  62. throw new Exception('function weatherFor: Error in response');
  63. }
  64.  
  65. return false;
  66. }
  67.  
  68. return $weatherInfo;
  69. }


Przykładowy wywołanie:

  1. $weatherForecast = weatherFor( 'Poland/Jaslo', 'place for api key' );
  2.  
  3. if( $weatherForecast !== false ) {
  4. // u can safely use response to generate weather panel or something
  5. http://www.php.net/print_r( $weatherForecast );
  6. } else {
  7. http://www.php.net/echo 'weather unavailable, sorry for inconvenience';
  8. }


Przykładowa zwrotka funkcji:

http://pastebin.com/pHBF0Zd0

Napisany przez: kilab 31.03.2013, 22:09:29

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 sad.gif

Napisany przez: thek 31.03.2013, 23:37:35

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 biggrin.gif 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.

Napisany przez: kilab 1.04.2013, 00:40:30

Ale dotyczyło to sporego miasta w UK więc podejrzewam, że nie pominęli by go wink.gif

Niemniej dzięki za info.

Napisany przez: thek 1.04.2013, 11:32:19

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.

Napisany przez: brzanek 16.11.2013, 10:40:15

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?

Napisany przez: thek 16.11.2013, 21:34:49

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" smile.gif A na gotowca nie licz.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)