Location: PHPKode > scripts > Easy Weather > weather.inc
<?php
error_reporting(0);

//classe base e metodos para obter o tempo para 5 dias
//
//http://xoap.weather.com/weather/local/30339?cc=*&dayf=5&link=xoap&prod=xoap&par=[PartnerID]&key=[LicenseKey]
//
//Your weather.com XML Partner ID & License Key:    https://registration.weather.com/ursa/profile/new?
//Partner ID: 116206xxxx
//License Key: db790b78143xxxx
//var $partner="116309xxxx";
//var $licence="e10c734b607xxxxx";

/*
*  *  *  *  * 

*
   You can get your local weather conditions with weather.com webservice. Problem is you must obey the consult rules. So you need to use different methods of consult their service. So I made fetch_big, fetch_small and fetch_links methods to keep the service happy... (apanha_grande, apanha_pequeno and apanha_links, respectively)
   They actuate if the stored data is 'old' according to those rules.
   Be careful with permitions on the cities and logs folder. We will need to store data.
   You'll need to modify it for fahrenheit measure system if you want, meanning (unit=s) in the url.
*
This was made by Pio A.M. Fernandes in 2009
*  *  *  *  * 
*/
class Weather {

   var $cidade;
   var $partner="1163093587"; //for proof of concept only
   var $licence="e10c734b607586f5";
   var $url;
   var $dados;	
	
   function Weather($cidade) 
   {
	   $this->cidade = $cidade;
       
	   
	   $this->dados = $this->trazer_dados_cidade($cidade);
	   
	   //se vier algum erro do método trazer_dados_cidade, escreve no log,  /// Write errors on log.
	   
	   if ($this->dados != "OK"){
	   $this->url = "http://xoap.weather.com/weather/local/".$this->cidade."?cc=*&dayf=5&link=prod&prod=xoap&unit=m&par=".$this->partner."&key=".$this->licence;
	   $handle = fopen('log/erros.err', 'a+');
			  fwrite($handle, "\n".$this->dados." : ".date("Ymd G:i:s"));
			  fclose($handle);
			  //e tenta nova consulta, para prevenir andar a escrever ficheiros vazios.
			  $this->dados = $this->check_size($cidade);
			  if ($this->dados != "OK"){
				  $handle = fopen('log/erros.err', 'a+');
				  fwrite($handle, "\n".$this->dados." : ".date("Ymd G:i:s") );
				  fclose($handle);
			  }
	   }
	   
	   
	   
	   return $this->dados; //devolve ok ou _NOK_[apanha_<grande | pequeno>]
	   
   }

   function ver_cidade() 
   {
       return $this->cidade; // método para ver a cidade
   }
   function ver_url() 
   {
       return $this->url; // método para ver o url que foi usado
   }
   function ver_partner() 
   {
       return $this->partner; // método para ver que partner estamos a usar
   }
   function ver_licenca() 
   {
       return $this->licence; // método para ver o serial da licença
   }
   function ver_dados(){
		return print_r($this->dados); //retorna OK ou _NOK_ da inicialização da classe
   }
   

function create_all($cidade, $xml, $guardar_links = "nao"){
//Esta função serve para ir buscar dados pelo link total, e usa-se quando há erros
//ou quando estamos a ir buscar dados a uma cidade que não existe na pasta /cidade
if (!is_dir('cidade/'.$cidade))
if (!mkdir ('cidade/'.$cidade, 0777))
return "_NOK_Erro na criação da directoria";

if ($guardar_links != "nao")
{
	$this->apanha_links($xml,$cidade);
}
$erros = "";
$erros .= $this->apanha_pequeno($xml, $cidade);
$erros .=$this->apanha_grande($xml, $cidade);

$erros ="Total de Erros: ".$erros;
	if(strpos($erros,"_NOK_") === FALSE)
		return "OK";
	else
		return "Problemas:".$erros;

} //fim da create_all

function apanha_pequeno($xml, $cidade){
//Esta função trata os dados que vêm pelo link 'pequeno' em que só traz dados do current conditions
//Esta função cria o ficheiro /cidade/{$cidade}/cc.ini
$result = $xml->xpath('cc'); 
if (count($result)) {

$cc = "";
			$cc .="\n[cc]\n"."datahora = \"".$xml->cc->lsup."\"\n";
			$cc .="temperatura = \"".$xml->cc->tmp."\"\n";
			$cc .="desc = \"".$xml->cc->t."\"\n";
			if (strlen($xml->cc->icon) <2)
				$cc .="icon = \"<img src=\"icons/61x61/0".$xml->cc->icon.".png\" />\"\n";
			else
				$cc .="icon = \"<img src=\"icons/61x61/".$xml->cc->icon.".png\" />\"\n";
			//$cc .="icon = \"".$xml->cc->icon."\"\n";
			$cc .="humidade = \"".$xml->cc->hmid."\"\n";
		
		$handle = fopen('cidade/'.$cidade.'/cc.ini', 'w+');
		
		  if (fwrite($handle, $cc) === FALSE) 
		 {
				fclose($handle);
				return "_NOK_Erro ao escrever no ficheiro de cc";
		 }
fclose($handle);
return "OK_pequeno";		
}
return "_NOK__pequeno";

}//fim da apanha_pequeno

function apanha_grande($xml, $cidade){
//Esta função trata os dados que vêm pelo link 'grande' em que traz os dados cc=* e dayf=5, 
//excepto os links de publicidade.
//Esta função cria o ficheiro cidade/{$cidade}/forecast.ini
$j = 0;
$forecast = array();
$result = $xml->xpath('dayf'); 
if (count($result)) {
	foreach ($xml->dayf->day as $day) 
		   {
				$forecast[$j] .= "\n[forecast_dia_{$j}]\ndia_semana = \"".$day["t"]."\"\n";
				$forecast[$j] .= "temp_maxima = ".$day->hi."\n"; 
				$forecast[$j] .= "temp_minima = ".$day->low."\n";
				
				foreach ($day->part as $part)
				{
					switch((string) $part["p"]) 
					{
						case "d": //dia
							if($j<1) // se o $j for 0, quero sacar o icon 61x61 senao, quero o 31x31
							
								if (strlen($part->icon) <2) //problema do ficheiro com 0: Pode vir no XML 1,2,3 e o ficheiro chamar-se 01.png.....
									$forecast[$j] .="icon_dia = \"<img src=\"icons/61x61/0".$part->icon.".png\" />\"\n";
								else
									$forecast[$j] .="icon_dia = \"<img src=\"icons/61x61/".$part->icon.".png\" />\"\n";
							else
								if (strlen($part->icon) <2)
									$forecast[$j] .="icon_dia = \"<img src=\"icons/31x31/0".$part->icon.".png\" />\"\n";
								else
									$forecast[$j] .="icon_dia = \"<img src=\"icons/31x31/".$part->icon.".png\" />\"\n";
									$forecast[$j] .="desc_dia = \"". $part->t."\"\n";
									$forecast[$j] .="precipitacao_dia = \"". $part->ppcp."\"\n";
							break;
						case "n": //noite
							if($j<1)
								if (strlen($part->icon) <2)
									$forecast[$j] .="icon_noite = \"<img src=\"icons/61x61/0".$part->icon.".png\" />\"\n";
								else
									$forecast[$j] .="icon_noite = \"<img src=\"icons/61x61/".$part->icon.".png\" />\"\n";
							else
								if (strlen($part->icon) <2)
								$forecast[$j] .="icon_noite = \"<img src=\"icons/31x31/0".$part->icon.".png\" />\"\n";	
								else
								$forecast[$j] .="icon_noite = \"<img src=\"icons/31x31/".$part->icon.".png\" />\"\n";	
								$forecast[$j] .="desc_noite = \"". $part->t."\"\n";
								$forecast[$j] .="precipitacao_noite = \"". $part->ppcp."\"\n";
							break;
						
					}
				}
					$j++;
			
			
			}

			$handle = fopen('cidade/'.$cidade.'/forecast.ini', 'w+');
			for ($j = 0 ; $j < sizeof($forecast) ; $j++)
			{
			  if (fwrite($handle, $forecast[$j]) === FALSE) 
			 {
					fclose($handle);
					return "_NOK_Erro ao escrever no ficheiro de forecast";
			 }	   
			}
			fclose($handle);
			return "OK_grande";
}
return "_NOK__grande";
}//fim da apanha_grande

function apanha_links($xml,$cidade)
{
//Esta função apanha os links e cria o ficheiro /cidade/{$cidade}/links.ini
	$j = 0;
		$links = array();
		
		$result = $xml->xpath('lnks'); 
		if (count($result)) {
			foreach ($xml->lnks->link as $link) 
				   {
						$links[$j] = "\n[link{$j}]\n titulo = \"".$link->t."\"\n src = \"".$link->l."\"";
						$j++;
				   }

			$handle = fopen('cidade/'.$cidade.'/links.ini', 'w+');
			for ($j = 0 ; $j < sizeof($links) ; $j++)
			{
			  if (fwrite($handle, $links[$j]) === FALSE) 
			 {
					fclose($handle);
					return "_NOK_ links";
			 }	   
			}
				fclose($handle);
		}
}////fim da apanha_links
   
function trazer_dados_cidade($cidade)
{
//Esta função recebe uma cidade, na forma POXXxx, e chama a função de apanhar dados [todos|parte|nenhuns(ficheiro)]
//do site weather.com ou então da pasta /cidade, caso a "idade" dos ficheiros de dados guardados sobre a cidade não tenha 
//ainda ultrapassado as regras do site.
	$erros = "";	   
	$this->cidade = $cidade;
	if(!is_dir("cidade/".$cidade) || (!file_exists("cidade/{$cidade}/links.ini")) || (!file_exists("cidade/{$cidade}/cc.ini")) ||
			(!file_exists("cidade/{$cidade}/forecast.ini")) )
	{
	//entra no fluxo da NOVA CIDADE
	//vai buscar dados com o link grande
		
		//$xmlstr = $this->my_file_get_contents("weather.xml");
		$this->url = $url="http://xoap.weather.com/weather/local/".$this->cidade."?cc=*&dayf=5&prod=xoap&link=xoap&unit=m&par=".$this->partner."&key=".$this->licence;
		$xmlstr = $this->my_file_get_contents($url);
		if ($xmlstr === FALSE) return "_NOK_Sem Servidor";
		$xml = simplexml_load_string($xmlstr); 
		if ($this->create_all($cidade, $xml, "links:sim") != "OK" )
			$erros .= "Prob no create_all";
	}else{
	//entra no fluxo do update dados
	//analisa as datas dos ficheiros: 

			if (time() - filemtime("cidade/".$cidade."/forecast.ini") >= 12600)
			{//  se o forecast tiver + de 210' chama pelo link grande
					//vai buscar os dados ao weather.com com o link comprido.
					$this->url = $url="http://xoap.weather.com/weather/local/".$this->cidade."?cc=*&dayf=5&link=xoap&prod=xoap&unit=m&par=".$this->partner."&key=".$this->licence;
					//$url="http://xoap.weather.com/weather/local/".$cidade."?cc=*&dayf=5&prod=xoap&unit=m&par=".$partner."&key=".$licence;
					$xmlstr = $this->my_file_get_contents($url);
					if (!$xmlstr) return "_NOK_Erro na ligação";
					$xml = simplexml_load_string($xmlstr); 
					$erros .= $this->apanha_pequeno($xml, $cidade);
					$erros .= $this->apanha_grande($xml, $cidade);
					
				
			}elseif (time() - filemtime("cidade/".$cidade."/cc.ini") >= 1500)
			{
					//  senão, se o cc tiver mais de 25', chama pelo link pequeno
					
					$this->url = $url="http://xoap.weather.com/weather/local/".$this->cidade."?cc=*&prod=xoap&unit=m&par=".$this->partner."&key=".$this->licence;
					$xmlstr = $this->my_file_get_contents($url);
					if (!$xmlstr) return "_NOK_Erro na ligação";
					$xml = simplexml_load_string($xmlstr); 
					$erros .= $this->apanha_pequeno($xml, $cidade);
			}
	}
	$erros ="Total de Erros: ".$erros;
	if(strpos($erros,"_NOK_") === FALSE)
		return "OK";
	else
		return "Problemas:".$erros;
}/// fim da trazer_dados

function check_size($cidade){
		if (
			(file_exists("cidade/{$cidade}/links.ini") &&
			file_exists("cidade/{$cidade}/cc.ini") &&
			file_exists("cidade/{$cidade}/forecast.ini"))
			&& 
			(filesize("cidade/{$cidade}/links.ini") == 0 ||
			filesize("cidade/{$cidade}/cc.ini") == 0 ||
			filesize("cidade/{$cidade}/forecast.ini") == 0) 
			)
		{
					$xmlstr = $this->my_file_get_contents($this->url);
					$xml = simplexml_load_string($xmlstr);
					$erros = $this->create_all($cidade,$xml, "links:sim");
					$erros ="Total de Erros: ".$erros;
					if(strpos($erros,"_NOK_") === FALSE)
					return "OK";
					else
					return "Problemas:".$erros;
		
		}
		return "Ficheiros não existentes cidade/".$cidade;
		}

function my_file_get_contents($uuuurl){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $uuuurl);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_TIMEOUT, 180);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1); 

		// grab URL and pass it to the browser
		$dados = curl_exec($ch);

		// close cURL resource, and free up system resources
		curl_close($ch);
		return $dados;

}

		
} // fim da classe weather
?>
Return current item: Easy Weather