Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Погода по ip. Умный информер

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

Умный погодный информер от Masterpro.ws

Разработок такого рода немало; но явному большинству из них свойственен довольно существенный, на мой взгляд, недостаток... увы, начинающему блоггеру-сайтовладельцу, не искушенному в премудростях пыха, практически нереально разобраться в хитросплетениях порой действительно монстрообразного кода. Предложенное на этой страничке решение, хотелось бы надеяться, очень несложно; использован Free API сервиса worldweatheronline.com и база данных Sypex Geo, c которой мы с вами уже не раз экспериментировали в этом блоге.

 

В силу ряда причин, демка информера вынесена на отдельный сервер, здесь вы видите лишь iframe. "Отдельный сервер" - это сервер Timeweb, который время от времени (чтобы не сказать перманентно) выпадает в осадок... что поделаешь, Таймвеб он и есть Таймвеб. Справедливости ради надо признать, что сервер этот бесплатен; но увы, не раз имел случай убедиться, что и за деньги Timeweb работает немногим лучше. Если вместо информера вы видите "502 Bad Gateway" - подождите секунд 30, обычно этого хватает, и перезагрузите страничку. Все заработает. В любом случае, код и комментарии всегда доступны здесь, в этом блоге, расположенном на сервере Hostgator, в Хьюстоне. А информер... что же, пусть его работа служит, помимо прочего, еще и некоторой иллюстрацией работы Timeweb-a... которая, на мой взгляд, день ото дня все хуже и хуже.

 

Идем на worldweatheronline.com , регистрируемся, создаем application и получаем api_key; это единственное, что нам там понадобится. Premium aссount совершенно необязателен; разве что вам очень уж захочется... правда, разработчики прекрасного погодного сервиса worldweatheronline.com настойчиво просят вас разместить на страничке вашего блога эту ссылку; а почему бы и нет?

Powered by World Weather Online

Итак, начинаем. Я попробую прокомментировать отдельные участки кода; при желании - эти объяснения легко можно пропустить и попросту скопировать окончательный вариант, опубликованный в конце статьи. Файл index.php находится в одной директории с SxGeoSity.dat и SxGeo.php; точь в точь как в нашем предыдущем примере с Google Map... рассмотрим сейчас содержимое этого файла.

 

Рекламная пауза. Зарелизился jWeather by ip - нативный модуль Joomla 3. Джумлаводы теперь имеют счастливую возможность, не возясь со скриптами (и зачем они нужны в Joomla, скрипты?! вот ведь еще напасть какая) и даже не читая дальше - легко и просто установить умный погодный информер посредством менеджера расширений. Ну, словом, все привычно и комфортно - качаем и тестируем.

 

Для начала подключаем SypexGeo, именно эта база данных (которую вовсе нелишне время от времени обновлять) поможет нам найти соответствие между ip-адресом посетителя и его местоположением. Правда, отталкиваться мы будем не от названия города, а от географических координат, что позволит нам значительно упростить задачу... собственно, именно потому мы с вами и используем погодный сервис World Weather Online , позволяющий получить погоду по широте и долготе местности.

Впрочем, что нам мешает вывести и название города? - дополнительно, так сказать? - ничто не мешает. Итак:

 

<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
echo "{$city['city']}<br/>";

 

Уже должно вчерне работать; уже мы с вами получаем, благодаря последней строчке кода, и открыв в браузере index.php - название города. Но для нас важно сейчас иное.

 

$loc_array = array($city['lat'],$city['lon']);
$api_key="vash_api_key";
$num_of_days=1;
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);

 

Этот участок кода представляет из себя немного модифицированный (не забудьте, кстати, о вставке вашего api_key) код, предлагаемый нам разработчиками worldweatheronline.com, вы можете увидеть его аналог в документации сервиса. В самом начале, как видите, мы просто подставляем в скрипт два элемента массива - lat и lon, т.е. широту и долготу - для дальнейшей обработки. Мы могли бы, в принципе, воспользоваться функцией extract, импортировав элементы массива в текущую таблицу символов, тогда бы это выглядело следующим образом:

 

extract($city);
$loc_array = array($lat,$lon);

 

Впрочем, мы этого делать не будем. Все уже почти готово (правда ведь, все очень быстро и совсем несложно?), нам осталось только вывести в наш HTML собственно погоду. Это можно сделать, скажем, пробежав по массиву посредством foreach:

 

$ss = array();
foreach ($xml[0] as $name => $val) {
foreach ($val as $name1 => $val1)
{
$ss[$name1] = $val1;
}
}
echo $ss["date"];
echo "<br>";
echo "Координаты {$ss["query"]}";
echo "<br>";
echo "Температура {$ss["temp_C"]} С";
echo "<br>";

 

Возможно ли, при желании, обойтись без foreach ? - да, почему бы и нет. Предположим, как-то так:

 

echo ($xml->weather->date);
echo ($xml->weather->tempMinF);
echo ($xml->weather->windspeedKmph);

 

Кстати, мы без проблем сумеем вывести и картинку, иллюстрирующую состояние погоды. Можно совсем по-простому:

 

$a = $ss["weatherIconUrl"]; 
$b = "<img src='$a'>";
echo $b;

 

или же чуть более изящно:

 

echo '<img src="' . $xml->weather->weatherIconUrl . '"/>';

 

Возможно, следует обратить внимание на эту ремарку:

If you tried to load an XML file with this, but the CDATA parts were not loaded for some reason, is because you should do it this way: $xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA); This converts CDATA to String in the returning object.

 

и данную строчку:

 

$xml = simplexml_load_string($xml_response);

 

изменить следующим образом:

 

$xml = simplexml_load_string($xml_response, 'SimpleXMLElement', LIBXML_NOCDATA);

 

По желанию. Варианты разработки всегда возможны и приветствуются. Вы можете взглянуть на уже отформатированный xml, для чего оптимально подключить, скажем, фреймворк HuPHP. Получится гораздо удобнее - вся структура как на ладони. Если необходимо обратиться к элементам массива, расположенным ниже основных значений (current_condition) - получить, скажем, прогноз на ближайшие дни, тогда (for example):

 

<div><?='Осадки '. ($xml->weather[4]->hourly[5]->precipMM). ' мм';?></div>

 

Итак, к чему мы пришли... демку вы видите на этой страничке, в левой ее части, а финальная версия кода всегда доступна на форуме (стили уж сами добавьте по вкусу). Enjoy! В случае обнаружения критичных проблем в работе информера - просьба отписаться... хотя, думаю, есть смысл продолжить эту тему уже в контексте иных БД, не только Sypex Geo. Впрочем, посмотрим. Заходите иногда на огонек этого блога.

 

Примечание. В актуальной версии Sypex Geo необходимо внести некоторые изменения в приведенный код. Последнюю ревизию данной разработки вы всегда можете получить на форуме, welcome по ссылке.

 

Продолжение темы

 

3 комментарии

  • Aleksej

    написал Aleksej

    Воскресенье, 06 сентября 2015 10:30

    pro777, так, да не совсем так. Прочтите внимательно эти фразы из TOS worldweatheronline, я цитирую без купюр. Кроме того - что мешает вам купить Premium аккаунт? - если вашему web-ресурсу требуется большее количество запросов. нежели этой страничке?

    Premium API - pricing starts from 500 request/day.

    Weather API request limit.
    We request our free weather API users to not exceed 250 requests per day. We are flexible on our request limit, so if at any point you feel you are going to exceed 250 requests per day then please do let us know.

  • pro777

    написал pro777

    Суббота, 05 сентября 2015 19:09

    worldweatheronline.com является платным сервисом. Бесплатно возможно использовать только 250 запросов в день. Из-за чего их сервис на бесплатной основе использовать нереально.

  • Алескандр

    написал Алескандр

    Четверг, 23 апреля 2015 09:23

    Спасибо

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

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

Погода в вашем городе

2017-12-14
Координаты Lat 47.61 and Lon -122.33
Seattle
US

У вас сегодня:
Температура 3 °C
Мин. температура сегодня 3 °C
Макс. температура сегодня 6 °C
Скорость ветра 0 км/час
Направление ветра N
Пасмурно 50 %
Давление 1028 mb
Влажность 96 %
Осадки 0.0 мм
Видимость на дорогах 16 км
Partly cloudy

Восход солнца 07:50 AM
Закат солнца 04:17 PM
Восход луны 04:05 AM
Закат луны 02:42 PM