Me surgiu um trabalho aqui pelo qual preciso exibir a temperatura atual da cidade, e como estava com insônia decidi brincar um pouco e criar uma solução para isso, fui para o google e pesquisei por “Previsão do Tempo“, me surgiram alguns resultados, porém, gostei mais do UOL.
Depois disso foi correr para a criação do script para ler o HTML e retornar um objeto contendo as informações da temperatura no momento, segue o código escrito em php:
function loadTemp($cidade='Palmas-TO'){ // variavel para dados de retorno $ret = array('url' => "http://tempoagora.uol.com.br/previsaodotempo.html/brasil/$cidade/"); // carrega o html do tempoagora $html = file_get_contents($ret['url']); // Pegamos apenas a parte que interessa do html $iniflag = '<!-- Insere dados Atuais de AeroPortos ou Est. Meteorologica -->'; $fimflag = '<!-- FIM Insere dados Atuais de AeroPortos ou Est. Meteorologica -->'; $ini = strrpos($html, $iniflag ) + strlen($iniflag); $fim = strpos($html, $fimflag, $ini); $html = substr($html, $ini, ($fim-$ini)); // pegamos a url do icone preg_match('@<img src="/(imagens/icones/[a-zA-Z\-]+.gif)"@', $html, $mat); $ret['icone'] = 'http://tempoagora.uol.com.br/' . $mat[1]; // Limpa o código html $content = strip_tags($html); $content = str_replace(' ', ' ', $content); // quebra o que sobrou em um vetor $content = explode("\n", $content); // limpa espaços e linhas em branco foreach ($content as $k => &$v){ $v = trim($v); if ($v==='') unset($content[$k]); } // pega horário da verificação $lin = array_shift($content); preg_match('@[0-9]{1,2}:[0-9]{1,2}@', $lin, $mat); $ret['verificado'] = $mat[0]; // pega insidência de nuvens $ret['nuvens'] = array_shift($content); // define nomes melhores para as próximas propriedades $keys = array('temperatura', 'sensacao', 'vento', 'pressao', 'umidade', 'visibilidade'); // reseta as chaves do vetor $content = array_unique($content); // percorre chaves impares e aplica as propriedades definidas acima for ($x=1; $x<=11; $x=$x+2){ $ret[array_shift($keys)] = $content[$x]; } // retorna os dados como um objeto return (object)$ret; }
Analisando o site deles, notei que a temperatura é atualizada de hora em hora, então a melhor forma de utilizar essa solução é utilizando o crontab, que executa a cada hora, eu escolhi executar no quinto minuto de cada hora cheia (5:05, 6:05, etc).
segue o código php que o crontab executa:
require 'loadTemp.php'; // define nome do arquivo de cache $cache_file = sys_get_temp_dir() . '/temp'; // carrega a temperatura $temp = loadTemp(); // salva em cache file_put_contents($cache_file, serialize($temp));
E para exibir no sistema eu fiz uma funçãozinha:
function temp(){ $cache_file = sys_get_temp_dir() . '/temp'; // se o cache existe, retorna o objeto if (file_exists($cache_file)) return unserialize(file_get_contents($cache_file)); // senão cria o cache e retorna =) $temp = loadTemp(); file_put_contents($cache_file, serialize($temp)); return $temp; }
depois, no local específico, ficou algo mais ou menos assim:
<?php $temp = temp() ?> <img src="<?php echo $temp->icone ?>" alt="<?php echo $temp->nuvens ?>" /> <span><?php echo $temp->temperatura ?> (<a rel="external" href="<?php echo $temp->url ?>">saiba mais</a>)</span>
Minha forma de pagar por esse uso é manter um link para o Tempoagora, o que é bastante interessante, pois meu visitante pode querer obter mais informações
É isso ai, abraço a todos