API Yahoo weather (Previsão do Tempo) em PHP


Hoje mostrarei como usar o serviço da Yahoo, iremos usar o YQL, para ter uma resposta em JSON, ao contrário da tradicional que retorna em rss.
Se quiser fazer uns testes antes, pode fazer usando o console, pode ir lá eu espero :D

já voltou ?, agora vamos prosseguir, para começar veja um exemplo de JSON retornado pela API.

Exemplo de JSON retornado pela API do Yahoo:

{
"query":{
"count":1,
"created":"2012-11-14T21:34:37Z",
"lang":"en-US",
"results":{
"channel":{
"title":"Yahoo! Weather - Castlecary, GB",
"link":"http://us.rd.yahoo.com/dailynews/rss/weather/Castlecary__GB/*http://weather.yahoo.com/forecast/UKXX1464_f.html",
"description":"Yahoo! Weather for Castlecary, GB",
"language":"en-us",
"lastBuildDate":"Wed, 14 Nov 2012 8:50 pm GMT",
"ttl":"60",
"location":{
"city":"Castlecary",
"country":"United Kingdom",
"region":""
},"units":{
"distance":"mi",
"pressure":"in",
"speed":"mph",
"temperature":"F"
},"wind":{
"chill":"40",
"direction":"260",
"speed":"5"
},"atmosphere":{
"humidity":"100",
"pressure":"30.21",
"rising":"0",
"visibility":"6.21"
},"astronomy":{
"sunrise":"7:48 am",
"sunset":"4:05 pm"
},"image":{
"title":"Yahoo! Weather",
"width":"142",
"height":"18",
"link":"http://weather.yahoo.com",
"url":"http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif"
},
"item":{
"title":"Conditions for Castlecary, GB at 8:50 pm GMT",
"lat":"55.98",
"long":"-3.94",
"link":"http://us.rd.yahoo.com/dailynews/rss/weather/Castlecary__GB/*http://weather.yahoo.com/forecast/UKXX1464_f.html",
"pubDate":"Wed, 14 Nov 2012 8:50 pm GMT",
"condition":{
"code":"29",
"date":"Wed, 14 Nov 2012 8:50 pm GMT",
"temp":"43",
"text":"Partly Cloudy"
},
"description":"n<img alt="" src="http://l.yimg.com/a/i/us/we/52/29.gif" />
n<b>Current Conditions:</b>
nPartly Cloudy, 43 F
n
<b>Forecast:</b>
nWed - Partly Cloudy. High: 49 Low: 40
nThu - Mostly Cloudy. High: 46 Low: 44
n
n<a href="http://us.rd.yahoo.com/dailynews/rss/weather/Castlecary__GB/*http://weather.yahoo.com/forecast/UKXX1464_f.html">Full Forecast at Yahoo! Weather</a>
n(provided by <a href="http://www.weather.com">The Weather Channel</a>)
n",
"forecast":[
{
"code":"29",
"date":"14 Nov 2012",
"day":"Wed",
"high":"49",
"low":"40",
"text":"Partly Cloudy"
},
{
"code":"28",
"date":"15 Nov 2012",
"day":"Thu",
"high":"46",
"low":"44",
"text":"Mostly Cloudy"
}],
"guid":{
"isPermaLink":"false",
"content":"UKXX1464_2012_11_15_7_00_GMT"
}
}
}
}
}
}
O JSON é uma linguagem muito fácil de se entender, então vou dispensar comentários.
Agora vamos ao PHP, para o JSON usamos a função json_decode, ela é muito simples de usar, o primeiro argumento(Obrigatório) é a string do JSON, e o segundo(Opcional) é um boolean, informando se vai ser retornado um objeto(false, padrão) ou uma array associativa(true), depois é só usarmos os dados obtidos.
Veja o exemplo abaixo:

Exemplo de PHP

<!--?php <br ?-->// Dados do usuario
$woeid = "15205";
$unit = "c";
// Obter JSON retornado pela API do yahoo weather, usando a file_get_contents
// Caso a allow_url_fopen esteja desativada no servidor você pode usar a dica abaixo
// http://blogmrcs.blogspot.com/2015/08/alternativa-filegetcontents-usando-curl.html
$yql = "select * from weather.forecast where woeid='$woeid' and u='$unit'";
$json = file_get_contents('http://query.yahooapis.com/v1/public/yql?q=' . urlencode($yql) . '&format=json');
// criar um array associativo, contendo o retorno da função json_decode
$weather = json_decode($json, true);
// Criamos outras array para facilitar o acesso aos dados
$channel = $weather['query']['results']['channel'];
$atmosphere = $channel['atmosphere'];
$condition = $channel['item']['condition'];
$forecast = $channel['item']['forecast'];
echo "</pre>
<hr />
<h5>" . htmlentities("Informações") . "</h5>
<pre>
";
echo "Data: " . $condition['date'];
echo "
Cidade: " . $channel['location']['city'];
echo "
". htmlentities("País: ") . $channel['location']['country'];
echo "</pre>
<hr />
<h5>Hoje (" .$condition['date'] . ")</h5>
<pre>
";
echo htmlentities("Condição: ") . $condition['text'];
echo "
" . htmlentities("Temperatura (°C): ") . $condition['temp'];
echo "
" . htmlentities("Humidade: ") . $atmosphere['humidity'] . "%";
echo "
" . htmlentities("Minimo (°C): ") . $forecast[0]['low'];
echo "
" . htmlentities("Máximo (°C): ") . $forecast[0]['high'];
echo "</pre>
<hr />
<h5>" . htmlentities("Amanhã (") . $forecast[1]['date'] . ")</h5>
<pre>
";
echo htmlentities("Condição: ") . $forecast[1]['text'];
echo "
" . htmlentities("Minimo (°C): ") . $forecast[1]['low'];
echo "
" . htmlentities("Máximo (°C): ") . $forecast[1]['high'];
?>

Na API do Yahoo usamos um WOEID (Where On Earth IDentifier), você pode usar esse site para conseguir encontrar o WOEID facilmente.

Tutorial por Victor Aurélio S.

Compartilhe no:

Dono do blog e Autor.
Possui conhecimento em diversos assuntos, ensina coisas e apresenta soluções através dos problemas que ele mesmo se depara em seu desktop e na Web.

Devido sua rotina não tem tempo para o blog mas sempre que possivel publica post unicos e exclusivos

7 Respostas em "API Yahoo weather (Previsão do Tempo) em PHP"

  1. Ótimo código. Para quem usava o API do Google, esta é uma ótima solução para nossos problemas. Uma pergunta. Como faço para usar a condição do tempo em portugues? Obrigado

    ResponderExcluir
  2. Pessoal, post antigo eu sei mas para quem está procurando aí vai uma dica para mostrar os dados em Português com o código PHP disponibilizado aqui na página:

    switch ($condition['code']) {
    case 0: $condicao_tempo = 'Tornado' ;break;
    case 1: $condicao_tempo = 'Tempestade tropical' ;break;
    case 2: $condicao_tempo = 'Furacão' ;break;
    case 3: $condicao_tempo = 'Tempestades severas' ;break;
    case 4: $condicao_tempo = 'Trovoadas' ;break;
    case 5: $condicao_tempo = 'Misto de chuva e neve' ;break;
    case 6: $condicao_tempo = 'Misto de chuva e granizo' ;break;
    case 7: $condicao_tempo = 'Misto de neve e granizo' ;break;
    case 8: $condicao_tempo = 'Garoa congelante' ;break;
    case 9: $condicao_tempo = 'Garoa' ;break;
    case 10: $condicao_tempo = 'Chuva gelada' ;break;
    case 11: $condicao_tempo = 'Chuva' ;break;
    case 12: $condicao_tempo = 'Chuva' ;break;
    case 13: $condicao_tempo = 'Nevoeiro' ;break;
    case 14: $condicao_tempo = 'Chuva de nevoeiro' ;break;
    case 15: $condicao_tempo = 'Nevoeiro' ;break;
    case 16: $condicao_tempo = 'Neve' ;break;
    case 17: $condicao_tempo = 'Granizo' ;break;
    case 18: $condicao_tempo = 'Chuva com neve' ;break;
    case 19: $condicao_tempo = 'Poeira' ;break;
    case 20: $condicao_tempo = 'Pebuloso' ;break;
    case 21: $condicao_tempo = 'Neblina' ;break;
    case 22: $condicao_tempo = 'Enfumaçado' ;break;
    case 23: $condicao_tempo = 'Tempestuoso' ;break;
    case 24: $condicao_tempo = 'Ventoso' ;break;
    case 25: $condicao_tempo = 'Frio' ;break;
    case 26: $condicao_tempo = 'Nublado' ;break;
    case 27: $condicao_tempo = 'Muito nublado (noite)' ;break;
    case 28: $condicao_tempo = 'Muito nublado (dia)' ;break;
    case 29: $condicao_tempo = 'Parcialmente nublado (noite)' ;break;
    case 30: $condicao_tempo = 'Parcialmente nublado (dia)' ;break;
    case 31: $condicao_tempo = 'Céu limpo (noite)' ;break;
    case 32: $condicao_tempo = 'Ensolarado' ;break;
    case 33: $condicao_tempo = 'Claro (noite)' ;break;
    case 34: $condicao_tempo = 'Claro (dia)' ;break;
    case 35: $condicao_tempo = 'Misto de chuva e granizo' ;break;
    case 36: $condicao_tempo = 'Quente' ;break;
    case 37: $condicao_tempo = 'Trovoadas isoladas' ;break;
    case 38: $condicao_tempo = 'Trovoadas' ;break;
    case 39: $condicao_tempo = 'Trovoadas' ;break;
    case 40: $condicao_tempo = 'Chuvas esparsas' ;break;
    case 41: $condicao_tempo = 'Neve' ;break;
    case 42: $condicao_tempo = 'Aguaceiros de neve espalhados' ;break;
    case 43: $condicao_tempo = 'Neve' ;break;
    case 44: $condicao_tempo = 'Parcialmente nublado' ;break;
    case 45: $condicao_tempo = 'Trovoadas' ;break;
    case 46: $condicao_tempo = 'Aguaceiros de neve' ;break;
    case 47: $condicao_tempo = 'Trovoadas isoladas' ;break;
    case 3200: $condicao_tempo = 'Não disponível' ;break;
    }

    Depois é só usar a variável $condicao_tempo na sua aplicação.

    Abraço e sucesso.

    ResponderExcluir
  3. Muito bom :)
    Depois quando tiver tempo adicionarei ao post, ok ?

    ResponderExcluir
  4. Sou iniciante na área, alguém poderia me dizer se é possível traduzir a data para português?

    ResponderExcluir
  5. Ola, gostei muito do post me ajudou muito, tem alguma dica para poder dar a previsão do tempo de acordo com a localização do usuario??

    Qualquer coisa meu email é este: tiago.aleff@gmail.com.

    ResponderExcluir
    Respostas
    1. Infelizmente não, o victor aurelio s. é quem criou o Post e atualmente não vejo se há como fazer atualmente já que é um post de 2013. a qualquer momento, novidades.

      Excluir

Eu espero que voce...

1. Comente com moderação.
2. Sugira ou Opine.
3. Divulgue.