[Сценарий] Погода от Яндекс

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Погода (Яндекс)

Сообщение skysilver » Вт апр 28, 2015 5:58 pm

Предлагаю немного улучшить код сценария (на усмотрение автора, конечно :)).
Ключевые моменты:
  • обработка ошибок при запросе XML;
  • таймаут ожидания при запросе XML;
  • несколько попыток запроса XML;
  • проверка на существование нужных полей в XML;
  • запись в лог.
СпойлерПоказать

Код: Выделить всё

// Писать логи ( 0-нет, 1-только критические, 2-все )
$reclog = 1;

// Открываем лог, если нужно.
if ($reclog) { $log = getLogger('script.WeatherFromYandex'); }

// Адрес xml файла
$data_file = "http://export.yandex.ru/weather-ng/forecasts/$city_id.xml?".rand(1, 1000);

// Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
libxml_use_internal_errors(true);

// Установим контекст потока
$ta = 30;   //Таймаут ожидания страницы от Яндекса (секунд)
$ctx = stream_context_create(array('http' => array('timeout' => $ta)));
libxml_set_streams_context($ctx);

$retries = 5;    // Число попыток запроса xml у Яндекса
$count = 0;        // Счетчик попыток
$xml = false;

while ( ($count !== $retries) && ($xml === false) ) {
    if ( $reclog == 2 ) $log->trace('Запрос данных погоды от сервиса Яндекс.Погода. Попытка = ' . $count);
     // Получаем xml от Яндекса и раскладываем на массив    
     $xml = @simplexml_load_file($data_file);
     if ( $reclog == 2 ) {
         if ( $xml === false ) $log->trace('Запрос данных погоды от сервиса Яндекс.Погода. Неуспешная попытка.');
           else $log->trace('Запрос данных погода от Яндекса. Успешная попытка.');
    }
     // Пауза между попытками
     sleep(1);
     $count++;
}

if($xml ===  false) { 
       if ($reclog) $log->error('Не удалось получить данные от сервиса Яндекс.Погода.');
    foreach(libxml_get_errors() as $error) {
         if ($reclog) $log->error($error->message);
    }
     libxml_clear_errors(); 
} 
else { 
    
     if( $fact = $xml->fact ) {
        
        // получаем нужные свойства, как раньше
         
    }
 
     if( $day0 = $xml->day[0] ) {
    
         // получаем нужные свойства, как раньше
        
    }
     
     if ( libxml_get_last_error() !== false ) {
    
         if ($reclog) $log->error('Данные от сервиса Яндекс.Погода получены, но возникли ошибки: ');
         
         foreach(libxml_get_errors() as $error) {
             if ($reclog) $log->error($error->message);
        }
    }
     
     libxml_clear_errors();
}
За это сообщение автора skysilver поблагодарили (всего 4):
Amarok (Ср апр 29, 2015 4:59 am) • denis (Сб мар 19, 2016 6:42 pm) • slgeo (Вт мар 22, 2016 9:25 pm) • Logrus (Чт сен 27, 2018 1:12 pm)
Рейтинг: 4.65%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
cyberdemon
Сообщения: 1
Зарегистрирован: Вт июл 07, 2015 11:54 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Погода (Яндекс)

Сообщение cyberdemon » Чт июл 09, 2015 4:24 pm

Рассказывает прогноз погоды Yandex по команде -"прогноз погоды", вместо demo погоды

Добавляем в сценарий WeatherFromYandex

Код: Выделить всё

   $temp=$xml->day[1]->day_part[1]->temperature_from;
  if ($temp!="") {
   if ($temp>0) {$temp='+'.$temp;}
 $Tomorrow.=$temp; }
 $Tomorrow.="...";
 $temp=$xml->day[1]->day_part[1]->temperature_to;
 if ($temp!="") {
   if ($temp>0) {$temp='+'.$temp;}
 $Tomorrow.=$temp; 
  $Tomorrow.="°, "; }
 $Tomorrow.=$xml->day[1]->day_part[1]->weather_type;
 
  $temp=$xml->day[0]->day_part[3]->temperature;
  if ($temp!="") {
   if ($temp>0) {$temp='+'.$temp;}
 $night.=$temp;
   $night.="°, "; }
 $night.=$xml->day[0]->day_part[3]->weather_type;

sg($obj['TITLE'].".weatherTomorrow",$Tomorrow);
sg($obj['TITLE'].".weatherNight",$night);
заходим объекты -> сценарии -> readWeatherToday
и меняем код на

Код: Выделить всё

$weather.="Сегодня ночью ".str_replace('°',' ',getGlobal('Kirov.weatherNight'));
$weather.=". Завтра ".str_replace('°',' ',getGlobal('Kirov.weatherTomorrow'));
$weather.=". Сейчас на улице ".getGlobal('Kirov.Temp').'°';
$weather=str_replace('°','',$weather);
say($weather,2);
объект с именем города (Kirov) меняем на свой
Amarok писал(а): $w3days="Сегодня ночью будет ";
   $temp=$xml->day[0]->day_part[3]->temperature_from;
если температура ночью, то нужно исользовать temperature, вместо temperature_from
За это сообщение автора cyberdemon поблагодарил:
Amarok (Пт июл 10, 2015 12:31 pm)
Рейтинг: 1.16%
Аватара пользователя
adzam
Сообщения: 602
Зарегистрирован: Сб дек 08, 2012 10:28 pm
Откуда: Кишинев
Благодарил (а): 20 раз
Поблагодарили: 138 раз

Re: Погода (Яндекс)

Сообщение adzam » Чт авг 27, 2015 2:24 pm

Подскажите пож. как можно выполнить этот запрос страны и города на домашней странице
2.png
2.png (55.71 КБ) 20824 просмотра
Сколько не вожусь с кодом после выбора страны он вылетает в панель управления.
Помогите, может кто знает?
Очень нужно запустить этот скрипт на домашней странице.
Мои проекты здесь...https://connect.smartliving.ru/profile/41/blog213.htm
Если вам помогло какое-либо мое сообщение - не ленитесь пользоваться кнопкой СПАСИБО.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: Погода (Яндекс)

Сообщение LutsenkoDenis » Чт авг 27, 2015 5:18 pm

adzam писал(а):Подскажите пож. как можно выполнить этот запрос страны и города на домашней странице
...
Очень нужно запустить этот скрипт на домашней странице.
Не кажется странным что вопрос про модуль "OpenWeather" задан в теме про модуль "Погода (Яндекс)" ?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
adzam
Сообщения: 602
Зарегистрирован: Сб дек 08, 2012 10:28 pm
Откуда: Кишинев
Благодарил (а): 20 раз
Поблагодарили: 138 раз

Re: Погода (Яндекс)

Сообщение adzam » Чт авг 27, 2015 5:38 pm

Да просто не нашел ее, а новую плодить не хотел.
В модуле "Погода (Яндекс)" тоже есть похожее меню , с которым я тоже мучился,но умишком то видно не очень вышел ведь заточен больше под электронику чем под программы - поэтому и прошу помогите кто может.И особенно прошу Lutsenko Denisa помочь разобраться ведь ты же в модуле "Погода (Яндекс)" тоже такое сотворил но немного подругому.

3.png
3.png (18.39 КБ) 20804 просмотра
Мои проекты здесь...https://connect.smartliving.ru/profile/41/blog213.htm
Если вам помогло какое-либо мое сообщение - не ленитесь пользоваться кнопкой СПАСИБО.
I_I_Imonder
Сообщения: 256
Зарегистрирован: Сб янв 11, 2014 2:54 pm
Благодарил (а): 12 раз
Поблагодарили: 14 раз

Re: Погода (Яндекс)

Сообщение I_I_Imonder » Чт окт 29, 2015 3:30 pm

Сделал все по инструкции, при выполнении скрипта пишет вот это. что может быть не так?

Warning: simplexml_load_file() [function.simplexml-load-file]: http://export.yandex.ru/weather-ng/fore ... ml?10569:1: parser error : Start tag expected, '<' not found in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 5

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\_majordomo\htdocs\modules\scripts\scripts.class.php(139) : eval()'d code on line 5
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Погода (Яндекс)

Сообщение skysilver » Пт окт 30, 2015 4:32 pm

Ну если пытаетесь обработать именно такую ссылку (скопировал из вашего поста)

Код: Выделить всё

http://export.yandex.ru/weather-ng/forecasts/.xml?10569:1  
то она явно кривая, поэтому и ошибка.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
AEI
Сообщения: 4
Зарегистрирован: Вт окт 20, 2015 8:24 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Погода (Яндекс)

Сообщение AEI » Вс ноя 01, 2015 8:05 pm

Добрый вечер. У всех данный сценарий работает? Установил. Ошибок не выдает. Но как мне кажется и xml пустой. Если скопировать ссылку в адресную строку браузера он выдает xml, но происходит переадресация на httpS:\\export............. Скрипт не менял.
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Погода (Яндекс)

Сообщение Amarok » Пн ноя 02, 2015 6:56 am

у меня - работает
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Мазур
Сообщения: 133
Зарегистрирован: Чт ноя 26, 2015 3:52 pm
Благодарил (а): 32 раза
Поблагодарили: 1 раз

Re: Погода (Яндекс)

Сообщение Мазур » Ср дек 02, 2015 2:08 pm

Решил сделать все по пунктам:
Захожу в обьекты -> создаю новый касс "Погода с Yandex"
1.jpg
1.jpg (40.3 КБ) 20091 просмотр
создаю свойство класса city_id (это ID города согласно Yandex)
создаю свойство класса city (это имя города по русски)
создаю свойство класса Temp и установить желаемое время хранения истории (у меня 365дней)
2.jpg
2.jpg (38.13 КБ) 20091 просмотр
Там же создаю обьект "Санкт-Петербург"
3.jpg
3.jpg (73.23 КБ) 20091 просмотр
заполняю свойства (City_id посмотрела так: Открыл прогноз yandex, прав.кнопкой мыши - просмотр кода страницы, поиск на странице "city")
4.jpg
4.jpg (82.93 КБ) 20091 просмотр
Захожу в сценарии и добавляю новый сценарий WeatherFromYandex в него вставляю код из шапки.
5.jpg
5.jpg (175.05 КБ) 20091 просмотр
Заходим в "обьекты"-Timer и видим там onNewMinute. Заходим в него и вставляем код из шапки

if ($m%30 == 0) {runScript("WeatherFromYandex");}// обновляем погоду с Яндекса каждые 30 минут
6.jpg
6.jpg (73.73 КБ) 20091 просмотр
А вот что дальше ума не приложу! Надо создать страницу или блок, где будет отображаться погода или что?!
Ответить