Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [funkcja] Pogoda z wunderground.com na kolejne 3 dni
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
jaslanin
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/...urces/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. 'http' => array(
  26. 'timeout' => 2
  27. )
  28. )
  29. );
  30.  
  31. // request data
  32. $jsonString = file_get_contents( $url, 0, $context );
  33.  
  34. // check if request succeeded
  35. if( $jsonString === false ) {
  36.  
  37. if ( $_throwException ) {
  38. throw new Exception('function weatherFor: file_get_contents failed');
  39. }
  40.  
  41. return false;
  42. }
  43.  
  44. // decode JSON
  45. $weatherInfo = json_decode( $jsonString, true );
  46.  
  47. // check if response is JSON
  48. if( json_last_error() !== JSON_ERROR_NONE ) {
  49.  
  50. if ( $_throwException ) {
  51. throw new Exception('function weatherFor: Response not JSON');
  52. }
  53.  
  54. return false;
  55. }
  56.  
  57. // check if error in response
  58. if( isset( $weatherInfo['response']['error'] ) ) {
  59.  
  60. if ( $_throwException ) {
  61. throw new Exception('function weatherFor: Error in response');
  62. }
  63.  
  64. return false;
  65. }
  66.  
  67. return $weatherInfo;
  68. }


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. print_r( $weatherForecast );
  6. } else {
  7. echo 'weather unavailable, sorry for inconvenience';
  8. }


Przykładowa zwrotka funkcji:

http://pastebin.com/pHBF0Zd0
kilab
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
thek
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.
kilab
Ale dotyczyło to sporego miasta w UK więc podejrzewam, że nie pominęli by go wink.gif

Niemniej dzięki za info.
thek
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.
brzanek
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?
thek
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.
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-2024 Invision Power Services, Inc.