Tutorial PHP – Script de previsão do tempo

Bem, como alguns já sabem, o topo deste blog muda constantemente de paisagem de acordo com a previsão do tempo de minha cidade (Natal/RN). Mas como fiz isso? PHP!
A seguir detalho os passos…
Primeiramente veremos de onde pegar as informações do tempo. Escolhi o tempoagora, pois ao fim do endereço insere-se a cidade de onde deseja [...]


Bem, como alguns já sabem, o topo deste blog muda constantemente de paisagem de acordo com a previsão do tempo de minha cidade (Natal/RN). Mas como fiz isso? PHP!

A seguir detalho os passos…

Primeiramente veremos de onde pegar as informações do tempo. Escolhi o tempoagora, pois ao fim do endereço insere-se a cidade de onde deseja buscar a previsão, facilitando assim nosso trabalho.

No meu caso seria http://tempoagora.uol.com.br/previsaodotempo.html/brasil/Natal-RN.

Agora vamos ao que interessa.

O Script completo desse tutorial fica assim:

 <?php
   //Definimos a cidade
   $cidade = 'Natal-RN';
   //Capturamos o conteudo do site
   $file = file_get_contents("http://tempoagora.uol.com.br/previsaodotempo.html/brasil/".$cidade);
 
   //Capturamos a imagem
   $img = explode("mini-",$file);
   $img = explode(".gif",$img[2]);         
 
   switch($img[0]) {
     case 'PI':   print "Pouco ensolarado"; break;
     case 'CC':   print "Céu Claro"; break;
     case 'PC':   print "Pancadas de chuva"; break;
     case 'NC':   print "Nublado com chuva"; break;
     case 'CH':   print "Chuvoso"; break;
     case 'NB':	  print "Nublado"; break;
     case 'PN':   print "Poucas núvens"; break;
     default:     print "Céu claro"; break;
     }
?>

Agora vamos às explicações…

   //Definimos a cidade
   $cidade = 'Natal-RN';
   //Capturamos o conteudo do site
   $file = file_get_contents("http://tempoagora.uol.com.br/previsaodotempo.html/brasil/".$cidade);

Neste trecho de código, primeiramente, definimos a cidade à qual estamos interessados em saber a previsão do tempo. A seguir, utilizando-se da função file_get_contents, capturamos o conteúdo da página como um arquivo. Repare que a variável $cidade aparece concatenada em seguida com o endereço, completando assim o mesmo.

   //Dividimos o conteudo em partes
   $sep = explode("°C",$file);
 
   //Capturamos a imagem
   $img = explode("mini-",$file);
   $img = explode(".gif",$img[2]);

De posse dos dados do conteúdo site na variável $file, iremos tratá-lo agora. Com o site aberto, percebemos que uma imagem é apresentada, com o desenho da previsão (como neste site). É em cima dela que iremos trabalhar.

Clicando em ‘exibir imagem’ com o botão direito vemos que o endereço segue um padrão, como por exemplo mini-NB.gif, para nublado. E é isso que vem depois do ‘mini-’ que irá nos interessar.

Com o auxílio da função explode, quebramos o conteúdo de $file cada vez que aparecer ‘mini-’, e depois fazemos outro explode, mas dessa vez com $img[2], cada vez que encontrarmos ‘.gif’, que é para restar apenas as duas letras correspondentes à previsão, como ‘NB’ por exemplo.

Pronto! Agora para finalizar:

   switch($img[0]) {
     case 'PI':   print "Pouco ensolarado"; break;
     case 'CC':   print "Céu Claro"; break;
     case 'PC':   print "Pancadas de chuva"; break;
     case 'NC':   print "Nublado com chuva"; break;
     case 'CH':   print "Chuvoso"; break;
     case 'NB':	  print "Nublado"; break;
     case 'PN':   print "Poucas núvens"; break;
     default:     print "Céu claro"; break;
     }

No passo anterior fizemos um explode na imagem, e gravamos o resultado na variável $img. Esta variável é um vetor de Strings, e se imprimirmos a posição zero desse vetor, teremos o resultado que desejamos.

Todas as possíveis situações são: PI, CC, PC, NC, CH, NB e PN. Como podem ver, fiz apenas um switch com $img[0], mas vocês podem adaptar da forma que desejarem.

Bom isso é só. Espero ter explicado direitinho.

Quaisquer dúvidas, podem perguntar nos comentários. Estarei à disposição.

, , ,

  1. #1 by Ale on 20 de novembro de 2008

    Vc viu que o gmail faz tipo isso tb? Nos temas…

  2. #2 by arthur on 20 de novembro de 2008

    Foi… eu percebí isso também… :D

  3. #3 by Bruno Fumagally on 2 de dezembro de 2008

    Opa amigo, poderia dar uam explicação breve de como pegar mais dados, como por exemplo a temperatura máxima e mínima por exemplo…

  4. #4 by arthur on 2 de dezembro de 2008

    Olá Bruno,
    Para mostrar mais dados devemos “quebrar” o arquivo mais vezes. Vou dar o exemplo das temperaturas máximas e mínimas como você citou.
    Acrescente $temp = explode(”&deg ;C”,$file); em qualquer lugar do arquivo. Isso faz com que o arquivo seja dividido a cada ºC. Feito isso, faça um teste. Escreva echo $temp[3]; e verá que terminará na temperatura mínima, como 25 por exemplo. Mas terá algo mais atrás. Para pegar só a temperatura basta utilizar substr($temp[3],-2), negativo pois pega duas posições de trás para frente. Então basta dar um echo substr($temp[3],-2).”&deg ;C”; para escrever a temperatura mínima. De forma análoga é feita para a máxima, mas nesse caso usa-se $temp[4]. Perceba que escrevi &deg ; com um espaço antes do ponto e vírgula, mas quando for escrever terá que juntá-los.
    Qualquer dúvida pode perguntar.
    abraço

  5. #5 by Bruno Fumagally on 3 de dezembro de 2008

    Rapaiz!!! Valew mesmo funciono perfeitamente… só uma dúvida… ele gera é um array correto pra você então selecionar qual exibir como exemplo $temp[1]… $temp[2]… existe alguma forma de listar todos os arrays criados?

  6. #6 by arthur on 3 de dezembro de 2008

    Que bom que deu certo. :D
    Ele gera um array sim. Para listar tudo criado utilizo var_dump ou então print_r. Não sei se é isso que está querendo…

  7. #7 by Bruno Fumagally on 3 de dezembro de 2008

    Caraca viu….!!! agora sim… sei exatamente como coletar os dados de página esternas, muito obrigado amigo… qualquer coisa que precise também e que eu possa ajudar é só add meu MSn aí… Valew

  8. #8 by arthur on 3 de dezembro de 2008

    Beleza Bruno! Que bom que ajudei. Adicionei você aqui no msn.
    Abração, e obrigado pela visita.

  9. #9 by Djalma Chagas Bina on 22 de dezembro de 2008

    Muito bom e funcional seu script,Artur ! gostaria de saber como eu poderia acrescentar outros dados de tempo na página como Vento,Umidade relativa,Pressão,Visibilidade,etc… tem que saber quais as variaveis que pegam estes dados ?

  10. #10 by arthur on 23 de dezembro de 2008

    Olá Djalma,
    que bom que gostou do script.
    Para pegar outros dados, basta fazer o explode no respectivo valor. Por exemplo, se quiser saber dados sobre o Vento, explode(’km/h’, $file), pressão explode(’hPa’, $file) e assim por diante. Não precisa saber as variáveis, basta apenas quebrar em um valor próximo a ele, no caso o explode faz essa quebra. Espero que tenha entendido.
    Abraço

  11. #11 by Djalma Chagas Bina on 29 de dezembro de 2008

    Exatamente, deu certo, eu fiz esta página baseada em seu script -http://djalmabina.orgfree.com/Forms/tempo.php para efetuar uma busca nacional e está exibindo as condições meteorologicas correntes perfeitamente. Vc sabe como poderiamos pegar as previsões para os outros dias da semana ? Eu já tentei com um foreach pegando uma matriz de 7 dias com a função strftime(’%A %d %B %Y’); mas não deu certo ! Obrigado.

  12. #12 by Djalma Chagas Bina on 20 de janeiro de 2009

    Entrar nome da Cidade e UF:

    <?php

    //$cidadeuf = Cidade-UF
    //Exemplo: Tramandai-RS (Tramandaí tem acento mas não se coloca)

    $cidadeuf = $_POST['cidadeuf'];

    function tempo($cidadeuf)
    {
    //abre arquivo
    $arquivo = @file_get_contents(”http://tempoagora.uol.com.br/previsaodotempo.html/brasil/”.$cidadeuf);

    //separa arquivo em partes
    $temp = explode(”°C”,$arquivo);
    $vento = explode(”km/h”,$arquivo);
    $umidade = explode(”%”,$arquivo);
    $pressao = explode(”hPa”,$arquivo);

    //pega imagem
    $img = explode(”mini-”,$arquivo);
    $img = explode(”.gif”,$img[2]);

    switch($img[0])
    {
    case ‘PI’: print “Pouco ensolarado”; break;
    case ‘CC’: print “Ceu Claro”; break;
    case ‘PC’: print “Pancadas de chuva”; break;
    case ‘NC’: print “Nublado com chuva”; break;
    case ‘CH’: print “Chuvoso”; break;
    case ‘NB’: print “Nublado”; break;
    case ‘PN’: print “Poucas nuvens”; break;
    default: print “Ceu claro”; break;
    }

    //exibe temperaturas

    $tempomax = substr($temp[1],-2);
    $tempomin = substr($temp[2],-2);
    $wind = substr($vento[0],-1);
    $humidity = substr($umidade[0],-2);
    $pressure = substr($pressao[0],-6);

    setlocale(LC_ALL, “pt_BR”);
    echo ““.strftime(”%A %d %B %Y”).”";
    echo “
    “.$cidadeuf.”";
    echo “”;
    echo “Min: $tempomin°C”;
    echo “Max: $tempomax°C”;
    echo “Ventos: $wind km/h “;
    echo “Umidade: $humidity % “;
    echo “Pressao: $pressure hPa
    “;
    echo ” “;
    }
    tempo(”$cidadeuf”)
    ?>

  13. #13 by arthur on 20 de janeiro de 2009

    Fala pessoal. Estou um pouco ausente do blog… Relaxando nas férias. Peço desculpas pela ausência.
    Djalma, quanto a sua dúvida, já tentei diversas vezes e não consegui pegar os dados dos outros dias, mas continuarei tentando. Se conseguir, envio-te um e-mail.
    Tadeu, para pegar os outros campos é exatamente como Djalma escreveu agora. A única mudança no script dele para o que disponibilizei aqui é que ele recebe o nome da cidade através de um POST. Mas como você pode ver, ele pega além das temperaturas, dados como pressão, umidade e etc. Abraço a todos.

  14. #14 by André on 28 de janeiro de 2009

    Esse código não está funcionando.

  15. #15 by arthur on 28 de janeiro de 2009

    Olá André,
    Que parte não está funcionando?
    Este blog utiliza exatamente este código no topo da página, e funciona perfeitamente. Deve estar faltando alguma coisa…

  16. #16 by Thiago on 27 de julho de 2009

    De acordo com exemplo do Djalma, fiz uma modificaçao na hora de atribuir a variavel tempoMax e tempoMin, ja que do jeito em que está, se a temperatura tiver ponto, ele vai exibir algo assim: .3 C e nao a temperatura inteira… basta fazer a seguinte modificacao:

    $tempomax = substr($temp[1],-4);

    if(strpos($tempomax, “>”) == true){
    $tempomax = substr($temp[1],-2);
    }

    $tempomin = substr($temp[2],-4);

    if(strpos($tempomin, “>”) == true){
    $tempomin = substr($temp[1],-2);
    }

  17. #17 by arthur on 27 de julho de 2009

    Muito bem observado Thiago.
    Abraço

  18. #18 by Nivaldo on 27 de agosto de 2009

    Deu esse erro:

    Parse error: parse error, unexpected ‘:’ in /home/domains/caarapoense.com.br/web/test.php on line 11

  19. #19 by Nivaldo on 27 de agosto de 2009

    Warning: file_get_contents(): URL file-access is disabled in the server configuration in /home/domains/caarapoense.com.br/web/tempo.php on line 5

    Warning: file_get_contents(http://tempoagora.uol.com.br/previsaodotempo.html/brasil/Caarapo-MS): failed to open stream: no suitable wrapper could be found in /home/domains/caarapoense.com.br/web/tempo.php on line 5
    Céu claro

    Script que estou usando:

  20. #20 by Fabiano on 3 de setembro de 2009

    Estranho em localhost ele funciona perfeitamente, mas quando acesso no servidor web ele não aparece as informações, sabe dizer se isso é por restrição do UOL?

  21. #21 by Rafael R.P (Raff) on 17 de setembro de 2009

    arthur :
    Olá Bruno,
    Para mostrar mais dados devemos “quebrar” o arquivo mais vezes. Vou dar o exemplo das temperaturas máximas e mínimas como você citou.
    Acrescente $temp = explode(”&deg ;C”,$file); em qualquer lugar do arquivo. Isso faz com que o arquivo seja dividido a cada ºC. Feito isso, faça um teste. Escreva echo $temp[3]; e verá que terminará na temperatura mínima, como 25 por exemplo. Mas terá algo mais atrás. Para pegar só a temperatura basta utilizar substr($temp[3],-2), negativo pois pega duas posições de trás para frente. Então basta dar um echo substr($temp[3],-2).”&deg ;C”; para escrever a temperatura mínima. De forma análoga é feita para a máxima, mas nesse caso usa-se $temp[4]. Perceba que escrevi &deg ; com um espaço antes do ponto e vírgula, mas quando for escrever terá que juntá-los.
    Qualquer dúvida pode perguntar.
    abraço

    Cara se eu dou um $temp = explode(”&deg ;C”,$file);

    ele pega e inclui a página inteira, tu tens uma solução?

  22. #22 by Flavio on 17 de setembro de 2009

    Olah Arhur, está funcionando esse script ainda? Ñ consegui aqui, obrigado!

  23. #23 by Maicon on 29 de setembro de 2009

    Olá pessoal sou novo na linguagem PHP e estou com dificuldades de aplicar este script em um site, pois o mesmo me retorna erros.

    PHP Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/franzens/public_html/maicon/index.php on line 5
    [28-Sep-2009 22:58:29] PHP Warning: file_get_contents(http://tempoagora.uol.com.br/previsaodotempo.html/brasil/NovoHamburgo-RS) [function.file-get-contents]: failed to open stream: no suitable wrapper could be found in /home/franzens/public_html/maicon/index.php on line 5

    se puderem me ajudar obrigada.

    Add MSN me_maikinhonh@hotmail.com

  24. #24 by Maicon on 30 de setembro de 2009

    Desculpem ai meu comentário… Criei um servidor aki no meu pc e rodo bunito… Vlw Arthur.

  25. #25 by André on 29 de dezembro de 2009

    Pessoas, consegui pegar as temperaturas de amanhã usando a seguinte config.

    echo "Hoje";
    echo substr($temp[3],-2)."°C";
    echo substr($temp[4],-2)."°C";
    echo "Amanhã";
    echo substr($temp[15],-2)."°C";
    echo substr($temp[16],-2)."°C";

  26. #26 by weslley clyton on 5 de janeiro de 2010

    e ae brother blz?? queria saber onde consigo as imagens dos estados do tempo. .vlw.

(não será publicado)
  1. Sem citações ainda.