Делаю запрос на погоду, то отдает данные, то нет. Как сделать если не получили ответа, то делаем еще запрос (будет делать повторные запросы пока не получит ответ).
// Парсим погоду
{ // Парсим погоду
$city = $d['geoid']; // GeoId города (11310 - Минусинск)
$lat = $d['latitude'];
$lon = $d['longitude'];
$img_folder = "https://yastatic.net/weather/i/icons/islands/32/"; // Папка с файлами изображений (https://yastatic.net/weather/i/icons/islands/32/) если нужны свои иконки поменяйте путь и название иконок на:
$img_ext = "png"; // Расширение файлов картинок (svg / png)
// Формируем запрос
$timestamp = time();
$yandex_token = md5('eternalsun'.$timestamp);
$uuid = "8211637137c4408898aceb1097921872";
$deviceid = "315f0e802b0b49eb8404ea8056abeaaf";
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"User-Agent: yandex-weather-android/4.2.1 \n" .
"X-Yandex-Weather-Client: YandexWeatherAndroid/4.2.1 \n" .
"X-Yandex-Weather-Device: os=null;os_version=21;manufacturer=chromium;model=App Runtime for Chrome Dev;device_id=$deviceid;uuid=$uuid; \n" .
"X-Yandex-Weather-Token: $yandex_token \n" .
"X-Yandex-Weather-Timestamp: $timestamp \n" .
"X-Yandex-Weather-UUID: $uuid \n" .
"X-Yandex-Weather-Device-ID: $deviceid \n" .
"Accept-Encoding: gzip, deflate \n" .
"Host: api.weather.yandex.ru \n" .
"Connection: Keep-Alive \n"
)
);
$context = stream_context_create($opts);
// Отправляем запрос
if($d['geoid'] !== '') {
$file = @file_get_contents('https://api.weather.yandex.ru/v1/forecast?geoid='.$city. '&lang=ru&l10n=true', false, $context);
}
else {
$file = @file_get_contents('https://api.weather.yandex.ru/v1/forecast?lat='.$lat.'&lon='.$lon.'&lang=ru&l10n=true', false, $context); // более точная погода по lat и lon (это если нету id, например село)
}
sleep(3);
if ($file){
// Разархивируем ответ
$yandex = gzdecode($file);
$data_info_name = (array) json_decode($yandex)->info;
$slug = $data_info_name['slug'];
$data_fact_name = (array) json_decode($yandex)->geo_object->locality; // Выводим id и название города
$data_fact = (array) json_decode($yandex)->fact;
$temp_current = $data_fact['temp']; // Текущая температура
$icon_fact = $data_fact['icon']; // Иконка текущей температуры
$translation = (array) json_decode($yandex)->l10n;
$condition = $data_fact['condition'];
$condition_ru = $translation[$condition];
//$icon_fact = preg_replace('/_/i','-',$icon_fact); // Заменяем символ "_" на символ "-"
//$icon_fact = preg_replace('/--/i','-',$icon_fact); // Заменяем символы "--" на символ "-"
$wind_speed = $data_fact['wind_speed']; // Скорость ветра
$humidity = $data_fact['humidity']; // Влажность (%)
$pressure_mm = $data_fact['pressure_mm']; // Атмосферное давление (мм рт. ст.)
$data_forecasts0 = (array) json_decode($yandex)->forecasts[0];
$sunrise = $data_forecasts0['sunrise']; // Рассвет
$sunset = $data_forecasts0['sunset']; // Закат
// Находим температуру на каждый час за сутки
for ($h = 0; $h<24; $h++) {
$hour_array1[$h] = (int) json_decode($yandex)->forecasts[0]->hours[$h]->temp;
}
$min_hour = min($hour_array1); // Находим из них минимальную
$max_hour = max($hour_array1); // И максимальную температуру
// Находим температуру на каждый час за следующие сутки
for ($h = 0; $h<24; $h++) {
$hour_array2[$h] = (int) json_decode($yandex)->forecasts[1]->hours[$h]->temp;
}
$min_hour_t = min($hour_array2); // Находим из них минимальную
$max_hour_t = max($hour_array2); // И максимальную температуру
// ПОГОДА НА СЕГОДНЯ //
$data_forecasts1 = (array) json_decode($yandex)->forecasts[0]->parts->morning;
$avg_morning = $data_forecasts1['temp_avg']; // Находим среднюю температуру утром
$avg_morning_feels = $data_forecasts1['feels_like']; // Ощущаемая температура (°C).
$avg_morning_wind = $data_forecasts1['wind_speed']; // Скорость ветра (в м/с).
$avg_morning_wind_dir = 'wind-'.$data_forecasts1['wind_dir']; // Направление ветра. Возможные значения
$icon_morning = $data_forecasts1['icon']; // Иконка средней температуры утром
$icon_morning = preg_replace('/_/i','-',$icon_morning); // Заменяем символ "_" на символ "-"
$icon_morning = preg_replace('/--/i','-',$icon_morning); // Заменяем символы "--" на символ "-"
$condition_morning = $translation[$data_forecasts1['condition']]; // Состяние погоды утром
$data_forecasts2 = (array) json_decode($yandex)->forecasts[0]->parts->day;
$avg_day = $data_forecasts2['temp_avg']; // Находим среднюю температуру днем
$avg_day_feels = $data_forecasts2['feels_like']; // Ощущаемая температура (°C).
$avg_day_wind = $data_forecasts2['wind_speed']; // Скорость ветра (в м/с).
$avg_day_wind_dir = 'wind-'.$data_forecasts2['wind_dir']; // Направление ветра. Возможные значения
$icon_day = $data_forecasts2['icon']; // Иконка средней температуры днем
$icon_day = preg_replace('/_/i','-',$icon_day); // Заменяем символ "_" на символ "-"
$icon_day = preg_replace('/--/i','-',$icon_day); // Заменяем символы "--" на символ "-"
$condition_day = $translation[$data_forecasts2['condition']]; // Состяние погоды днем
$data_forecasts6 = (array) json_decode($yandex)->forecasts[0]->parts->evening ;
$avg_evening = $data_forecasts6['temp_avg']; // Находим среднюю температуру вечером
$avg_evening_feels = $data_forecasts6['feels_like']; // Ощущаемая температура (°C).
$avg_evening_wind = $data_forecasts6['wind_speed']; // Скорость ветра (в м/с).
$avg_evening_wind_dir = 'wind-'.$data_forecasts6['wind_dir']; // Направление ветра. Возможные значения
$icon_evening = $data_forecasts6['icon']; // Иконка средней температуры вечером
$icon_evening = preg_replace('/_/i','-',$icon_evening); // Заменяем символ "_" на символ "-"
$icon_evening = preg_replace('/--/i','-',$icon_evening); // Заменяем символы "--" на символ "-"
$condition_evening = $translation[$data_forecasts6['condition']]; // Состяние погоды вечером
$data_forecasts3 = (array) json_decode($yandex)->forecasts[0]->parts->night;
$avg_night = $data_forecasts3['temp_avg']; // Находим среднюю температуру ночью
$avg_night_feels = $data_forecasts3['feels_like']; // Ощущаемая температура (°C).
$avg_night_wind = $data_forecasts3['wind_speed']; // Скорость ветра (в м/с).
$avg_night_wind_dir = 'wind-'.$data_forecasts3['wind_dir']; // Направление ветра. Возможные значения
$icon_night = $data_forecasts3['icon']; // Иконка средней температуры ночью
$icon_night = preg_replace('/_/i','-',$icon_night); // Заменяем символ "_" на символ "-"
$icon_night = preg_replace('/--/i','-',$icon_night); // Заменяем символы "--" на символ "-"
$condition_night = $translation[$data_forecasts3['condition']]; // Состяние погоды ночью
// Если значение температуры положительно, для наглядности добавляем "+"
if ($temp_current>0) {$temp_current='+'.$temp_current;}
if ($min_hour>0) {$min_hour='+'.$min_hour;}
if ($max_hour>0) {$max_hour='+'.$max_hour;}
if ($min_hour_t>0) {$min_hour_t='+'.$min_hour_t;}
if ($max_hour_t>0) {$max_hour_t='+'.$max_hour_t;}
if ($avg_day>0) {$avg_day='+'.$avg_day;}
if ($avg_night>0) {$avg_night='+'.$avg_night;}
if ($avg_day_t>0) {$avg_day_t='+'.$avg_day_t;}
if ($avg_night_t>0) {$avg_night_t='+'.$avg_night_t;}
}
}