В некоторых случаях нужно получать и выводить прогноз погоды на сайтах. Например, эта функция важна для туристических сайтов, для городских порталов и т.д. В ряде случаев использовать готовые погодные информеры нецелесообразно, лучше разработать свой, получив данные по API.
Используем api.openweathermap.org
Для начала нужно зарегистрироваться, чтобы получить API ключ. Лучше всего регистрировать на email клиента, чтобы у него сразу были все необходимые данные. Нам для работы более чем достаточно бесплатного тарифа.
Здесь нет накопления истории, если нам таковая нужна, то мы можем организовать локальное хранение данных, но чаще всего прогноз нам нужен только для того, чтобы показать его на сайте без всякой истории.
После регистрации мы получим API ключ в виде длинной строки, примерно такой: cd8495****ba92624******b998f1a7. Его и будем использовать в работе.
Описание возможностей API можно найти в документации, она довольно подробная и понятная, но только на английском.
Вот пример реализации для хранения данных в Highload Битрикса (ID=3 в примере ниже), который можно брать за основу. Внутри есть комментарии, которые позволяют понять, за что отвечают переменные. Также внутри есть пороговое значение (14400 секунд = 4 часа) - период обновления данных по API. В рамках этого интервала используется локальное значение погоды.
$weatherHL = "3";
$curClass = getHlClass($weatherHL);
$resultCur = array();
$rsData = $curClass::getList(
array(
"select" => array('*'),
"order" => array('ID' => 'ASC'),
"filter" => array()
)
);
while($arData = $rsData->Fetch()){
$resultCur[$arData["ID"]] = $arData;
}
foreach ($resultCur as $curKey => $curValue) {
if($curValue['UF_WEATHER_CITY']){
$city = $curValue['UF_WEATHER_CITY'];
$country = "BY"; // страна
$mode = "json"; // в каком виде мы получим данные json или xml
$units = "metric"; // Единицы измерения. metric или imperial
$lang = "ru"; // язык
$countDay = 1; // количество дней. Максимум 14 дней
$appID = "cd84955f4bbba9262402110cb998f1a7"; // Ваш APPID
$timestamp = $curValue['UF_DATE'];
$today = time();
if(($today - $timestamp) > '14400'){
// формируем урл для запроса
$url = "http://api.openweathermap.org/data/2.5/forecast?q=$city,$country&cnt=$countDay&lang=$lang&units=$units&appid=$appID";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$weather = curl_exec($curl);
curl_close($curl);
// если получили данные
if($weather){
$dataJson = json_decode($weather);
$arrayDays = $dataJson->list;
foreach($arrayDays as $oneDay){
$weatherTemp =
$arField= array();
$arField['UF_DATE'] = $today;
$weatherIcon = $arField['UF_ICON_URL'] = "http://openweathermap.org/img/wn/".$oneDay->weather[0] -> icon."@2x.png";
$weatherDesc = $arField['UF_DESCRIPTION'] = $oneDay->weather[0] -> description;
$weatherTemp = $arField['UF_TEMP'] = $oneDay->main->temp;
$curClass::update($curKey, $arField);
}
}
} else {
$weatherIcon = $curValue['UF_ICON_URL'];
$weatherDesc = $curValue['UF_DESCRIPTION'];
$weatherTemp = $curValue['UF_TEMP'];
}
}
}
Структура Highload блока:
Больше полезных материалов в нашем Telegram канале. Вступайте и будем на связи! https://t.me/bf_conversion