<?php
/*
=====================================================
Блок погоды с сайта http://gismeteo.ru для CMS Danneo 053
=====================================================
При использовании ссылка на сайт http://artdiz.com Обязательна!
=====================================================
http://artdiz.com/
=====================================================
Файл: b-weather.php
-----------------------------------------------------
Назначение: Weather парсер погоды
=====================================================
*/
if(!defined("DNREAD")) exit();
global $db,$basepref,$api;
$bt = '';
$w = new Weather;
$w->ConnectCache('34122_1.xml'); //Собираем информацию и КЕШруем её, ID города можно узнать по адрему http://informer.gismeteo.ru/xml.html?index=27612%CC%EE%F1%EA%E2%E0&&lang=ru
$bt.='<b style=\"font-size:14px;color: #b30935;\">' .$w->city. '</b>';
$bt.= $w->weather;
/* Раскоментируйте если нужен еще один населенный пункт Учитывайте нагрузку на сервер
$bt.='<br/><br/>';
$w->ConnectCache('33837_1.xml'); //Чтобы установить время в течение которого скрипт будет обновляться и КЕШировать данные, можно изменив $w->ConnectCache('26063_1.xml'); на $w->ConnectCache('26063_1.xml','3600'); в таком случаи скрипт будет обновлять данные ежечасно, по умолчанию она стоит 7200, т.е. данные будут обновляться каждые 2 часа
$bt.='<b style=\"font-size:14px;color: #b30935;\">' .$w->city. '</b>';
$bt.= $w->weather;
*/
/*Если нужно еще добавить город то добовляем этот код, меняем 31960_1.xml на код нужного вам города
$w->Connect('31960_1.xml');
$bt.= $w->city;
$bt.= $w->weather;
*/
/*
$w->Connect('31960_1.xml');
$bt.= $w->city;
$bt.= $w->weather;
$w->Connect('88999_1.xml');
$bt.= $w->city;
$bt.= $w->weather;
*/
class Weather {
var $city;
var $weather;
var $encode = 'windows-1251'; // Кодировка в которой будут выводиться данные
var $patchimg = 'up/weather/';
var $patchcache = 'cache/cache_weather/';
//Подключаемся без использования КЕШа, Этот метод крайне не рекомендую использовать только при постоянных ошибках скрипта
function Connect($url, $encode){
$url = 'http://informer.gismeteo.ru/xml/'.$url;
$content = @file_get_contents($url);
$content = str_replace(array(''.chr(11).'',''.chr(13).'',''.chr(10).'',''.chr(9).'','\n','\r','/',' '),array(''),$content);
$this->city=$this->pCity($content);
$this->weather=$this->Parser($content);
}
//Подключаемся с использованием КЕШа, т.е. данные будут сохраняться в файл.
function ConnectCache($url, $expire =7200){
$mtime = 0;
$file_cacheid = $this->patchcache . md5($url);
if($file_cacheid) $s=true; else $s=false;
if(!file_exists($file_cacheid)) $s=false;
if(!($mtime = @filemtime($file_cacheid))) $s=false;
if(($mtime + $expire) < time()){
@unlink($file_cacheid);
$s=false;
}
else {
$s=true;
}
if ((!$s)) {
if(file_exists($file_cacheid))
@unlink($file_cacheid);
$url = 'http://informer.gismeteo.ru/xml/'.$url;
$content = file_get_contents($url);
$content = str_replace(array(''.chr(11).'',''.chr(13).'',''.chr(10).'',''.chr(9).'','\n','\r','/',' '),array(''),$content);
$this->city=$this->pCity($content);
$this->weather=$this->Parser($content);
if($fp = @fopen($file_cacheid, 'w')) {
fwrite($fp, ''.$this->city.'|'.$this->weather.'|');
fclose($fp);
}
else {
die('Unable to write cache.');
}
} else {
$fp = @fopen($file_cacheid, 'r');
$p = explode('|',fread($fp, filesize($file_cacheid)));
fclose($fp);
if ($this->encode !== 'windows-1251'){
$this->city = iconv ("windows-1251", $this->encode, $p[0]);
$this->weather = iconv ("windows-1251", $this->encode, $p[1]);
}
else{
$this->city = $p[0];
$this->weather = $p[1];
}
}
}
function pCity($content){
$str = "<TOWNindex=\"(.*)\"sname=\"(.*)\"latitude=\"(.*)\"longitude=\"(.*)\">";
if (eregi($str,$content,$out)){
return urldecode($out[2]);
} else return 'Unknow';
}
function Parser($content){
if ($content){
$str='<FORECASTday="([0-9]{1,2})"month="([0-9]{1,2})"year="([0-9]{4})"hour="([0-9]{1,2})"tod="([0-9]{1})"predict="([0-9]{1,4})"weekday="([0-9]{1})"><PHENOMENAcloudiness="([0-3])"precipitation="([0-9]{1,2})"rpower="([0-1])"spower="([0-1])"><PRESSUREmax="([0-9]{1,4})"min="([0-9]{1,4})"><TEMPERATUREmax="([-,0-9]{1,3})"min="([-,0-9]{1,4})"><WINDmin="([0-9]{1,4})"max="([0-9]{1,4})"direction="([0-9]{1})"><RELWETmax="([0-9]{1,4})"min="([0-9]{1,4})"><HEATmin="([-,0-9]{1,4})"max="([-,0-9]{1,4})"><FORECAST>'.
'<FORECASTday="([0-9]{1,2})"month="([0-9]{1,2})"year="([0-9]{4})"hour="([0-9]{1,2})"tod="([0-9]{1})"predict="([0-9]{1,4})"weekday="([0-9]{1})"><PHENOMENAcloudiness="([0-3])"precipitation="([0-9]{1,2})"rpower="([0-1])"spower="([0-1])"><PRESSUREmax="([0-9]{1,4})"min="([0-9]{1,4})"><TEMPERATUREmax="([-,0-9]{1,4})"min="([-,0-9]{1,4})"><WINDmin="([0-9]{1,4})"max="([0-9]{1,4})"direction="([0-9]{1})"><RELWETmax="([0-9]{1,4})"min="([0-9]{1,4})"><HEATmin="([-,0-9]{1,4})"max="([-,0-9]{1,4})"><FORECAST>'.
'<FORECASTday="([0-9]{1,2})"month="([0-9]{1,2})"year="([0-9]{4})"hour="([0-9]{1,2})"tod="([0-9]{1})"predict="([0-9]{1,4})"weekday="([0-9]{1})"><PHENOMENAcloudiness="([0-3])"precipitation="([0-9]{1,2})"rpower="([0-1])"spower="([0-1])"><PRESSUREmax="([0-9]{1,4})"min="([0-9]{1,4})"><TEMPERATUREmax="([-,0-9]{1,4})"min="([-,0-9]{1,4})"><WINDmin="([0-9]{1,4})"max="([0-9]{1,4})"direction="([0-9]{1})"><RELWETmax="([0-9]{1,4})"min="([0-9]{1,4})"><HEATmin="([-,0-9]{1,4})"max="([-,0-9]{1,4})"><FORECAST>'.
'<FORECASTday="([0-9]{1,2})"month="([0-9]{1,2})"year="([0-9]{4})"hour="([0-9]{1,2})"tod="([0-9]{1})"predict="([0-9]{1,4})"weekday="([0-9]{1})"><PHENOMENAcloudiness="([0-3])"precipitation="([0-9]{1,2})"rpower="([0-1])"spower="([0-1])"><PRESSUREmax="([0-9]{1,4})"min="([0-9]{1,4})"><TEMPERATUREmax="([-,0-9]{1,4})"min="([-,0-9]{1,4})"><WINDmin="([0-9]{1,4})"max="([0-9]{1,4})"direction="([0-9]{1})"><RELWETmax="([0-9]{1,4})"min="([0-9]{1,4})"><HEATmin="([-,0-9]{1,4})"max="([-,0-9]{1,4})"><FORECAST>';
if (eregi($str,$content,$out)){
return $this->arr($out);
} else return ' Ошибка в данных сайта gismeteo.ru! ';
} else return 'Ошибка! Соединения с '.$url.'';
}
function imgcloud($n){
$n=ceil($n);
$cloudiness=array(
'0' => "<img src=".$this->patchimg."0".(($n=='0' || $n=='4')?'_night':'').".gif style=\"float:left;margin-top:5px;\" alt=\"Ясно\" title=\"Ясно\">",
'1' => "<img src=".$this->patchimg."1".(($n=='0' || $n=='4')?'_night':'').".gif style=\"float:left;margin-top:5px;\" alt=\"Малооблачно\" title=\"Малооблачно\">",
'2' => "<img src=".$this->patchimg."2".(($n=='0' || $n=='4')?'_night':'').".gif style=\"float:left;margin-top:5px;\" alt=\"Облачно\" title=\"Облачно\">",
'3' => "<img src=".$this->patchimg."3.gif style=\"float:left;margin-top:5px;\" alt=\"Пасмурно\" title=\"Пасмурно\">");
return $cloudiness;
}
function imgprecip($n){
$n=ceil($n);
$precipitation=array(
'4' => "<img src=".$this->patchimg."4.gif style=\"float:left;margin-top:5px;\" alt=\"Дождь\" title=\"Дождь\">" ,
'5' => "<img src=".$this->patchimg."5.gif style=\"float:left;margin-top:5px;\" alt=\"Ливень\" title=\"Ливень\">",
'6' => "<img src=".$this->patchimg."6.gif style=\"float:left;margin-top:5px;\" alt=\"Снег\" title=\"Снег\">",
'7' => "<img src=".$this->patchimg."6.gif style=\"float:left;margin-top:5px;\" alt=\"Снег\" title=\"Снег\">",
'8' => "<img src=".$this->patchimg."8.gif style=\"float:left;margin-top:5px;\" alt=\"Гроза\" title=\"Гроза\">",
'9' => "<img src=".$this->patchimg."9".(($n=='0' || $n=='4')?'_night':'').".gif style=\"float:left;margin-top:5px;\" alt=\"нет данных\" title=\"нет данных\">",
'10' => "<img src=".$this->patchimg."10".(($n=='0' || $n=='4')?'_night':'').".gif style=\"float:left;margin-top:5px;\" alt=\"Ясно\" title=\"Ясно\">");
return $precipitation;
}
function arr($out){
$month_array = array( '1' => 'января' , '2' => 'февраля' , '3' => 'марта' , '4' => 'апреля' , '5' => 'мая' , '6' => 'июня' , '7' => 'июля' ,
'8' => 'августа' , '9' => 'сентября' , '10' => 'октября' , '11' => 'ноября' , '12' => 'декабря' );
$tod = array( '0' => 'Ночью' , '1' => 'Утром' , '2' => 'Днем' , '3' => 'Вечером' , '4' => 'Ночью' );
$rpower = array( '0' =>' возможен дождь/снег' , '1' => ' дождь/снег' );
$spower = array( '0' =>' возможна гроза', '1' => ' гроза' );
$direction = array( '0' => 'северный' , '1' => 'северо-восточный' , '2' => 'восточный' , '3' => 'юго-восточный' , '4' => 'южный' , '5' => 'юго-западный' ,
'6' => 'западный' , '7' => 'северо-западный' );
$direction = array( '0' => 'северный' , '1' => 'северо-восточный' , '2' => 'восточный' , '3' => 'юго-восточный' , '4' => 'южный' , '5' => 'юго-западный' ,
'6' => 'западный' , '7' => 'северо-западный' );
$weekday = array( '1' => 'воскресенье' , '2' => 'понедельник' , '3' => 'вторник' , '4' => 'среду' , '5' => 'четверг' , '6' => 'пятницу' , '7' => 'субботу' );
$day1 = $out[1];
$month1 = $month_array[ceil($out[2])];
$tod1 = $tod[ceil($out[5])];
$weekday1 = $weekday[$out[7]];
$rpower1 = $rpower[$out[10]];
$spower1 = $spower[$out[11]];
if (($out[8] < 4) and ($out[8] >= 0) and ($out[9]=='10')) {
$cloudiness=$this->imgcloud($out[5]);
$cloudiness1 = $cloudiness[$out[8]];
} else {
$precipitation=$this->imgprecip($out[5]);
$precipitation1 = $precipitation[$out[9]];
}
$pressureMAX1 = $out[12];
$pressureMIN1 = $out[13];
$tempMIN1 = $out[15];
$tempMAX1 = $out[14];
$windMIN1 = $out[16];
$windMAX1 = $out[17];
$direction1 = $direction[$out[18]];
$relwenMIN1 = $out[20];
$relwenMAX1 = $out[19];
$heatMIN1 = $out[21];
$heatMAX1 = $out[22];
$day2 = $out[23];
$month2 = $month_array[ceil($out[24])];
$tod2 = $tod[ceil($out[27])];
$weekday2 = $weekday[$out[29]];
$rpower2 = $rpower[$out[32]];
$spower2 = $spower[$out[33]];
if (($out[30] < 4) and ($out[30] >= 0) and ($out[31]=='10')) {
$cloudiness=$this->imgcloud($out[27]);
$cloudiness2 = $cloudiness[$out[30]];
} else {
$precipitation=$this->imgprecip($out[27]);
$precipitation2 = $precipitation[$out[31]];
}
$pressureMIN2 = $out[35];
$pressureMAX2 = $out[34];
$tempMIN2 = $out[37];
$tempMAX2 = $out[36];
$windMIN2 = $out[38];
$windMAX2 = $out[39];
$direction2 = $direction[$out[40]];
$relwenMIN2 = $out[42];
$relwenMAX2 = $out[41];
$heatMIN2 = $out[43];
$heatMAX2 = $out[44];
$day3 = $out[45];
$month3 = $month_array[ceil($out[46])];
$tod3 = $tod[ceil($out[49])];
$weekday3 = $weekday[$out[51]];
$rpower3 = $rpower[$out[54]];
$spower3 = $spower[$out[55]];
if (($out[52] < 4) and ($out[52] >= 0) and ($out[53]=='10')) {
$cloudiness=$this->imgcloud($out[49]);
$cloudiness3 = $cloudiness[$out[52]];
} else {
$precipitation=$this->imgprecip($out[49]);
$precipitation3 = $precipitation[$out[53]];
}
$pressureMIN3 = $out[57];
$pressureMAX3 = $out[56];
$tempMIN3 = $out[59];
$tempMAX3 = $out[58];
$windMIN3 = $out[60];
$windMAX3 = $out[61];
$direction3 = $direction[$out[62]];
$relwenMIN3 = $out[64];
$relwenMAX3 = $out[63];
$heatMIN3 = $out[65];
$heatMAX3 = $out[66];
$day4 = $out[67];
$month4 = $month_array[ceil($out[68])];
$tod4 = $tod[ceil($out[71])];
$weekday4 = $weekday[$out[73]];
$rpower4 = $rpower[$out[76]];
$spower4 = $spower[$out[77]];
if (($out[74] < 4) and ($out[74] >= 0) and ($out[75]=='10')) {
$cloudiness=$this->imgcloud($out[71]);
$cloudiness4 = $cloudiness[$out[74]];
} else {
$precipitation=$this->imgprecip($out[71]);
$precipitation4 = $precipitation[$out[75]];
}
$pressureMAX4 = $out[79];
$pressureMIN4 = $out[78];
$tempMIN4 = $out[81];
$tempMAX4 = $out[80];
$windMIN4 = $out[82];
$windMAX4 = $out[83];
$direction4 = $direction[$out[84]];
$relwenMIN4 = $out[86];
$relwenMAX4 = $out[85];
$heatMIN4 = $out[87];
$heatMAX4 = $out[88];
$content .= "<div style=\"border-top:1px dashed #999999;\"> <b style=\"font-size:12px;color: #8f91a1;\">".$day1." ".$month1." в ".$weekday1."</b><br />".$cloudiness1." ".$precipitation1."<b style=\"font-size:12px; color: #8a102f;\">".$tod1." </b> <br /><b style=\"font-size:12px;\"> <span title=\"комфорт ".$heatMIN1."..".$heatMAX1."°C\">".$tempMIN1."°C...".$tempMAX1."°C</span></b><br /><span style=\"font-size:10px;\">Атм.дав.".$pressureMIN1."-".$pressureMAX1."мм рт.ст.</span><br /><span style=\"font-size:10px;\">Влажность воздуха ".$relwenMIN1."-".$relwenMAX1."%</span><br /> <span style=\"font-size:10px;\">Ветер ".$windMIN1."-".$windMAX1."м/c ".$direction1."</span><br /></div>";
$content .= "<div style=\"border-top:1px dashed #999999;\"><b style=\"font-size:12px;color: #8f91a1;\">".$day2." ".$month2." в ".$weekday2."</b><br />".$cloudiness2." ".$precipitation2." <b style=\"font-size:12px; color: #8a102f;\">".$tod2." </b> <br /><b style=\"font-size:12px;\"> <span title=\"комфорт ".$heatMIN2."..".$heatMAX2."°C\">".$tempMIN2."°C...".$tempMAX2."°C</span></b><br /><span style=\"font-size:10px;\">Атм.дав.".$pressureMIN2."-".$pressureMAX2."мм рт.ст.</span><br /><span style=\"font-size:10px;\">Влажность воздуха ".$relwenMIN2."-".$relwenMAX2."%</span><br /> <span style=\"font-size:10px;\">Ветер ".$windMIN2."-".$windMAX2."м/c ".$direction2."</span><br /></div>";
$content .= "<div style=\"border-top:1px dashed #999999;border-bottom:1px dashed #999999;\"><b style=\"font-size:12px;color: #8f91a1;\">".$day3." ".$month3." в ".$weekday3."</b><br />".$cloudiness3." ".$precipitation3." <b style=\"font-size:12px; color: #8a102f;\">".$tod3."</b><br /><b style=\"font-size:12px;\"> <span title=\"комфорт ".$heatMIN3."..".$heatMAX3."°C\">".$tempMIN3."°C...".$tempMAX3."°C</span></b><br /><span style=\"font-size:10px;\">Атм.дав.".$pressureMIN3."-".$pressureMAX3."мм рт.ст.</span><br /><span style=\"font-size:10px;\">Влажность воздуха ".$relwenMIN3."-".$relwenMAX3."%</span><br /> <span style=\"font-size:10px;\">Ветер ".$windMIN3."-".$windMAX3."м/c ".$direction3."</span><br /></div>";
$content .= "<div style=\"border-bottom:1px dashed #999999;\"><b style=\"font-size:12px;color: #8f91a1;\">".$day4." ".$month4." в ".$weekday4."</b><br />".$cloudiness4." ".$precipitation4."<b style=\"font-size:12px; color: #8a102f;\">".$tod4." </b><br /><b style=\"font-size:12px;\"><span title=\"комфорт ".$heatMIN4."..".$heatMAX4."°C\">".$tempMIN4."°C...".$tempMAX4."°C</span></b><br /><span style=\"font-size:10px;\">Атм.дав.".$pressureMIN4."-".$pressureMAX4."мм рт.ст.</span><br /><span style=\"font-size:10px;\">Влажность воздуха ".$relwenMIN4."-".$relwenMAX4."%</span><br /> <span style=\"font-size:10px;\">Ветер ".$windMIN4."-".$windMAX4."м/c ".$direction4."</span><br /></div>";
return $content;
}
}
return $api->siteuni($bt);
?>