Вот такой скрипт информера погоды работающего на основе 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'].'°'; } ?> </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>
найдено в обсуждениях тут