...рассмотрим и сегодня очередную несложную процедуру создания погодного информера, умеющего сходу определить месторасположение посетителя сайта и предложить актуальную для его геолокации погоду. Иными словами - погоду по 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.
Итак, геолокация у нас с вами реализована запросом к 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'] . '°C' . " </font>";
$html .= "<font color='blue'>" . $arr['low']['celsius'] . '°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 около сорока вебкамер... в ходе кодинга, таким образом, удалось документально подтвердить, что американцы круглосуточно мониторят город трех революций буквально насквозь! Ну вы можете себе такое представить, а. Вполне в духе времени призадуматься над этим многозначительным фактом, согласитесь... как сказал бы уже упоминавшийся литературный герой, "и куда только смотрит Лига Наций". :)
Всем до скорого!