Линукс: работа с разными скриптами (ликбез)

Информеров много. Подавляющее большинство из них предназначено для веб-мастеров, дабы те без труда могли украсить свой сайт погодой. Но для домашнего пользователя эти информеры не слишком полезны, и мы поступим проще – возьмём погоду из 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 по своему вкусу и потребностям, добавьте вызов картинок. Удачи!

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Neschur

rm -rf 26850.xml

зачем тут "-rf"?

Аватар пользователя mike

Зачем -rf ? Простите великодушно, привычка. -r -- это рекурсивное удаление, а -f -- форсаж, чтобы система не заводила с вами речь о попытке удаления несуществующего файла. Рекурсивность тут, конечно, не требуется, так нет вложенных файлов, хотя и не вредит; а вот форсаж нужен, так как при самом первом выполнении скрипта будет попытка удаления несуществующего файла.

Аватар пользователя mike

Кстати, скрипт на PHP содержит ошибку. 1-ый аргумент функции strpos при поиске "температура" должен быть $massdesk[$timeday] а не $new[$timeday][0].