Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [funkcja] Pogoda z wunderground.com na kolejne 3 dni, darmowa prognoza pogody na 3 kolejne dni
jaslanin
post 31.03.2013, 20:24:55
Post #1





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


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

Ten post edytował jaslanin 31.03.2013, 20:28:12


--------------------
Good luck and happy PHP'ing
Go to the top of the page
+Quote Post
kilab
post 31.03.2013, 22:09:29
Post #2





Grupa: Zarejestrowani
Postów: 180
Pomógł: 19
Dołączył: 4.11.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
thek
post 31.03.2013, 23:37:35
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
kilab
post 1.04.2013, 00:40:30
Post #4





Grupa: Zarejestrowani
Postów: 180
Pomógł: 19
Dołączył: 4.11.2007

Ostrzeżenie: (0%)
-----


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

Niemniej dzięki za info.

Ten post edytował kilab 1.04.2013, 00:42:32


--------------------
Go to the top of the page
+Quote Post
thek
post 1.04.2013, 11:32:19
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
brzanek
post 16.11.2013, 10:40:15
Post #6





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
thek
post 16.11.2013, 21:34:49
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 10:11