@rusgayfer

Как получить погоду если не отдаем данные?

Делаю запрос на погоду, то отдает данные, то нет. Как сделать если не получили ответа, то делаем еще запрос (будет делать повторные запросы пока не получит ответ).

// Парсим погоду
{ // Парсим погоду
$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;}
}
 }
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
TommyV888
@TommyV888 Куратор тега PHP
-
<?php
do {
    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);
} while (!$file);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы