Среда, 03 февраля 2016 15:19

Extended weather informer. Weather Underground

Оцените материал
(2 голосов)

Так уж получилось, что немало в этом блоге скриптов, вполне способных послужить иллюстрацией различных способов геолокации в вебе...

Геолокация. Погода по ip

...рассмотрим и сегодня очередную несложную процедуру создания погодного информера, умеющего сходу определить месторасположение посетителя сайта и предложить актуальную для его геолокации погоду. Иными словами - погоду по ip.

 

Attention, information is outdated. End of Service for the Weather Underground API: your subscriptions, and therefore access, will continue to work through 12/31/2018.

 

Да, подобное у нас уже бывало: на страницах этого сайта детально описан механизм умного погодного информера, работающего в связке с отличным погодным сервисом WorldWeatherOnline (Manchester,UK)... ну, что же. Сегодня мы попробуем решить аналогичную задачу, но уже в контексте американского погодного web-портала - Weather Underground.

 

Разработка сайтов

 

Сразу оговорюсь: получать координаты посетителя мы по-прежнему будем посредством REST API SypexGeo. Хотя можно было бы воспользоваться autoip.json того же Wunderground: да, есть у них за океаном такая интересная фича. Но здесь существует и небольшая сложность, а именно: вот этот запрос к API:

 

<?
$json = file_get_contents('http://api.wunderground.com/api/vash_api_key/geolookup/q/autoip.json');

 

в ответ вернет ip (и еще много иной информации, помимо этого) вашего web-сервера, а не ip-адрес посетителя сайта. Правда, корсы американцы отдают вполне корректные:

 

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:*

 

, стало быть, можно было бы и на js свободно их использовать (желающие узнать чуть поподробнее про cross-origin и джаваскрипты имеют возможность воспоследовать по приведенной ссылке (чудесная статья, поверьте! сам написал). Но в этом случае навряд ли имеет смысл передавать php на сервер полученные на клиентском хосте данные, рационально здесь же их на месте и обработать... а это уже тема отдельной статьи. Одним словом, сегодня у нас в программе сугубо php. 

 

Возможно, вы захотите сравнить точность прогноза погоды двух различных погодных сервисов - WorldWeatherOnline и Weather Underground ? Было бы очень интересно выслушать ваше мнение: здесь, в комментах, или на форуме.

 

Итак, геолокация у нас с вами реализована запросом к REST API SypexGeo; практически все то же самое, что уже описано в статье Погода по ip и REST API Sypex Geo. В ходе одного-единственного api request получаем, как видите, conditions (текущее состояние погоды), satellite (гифку с визуальным и инфракрасным спутниковым изображением - опционально, конечно), webcams (статическое изображение, полученное с одной из вебкамер вашего населенного пункта) и forecast - прогноз погоды на несколько дней вперед. Либо иные фичи, в том числе и поддержка русского языка, см. документацию и полученный JSON, все не перечислить... кстати, вот он, этот самый forecast, в начале статьи, а остальное вы можете увидеть в левом сайдбаре страницы (картинки, как вы понимаете, сильно уменьшены), все это один и тот же, по сути, скрипт. Стало быть, определяем географические координаты посетителя сайта через REST API Sypex Geo и далее по полученным широте и долготе (они у нас в $loc_string) запрашиваем у API Wunderground информацию в формате JSON:

 

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$url = 'http://api.sypexgeo.net/xml/'. $ip .'';
$xml = simplexml_load_string(file_get_contents($url));
$loc_array = array($xml->ip->city->lat,$xml->ip->city->lon);
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$json = file_get_contents('http://api.wunderground.com/api/vash_api_key/conditions/satellite/webcams/forecast/q/' . $loc_string . '.json');
$obj = json_decode($json, true);

 


К слову: не забудьте, что на бесплатном тарифе Wunderground меркантильные американцы готовы предоставить вам не более 10 запросов в минуту и не более 500 запросов в сутки (The plan you are registered for is Stratus - Developer, granting you 500 calls per day with 10 calls per minute limit). Но, вполне возможно, для вашего блога этого достаточно? - я не думаю, что вы поставили себе целью отбивать на прогнозах погоды хлеб у Яндекса и Google, и еще у многих и многих игроков этого зеленого нефутбольного поля. SypexGeo REST API вам дарит 10000 запросов в месяц (идентификация по IP), а после бесплатной же регистрации на сайте выдается уникальный ключ для учета запросов, также на счет добавляются бонусные запросы (30000 в месяц)... в принципе, на первое время вам должно хватить... "а потом начнутся пожертвования и денег некуда будет девать" - фраза из любимой с детства книжки. Ок, это была небольшая литературная интермедия и кофе-брейк, а теперь с новыми силами двигаемся дальше.

Разбираем полученный JSON, это способно быть примерно так:

 

<div><?=('Humidity ' . $obj['current_observation']['relative_humidity']);?></div>
<div><?=('Pressure ' . $obj['current_observation']['pressure_mb'] . 'mb');?></div>
<div><?=('Visibility ' . $obj['current_observation']['visibility_km'] . 'km');?></div>

 

Ну и так далее, etc. Полностью код приведен на форуме, откуда его без особых проблем можно скопипастить (не забудьте только про собственные keys_api); но, возможно, вы захотите самостоятельно конфигурировать свой погодный информер? - возможности API Wunderground значительно превышают показанное в поспешно набросанном концепте этой странички..

Forecast (прогноз погоды) реализуем посредством простенького цикла:

 

<?
$html .= "</h2><table cellpadding=10 cellspacing=5><tr>";
foreach ($obj['forecast']['simpleforecast']['forecastday'] as $arr) {
$html .= "<td align='center'>" . $arr['date']['weekday'] . "<br />";
$html .= "<img src='http://icons-pe.wxug.com/i/c/k/" . $arr['icon'] . ".gif' border=0 /><br />";
$html .= "<font color='red'>" . $arr['high']['celsius'] . '&deg;C' . " </font>";
$html .= "<font color='blue'>" . $arr['low']['celsius'] . '&deg;C' . "</font>";
$html .= "</td>";
}
$html .= "</tr></table>";
echo $html;

 

, вывод изображения случайной вебкамеры - таким образом:

 

<?
$webcam_key = array_rand(array_keys($obj['webcams']), true);
?>
<div><?='<img width="200" src="' . $obj['webcams'][$webcam_key]['CURRENTIMAGEURL'] . '"/>';?></div>

 

Хм, вот и вся премудрость... несложно, правда? - да, чуть не забыл на прощанье рассказать, для Питера я насчитал в полученном от API Wunderground JSON около сорока вебкамер... в ходе кодинга, таким образом, удалось документально  подтвердить, что американцы круглосуточно мониторят город трех революций буквально насквозь! Ну вы можете себе такое представить, а. Вполне в духе времени призадуматься над этим многозначительным фактом, согласитесь... как сказал бы уже упоминавшийся литературный герой, "и куда только смотрит Лига Наций".  :)

Всем до скорого!

Последнее изменениеЧетверг, 07 марта 2019 11:51

Оставить комментарий

Добавьте ваш комментарий

Temperature, °C5.7
Wind speed 22.3
Cloudcover 35.4
Description weatherPartially cloudy
Solar power (W/m2)232.8
Indicates the total energy from the sun (MJ/m2)20.1
Moon phase0.31
Level (0 - 10) of UV exposure7
Probability (%) of adverse weather conditions10
Dew point temperature (°C)-6.5
What a temperature feels like (°C)2.6
Types of precipitation