Информеров много. Подавляющее большинство из них предназначено для веб-мастеров, дабы те без труда могли украсить свой сайт погодой. Но для домашнего пользователя эти информеры не слишком полезны, и мы поступим проще – возьмём погоду из rss и запишем её в текстовый файл. А из текстового файла, как известно, можно сделать всё, что угодно.
Мне очень нравятся разные информеры из gismeteo.ru. В, частности, rss-информер в формате xml. Набираем в браузере informer.gismeteo.ru/rss/26850.xml и получаем xml-файл. 26850 – это код Минска. Для другого города код будет другим. Но не будем же мы каждый раз набирать адресную строку в браузере! Чтобы получить xml-файл, пишем простейший скрипт:
#!/bin/bash
rm -rf 26850.xml
wget informer.gismeteo.ru/rss/26850.xml
exit 0
Сохраните скрип под именем get_pogoda и с помощью файлового менеджера в свойствах файла get_pogoda отметьте разрешение на выполнение. Из эмулятора терминала запустите скрипт, набрав ./get_pogoda. Если Интернет «на мази», то в результате работы этого скрипта в вашем домашнем директории появится файл 26850.xml . Его-то мы и будем парсить (разлагать на составляющие), но другим скриптом. Парсер можно написать на любом языке, работающем со строками, например, awk или sed, но для парсинга xml-файла лучше всего подходит язык PHP. В PHP работа с тегами упрощена до предела. На нём и напишем парсер, а запускать будем из вышеприведенного сценария. Чтобы разобраться в парсере, надо визуально исследовать xml-файл. Как видим, он содержит 4 вот таких элемента:
<item>
<title>Минск: Вечер 17 Mar, Sat</title>
<link>http://www.gismeteo.ru/city/daily/4248/?942512</link>
<description>температура 6..8 С, давление 739..741 мм рт.ст., ветер Юго-Западный, 4 м/с</description>
<category>Погода</category>
<enclosure url="http://img.gismeteo.ru/images/icons/new/d.sun.c1.png" length="2000" type="image/gif" />
<source url="http://informer.gismeteo.ru/rss/26850.xml">GISMETEO.RU: Погода в г. Минск</source>
<guid>905882</guid>
</item>
Внутри элемента нас интересует тег title и тег description. Тег title содержит циклическое указание отрезка времени, для которого сообщается о погоде {«День», «Вечер», «Ночь», «Устро»}. Также этот тег содержит информацию о дате и местности. Тег description содержит собственно погоду: облачность, температуру, давление, направление и скорость ветра. Сепараторами внутри тега description служат сочетания запятой с пробелом. Нюанс в том, что тег description может содержать, а может и не содержать состояние облачности («пасмурно», «ясно» и т.д.). Что и учитывает следующий php-скрипт:
<?php
$url = '26850.xml';
$xml= simplexml_load_file($url);
$i=0;
foreach ($xml->channel->item as $item) {
$masstitle[] = $item->title;
$massdesk[] = $item->description;
$citydate[] = explode(":", $masstitle[$i][0]);
$new[] = explode(", ", $massdesk[$i][0]);
$i++;
}
$timeday = 2; // Ночь, Утро, День, Вечер
$city=$citydate[$timeday][0];
$date=$citydate[$timeday][1];
// ищем слово "температура".
$temppos0=strpos($new[$timeday][0], "температура");
$ix=0;
if($temppos0!=0)
$sky =$new[$timeday][$ix++];
else
$sky ="...нет данных"; // "Облачность" делаем пустой строкой
$temp=substr($new[$timeday][$ix++],"22"); // температура
$prec=substr($new[$timeday][$ix++],"17"); // давление
$wind=substr($new[$timeday][$ix++],"10"); // ветер
$speed=substr($new[$timeday][$ix++],"0"); // скорость
$wind=$wind.", ".$speed;
$str = sprintf("%s | %s\n Облачность: %s\n Температура: %s\n Давление: %s\n Ветер: %s ", $date,$city,$sky,$temp,$prec,$wind);
// пишем в файл:
if (file_exists("weather.txt"))
unlink("weather.txt");
$f = fopen("weather.txt","w+");
fputs($f, $str);
fclose($f);
?>
Теги item индексируются, начиная с нуля. Вышеприведенный скрипт выделяет не погоду на завтра, а погоду через три четверти суток. Скрипт легко изменить так, чтобы выделялась любая из ближайших четвертей. Для этого надо присвоить переменной $timeday другое значение в пределах 0-3.
Многие линуксные редакторы текстовых файлов уже приспособлены для работы с PHP-файлами, например gedit или kate. Кate удобнее, так как обеспечивает и подсветку синтаксиса, и фолдинг тегов. Установите редактор kate командой sudo apt-get install kate. Но можно обойтись и редактором gedit, он тоже подсвечивает синтаксис. Откройте редактор текстовых файлов и скопируйте PHP-скрипт. Сохраните его в в домашнем директории в файле под именем weather.php. Чтобы работать с PHP-скриптами, установите PHP-интерпретатор php5-cli. Выполните команду php weather.php. В результате работы скрипта у вас должен появиться текстовый файл weather.txt примерно следующего содержания:
Ночь 18 Mar, Sun | Минск
Облачность: ...нет данных
Температура: 4..6 С
Давление: 739..741 мм рт.ст.
Ветер: Юго-Западный, 4 м/с
Добавьте строку php weather.php в сценарий get_pogoda. Добавлять надо перед строчкой exit 0.
Где можно использовать полученный сценарий? Ну, хотя бы в conky. Conky – чрезвычайно популярный декоратор экрана компьютера линуксоида. Для простейшего conky в текст его сценария (файл .conkyrc в домашней директории) надо добавить следующие строки:
${execi 1800 ~/get_pogoda}
${color}${execi 2 cat weather.txt}
Переменная color – это цвет по умочанию. Execi – это команда «выполнить». Следующая за этой командой execi цифра – период выполнения в секундах. Имеем цепочку запусков сценариев: из conky запускается сценарий get_pogoda, который запускает сценарий php weather.php, который записывает файл, который... Словом, как в считалке «Вот дом, который построил Джек». Именно на этом принципе построены все ИТ, работающие как с маленькими локальными файлами, так и с громадными распределёнными базами данных.
Модифицируйте скрипт weather.php по своему вкусу и потребностям, добавьте вызов картинок. Удачи!
Комментарии
rm -rf 26850.xml
зачем тут "-rf"?
Зачем -rf ? Простите великодушно, привычка. -r -- это рекурсивное удаление, а -f -- форсаж, чтобы система не заводила с вами речь о попытке удаления несуществующего файла. Рекурсивность тут, конечно, не требуется, так нет вложенных файлов, хотя и не вредит; а вот форсаж нужен, так как при самом первом выполнении скрипта будет попытка удаления несуществующего файла.
Кстати, скрипт на PHP содержит ошибку. 1-ый аргумент функции strpos при поиске "температура" должен быть $massdesk[$timeday] а не $new[$timeday][0].