Информер погоды для сайта


Вот такой скрипт информера погоды работающего на основе GEO-IP и API-погоды от Яндекса:

<?php 
//Определение  города
	function getGeo($ip){
		if(!filter_var($ip, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4)))
		return FALSE;
		$get = file_get_contents("http://ipgeobase.ru:7020/geo?ip={$ip}");
		$xml = simplexml_load_string($get);
		$city = isset($xml->ip->city) ? strtolower($xml->ip->city) : '';
		return $city;
}

class weather{

private		$cache_dir; 
public		$city_id;
private		$noon; //Время дня. По-умолчанию 4 - основная часть дня 11:00-20:00
private		$night; //Время ночи. По-умолчанию 5 

	//Инициализируем класс 
	public function __construct(){
	
	$this->cache_dir=$_SERVER['DOCUMENT_ROOT'].'/habr/cache/weather/';
	$this->noon=4;
	$this->night=5;
	
	if(isset($_SESSION['weather_city'])){$cityname=$_SESSION['wether_city'];} //Берем название города из сессии
	else{$cityname=getGeo($_SERVER['REMOTE_ADDR']); }// Получаем название города по автоопределению
	
	$cities=json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/habr/weather/YandexCities.txt'));
		
		if(isset($cities->$cityname)){
			$this->city_id=$cities->$cityname;
		} else {
			$this->city_id=$cities->{'Махачкала'};
		}
	}
	
	
	
	
		//Возвращает плюс, минус или ноль в зависимости от температуры
	public function checkZeroMark($temperature){
		if($temperature>0){
			return '+'.$temperature;
		} elseif ($temperature<0){
			return '-'.$temperature;
		}
	return $temperature;
	}
	
	
	//Получаем погоду для определенного города
	public function getCityWeather(){
		$_LANG['MONTHS']	=	array(
					'Jan'=>'январь', 'Feb'=>'февраль', 'Mar'=>'март',
					'Apr'=>'апрель', 'May'=>'май','Jun'=>'июнь',
					'Jul'=>'июль','Aug'=>'август', 'Sep'=>'сентябрь',
					'Oct'=>'октябрь','Nov'=>'ноябрь','Dec'=>'декабрь');
					
$_LANG['WEEKDAYS']	=	array(
					'Sunday'=>'воскресенье', 'Monday'=>'понедельник', 
					'Tuesday'=>'вторник', 'Wednesday'=>'среда',
					'Thursday'=>'четверг', 'Friday'=>'пятница',
					'Saturday'=>'суббота');
		
		
		$city_cache=$this->{cache_dir}.$this->{city_id};
		//Если время последнего изменения кэш файла меньше шести минут, возвращаем данные из кэша
		if(file_exists($city_cache) && filemtime($city_cache)>time()-360){
			$jsoned_weather=json_decode(file_get_contents($city_cache),TRUE);
			
		} else { //Если кэш отсутствует, получаем данные с яндекса
				$weather=simplexml_load_file('http://export.yandex.ru/weather-ng/forecasts/'.$this->city_id.'.xml');
			
				if($weather!=null){
				
						//Погода на семь дней
						for($i=1; $i<=7; $i++)
						{
							if($weather->day[$i]!=null){
								$days['sevendays'][]=array(
								'weekday' => strtr(date('l', strtotime($weather->day[$i]->attributes()->date)), $_LANG['WEEKDAYS']),
								'data'=>strtr(date("j M",strtotime($weather->day[$i]->attributes()->date)), $_LANG['MONTHS']),
								'temp_day' => $this->checkZeroMark($weather->day[$i]->day_part[$this->noon]->temperature),
								'temp_night' => $this->checkZeroMark($weather->day[$i]->day_part[$this->night]->temperature),
								'weather_type' => $weather->day[$i]->day_part[$this->noon]->weather_type,
								'wind_speed' => $weather->day[$i]->day_part[$this->noon]->wind_speed, 
								'humidity' => $weather->day[$i]->day_part[$this->noon]->humidity, 
								'pressure' => $weather->day[$i]->day_part[$this->noon]->pressure, 
								'image' => $weather->day[$i]->day_part[$this->noon]->{'image-v3'}
								);
							}
						}
					
					//Погода на сегодня
					$days['today']=array(
					'weekday' => strtr(date('l'), $_LANG['WEEKDAYS']),
					'data'=>strtr(date('j M Y, G:i'), $_LANG['MONTHS']),
					'temperature' => $this->checkZeroMark($weather->fact->temperature),
					'weather_type' => $weather->fact->weather_type,
					'wind_speed' => $weather->fact->wind_speed, 
					'humidity' => $weather->fact->humidity, 
					'pressure' => $weather->fact->pressure, 
					'water_temp' => $this->checkZeroMark($weather->fact->water_temperature), 
					'sunrise' => $weather->day->sunrise, 
					'sunset' => $weather->day->sunset, 
					'image' => $weather->fact->{'image-v3'},
					'city'=>$weather->attributes()->city,
					'country' => $weather->attributes()->country
					);
								
					file_put_contents($city_cache, json_encode($days));
					$jsoned_weather=json_decode(file_get_contents($city_cache), TRUE);
				} else{
						return null;
				}
		}
		return $jsoned_weather;
		
	}
	
	
	
	

	
	
	
}


$weather=new weather;
$jsoned_weather=$weather->getCityWeather();
$today=$jsoned_weather['today'];
$sevendays=$jsoned_weather['sevendays'];
?>




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<title>Погода от Яндекса</title>
</head>
<body>

<style>
#weather{
margin-top:-10px;
background: url('/habr/weather/sun.jpg') no-repeat;
background-size:cover;
padding:10px;
min-height:300px;
width:790px;
}

#weather table{
width:790px;
background-color:RGBa(0,0,0,0.4);
color:white;

}

#weather td{
vertical-align:middle;
}
</style>
<div id="weather">
<table cellpadding="0" cellspacing="0" border="0">
 <tbody>
	<tr>
		<td style="padding:10px 13px 0;">
			<span style="font-size:24px;"><?php echo $today['city']['0'].', '.$today['country']['0'];?></span>
		</td>
	</tr>
	<tr>
		<td style="padding:0 13px;">
			сегодня <?php echo $today['weekday'].', '.$today['data'];?>
		</td>
	<tr >
		<td>
			<img style="margin-left:20px; width:70px; height:70px;"  src="/habr/weather/img/<?php echo $today['image']['0'];?>.png" 
			title="<?php echo $today['weather_type']['0']; ?>">
			<span style="font-size:100px; font-family:Arial;"><?php echo $today['temperature'];?>°</span>
		</td>
		<td style="height:70px; width:190px;">
			<?php echo $today['weather_type']['0'];?><br/>
			<?php if($today['water_temp']!=null){
				echo 'температура воды '.$today['water_temp'].'&deg';
			}
			?>
		</td>
		<td style="padding-left:5px;">
		<?php
		echo '	Атм. давление '.$today['pressure']['0'].' мм. рт.ст.<br/>
			Влажность '.$today['humidity']['0'].'% <br/>
			Скорость ветра '.$today['wind_speed']['0'].' м/с <br/>
			Рассвет '.$today['sunrise']['0'].' / Закат '.$today['sunset']['0'];
		?>
		</td>
	</tr>
 </tbody>
</table>
<br/>
<table cellpadding="0" cellspacing="0" border="0">
 <tbody style="text-align:center;">
 	<tr>
 <?php 
 if($sevendays!=false){
	foreach($sevendays as $day){
		?>
		<td style="width:100px; vertical-align:top; text-align:left; padding:2px 5px;">
				<a title="<?php echo $day['weekday'].'">'.$day['data'];?></a><br/>
			<div style="width:50px; height:50px; border:none; background:url('/habr/weather/img/<?php echo $day['image']['0'];?>.png') no-repeat;background-size:cover;"></div>
			<?php
			echo '<a title="Днем">'.$day['temp_day'].'°</a> <a title="Ночью">'.$day['temp_night'].'°</a><br/>
			'.$day['weather_type']['0'].'<br/>
			'.$day['pressure']['0'].' мм<br/>
			'.$day['humidity']['0'].' %<br/>
			'.$day['wind_speed']['0'].' м/с
		</td>';
	}
}
?>
	</tr>
 </tbody>
</table>
</div>

</body>
</html>

найдено в обсуждениях тут