SHOW:
|
|
- or go back to the newest paste.
1 | <?php | |
2 | //Определение города | |
3 | function getGeo($ip){ | |
4 | if(!filter_var($ip, FILTER_VALIDATE_IP, array('flags' => FILTER_FLAG_IPV4))) | |
5 | return FALSE; | |
6 | $get = file_get_contents("http://ipgeobase.ru:7020/geo?ip={$ip}"); | |
7 | $xml = simplexml_load_string($get); | |
8 | $city = isset($xml->ip->city) ? strtolower($xml->ip->city) : ''; | |
9 | return $city; | |
10 | } | |
11 | ||
12 | class weather{ | |
13 | ||
14 | private $cache_dir; | |
15 | public $city_id; | |
16 | private $noon; //Время дня. По-умолчанию 4 - основная часть дня 11:00-20:00 | |
17 | private $night; //Время ночи. По-умолчанию 5 | |
18 | ||
19 | //Инициализируем класс | |
20 | public function __construct(){ | |
21 | ||
22 | $this->cache_dir=$_SERVER['DOCUMENT_ROOT'].'/habr/cache/weather/'; | |
23 | $this->noon=4; | |
24 | $this->night=5; | |
25 | ||
26 | if(isset($_SESSION['weather_city'])){$cityname=$_SESSION['wether_city'];} //Берем название города из сессии | |
27 | else{$cityname=getGeo($_SERVER['REMOTE_ADDR']); }// Получаем название города по автоопределению | |
28 | ||
29 | $cities=json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'].'/habr/weather/YandexCities.txt')); | |
30 | ||
31 | if(isset($cities->$cityname)){ | |
32 | $this->city_id=$cities->$cityname; | |
33 | } else { | |
34 | $this->city_id=$cities->{'Махачкала'}; | |
35 | } | |
36 | } | |
37 | ||
38 | ||
39 | ||
40 | ||
41 | //Возвращает плюс, минус или ноль в зависимости от температуры | |
42 | public function checkZeroMark($temperature){ | |
43 | if($temperature>0){ | |
44 | return '+'.$temperature; | |
45 | } elseif ($temperature<0){ | |
46 | return '-'.$temperature; | |
47 | } | |
48 | return $temperature; | |
49 | } | |
50 | ||
51 | ||
52 | //Получаем погоду для определенного города | |
53 | public function getCityWeather(){ | |
54 | $_LANG['MONTHS'] = array( | |
55 | 'Jan'=>'январь', 'Feb'=>'февраль', 'Mar'=>'март', | |
56 | 'Apr'=>'апрель', 'May'=>'май','Jun'=>'июнь', | |
57 | 'Jul'=>'июль','Aug'=>'август', 'Sep'=>'сентябрь', | |
58 | 'Oct'=>'октябрь','Nov'=>'ноябрь','Dec'=>'декабрь'); | |
59 | ||
60 | $_LANG['WEEKDAYS'] = array( | |
61 | 'Sunday'=>'воскресенье', 'Monday'=>'понедельник', | |
62 | 'Tuesday'=>'вторник', 'Wednesday'=>'среда', | |
63 | 'Thursday'=>'четверг', 'Friday'=>'пятница', | |
64 | 'Saturday'=>'суббота'); | |
65 | ||
66 | ||
67 | $city_cache=$this->{cache_dir}.$this->{city_id}; | |
68 | //Если время последнего изменения кэш файла меньше шести минут, возвращаем данные из кэша | |
69 | if(file_exists($city_cache) && filemtime($city_cache)>time()-360){ | |
70 | $jsoned_weather=json_decode(file_get_contents($city_cache),TRUE); | |
71 | ||
72 | } else { //Если кэш отсутствует, получаем данные с яндекса | |
73 | $weather=simplexml_load_file('http://export.yandex.ru/weather-ng/forecasts/'.$this->city_id.'.xml'); | |
74 | ||
75 | if($weather!=null){ | |
76 | ||
77 | //Погода на семь дней | |
78 | for($i=1; $i<=7; $i++) | |
79 | { | |
80 | if($weather->day[$i]!=null){ | |
81 | $days['sevendays'][]=array( | |
82 | 'weekday' => strtr(date('l', strtotime($weather->day[$i]->attributes()->date)), $_LANG['WEEKDAYS']), | |
83 | 'data'=>strtr(date("j M",strtotime($weather->day[$i]->attributes()->date)), $_LANG['MONTHS']), | |
84 | 'temp_day' => $this->checkZeroMark($weather->day[$i]->day_part[$this->noon]->temperature), | |
85 | 'temp_night' => $this->checkZeroMark($weather->day[$i]->day_part[$this->night]->temperature), | |
86 | 'weather_type' => $weather->day[$i]->day_part[$this->noon]->weather_type, | |
87 | 'wind_speed' => $weather->day[$i]->day_part[$this->noon]->wind_speed, | |
88 | 'humidity' => $weather->day[$i]->day_part[$this->noon]->humidity, | |
89 | 'pressure' => $weather->day[$i]->day_part[$this->noon]->pressure, | |
90 | 'image' => $weather->day[$i]->day_part[$this->noon]->{'image-v3'} | |
91 | ); | |
92 | } | |
93 | } | |
94 | ||
95 | //Погода на сегодня | |
96 | $days['today']=array( | |
97 | 'weekday' => strtr(date('l'), $_LANG['WEEKDAYS']), | |
98 | 'data'=>strtr(date('j M Y, G:i'), $_LANG['MONTHS']), | |
99 | 'temperature' => $this->checkZeroMark($weather->fact->temperature), | |
100 | 'weather_type' => $weather->fact->weather_type, | |
101 | 'wind_speed' => $weather->fact->wind_speed, | |
102 | 'humidity' => $weather->fact->humidity, | |
103 | 'pressure' => $weather->fact->pressure, | |
104 | 'water_temp' => $this->checkZeroMark($weather->fact->water_temperature), | |
105 | 'sunrise' => $weather->day->sunrise, | |
106 | 'sunset' => $weather->day->sunset, | |
107 | 'image' => $weather->fact->{'image-v3'}, | |
108 | 'city'=>$weather->attributes()->city, | |
109 | 'country' => $weather->attributes()->country | |
110 | ); | |
111 | ||
112 | file_put_contents($city_cache, json_encode($days)); | |
113 | $jsoned_weather=json_decode(file_get_contents($city_cache), TRUE); | |
114 | } else{ | |
115 | return null; | |
116 | } | |
117 | } | |
118 | return $jsoned_weather; | |
119 | ||
120 | } | |
121 | ||
122 | ||
123 | ||
124 | ||
125 | ||
126 | ||
127 | ||
128 | ||
129 | } | |
130 | ||
131 | ||
132 | $weather=new weather; | |
133 | $jsoned_weather=$weather->getCityWeather(); | |
134 | $today=$jsoned_weather['today']; | |
135 | $sevendays=$jsoned_weather['sevendays']; | |
136 | ?> | |
137 | ||
138 | ||
139 | ||
140 | ||
141 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > | |
142 | <head> | |
143 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > | |
144 | <title>Погода от Яндекса</title> | |
145 | </head> | |
146 | <body> | |
147 | ||
148 | <style> | |
149 | #weather{ | |
150 | margin-top:-10px; | |
151 | background: url('/habr/weather/sun.jpg') no-repeat; | |
152 | background-size:cover; | |
153 | padding:10px; | |
154 | min-height:300px; | |
155 | width:790px; | |
156 | } | |
157 | ||
158 | #weather table{ | |
159 | width:790px; | |
160 | background-color:RGBa(0,0,0,0.4); | |
161 | color:white; | |
162 | ||
163 | } | |
164 | ||
165 | #weather td{ | |
166 | vertical-align:middle; | |
167 | } | |
168 | </style> | |
169 | <div id="weather"> | |
170 | <table cellpadding="0" cellspacing="0" border="0"> | |
171 | <tbody> | |
172 | <tr> | |
173 | <td style="padding:10px 13px 0;"> | |
174 | <span style="font-size:24px;"><?php echo $today['city']['0'].', '.$today['country']['0'];?></span> | |
175 | </td> | |
176 | </tr> | |
177 | <tr> | |
178 | <td style="padding:0 13px;"> | |
179 | сегодня <?php echo $today['weekday'].', '.$today['data'];?> | |
180 | </td> | |
181 | <tr > | |
182 | <td> | |
183 | <img style="margin-left:20px; width:70px; height:70px;" src="/habr/weather/img/<?php echo $today['image']['0'];?>.png" | |
184 | title="<?php echo $today['weather_type']['0']; ?>"> | |
185 | <span style="font-size:100px; font-family:Arial;"><?php echo $today['temperature'];?>°</span> | |
186 | </td> | |
187 | <td style="height:70px; width:190px;"> | |
188 | <?php echo $today['weather_type']['0'];?><br/> | |
189 | - | <?php if($today['water_temp!=null']){ |
189 | + | <?php if($today['water_temp']!=null){ |
190 | echo 'температура воды '.$today['water_temp'].'°'; | |
191 | } | |
192 | ?> | |
193 | </td> | |
194 | <td style="padding-left:5px;"> | |
195 | <?php | |
196 | echo ' Атм. давление '.$today['pressure']['0'].' мм. рт.ст.<br/> | |
197 | Влажность '.$today['humidity']['0'].'% <br/> | |
198 | Скорость ветра '.$today['wind_speed']['0'].' м/с <br/> | |
199 | Рассвет '.$today['sunrise']['0'].' / Закат '.$today['sunset']['0']; | |
200 | ?> | |
201 | </td> | |
202 | </tr> | |
203 | </tbody> | |
204 | </table> | |
205 | <br/> | |
206 | <table cellpadding="0" cellspacing="0" border="0"> | |
207 | <tbody style="text-align:center;"> | |
208 | <tr> | |
209 | <?php | |
210 | if($sevendays!=false){ | |
211 | foreach($sevendays as $day){ | |
212 | ?> | |
213 | <td style="width:100px; vertical-align:top; text-align:left; padding:2px 5px;"> | |
214 | <a title="<?php echo $day['weekday'].'">'.$day['data'];?></a><br/> | |
215 | <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> | |
216 | <?php | |
217 | echo '<a title="Днем">'.$day['temp_day'].'°</a> <a title="Ночью">'.$day['temp_night'].'°</a><br/> | |
218 | '.$day['weather_type']['0'].'<br/> | |
219 | '.$day['pressure']['0'].' мм<br/> | |
220 | '.$day['humidity']['0'].' %<br/> | |
221 | '.$day['wind_speed']['0'].' м/с | |
222 | </td>'; | |
223 | } | |
224 | } | |
225 | ?> | |
226 | </tr> | |
227 | </tbody> | |
228 | </table> | |
229 | </div> | |
230 | ||
231 | </body> | |
232 | </html> |