вторник, 27 марта 2012 г.

О том как написать программу на lua для приема сводок погоды с любого сайта. Часть 1

Скрипт написан на основе работ любителя conky mrpeachy, за что ему большое спасибо.

Так как описание, скорее всего, займет много места, а читать и тем более писать, длинные тексты не всегда удобно, буду выкладывать частями, по мере написания.

Итак начнем

ВНИМАНИЕ: для забора данных из сети должна быть установлена программа curl, она есть во всех репозитариях.

Для начала через гугл или другую поисковую систему ищем сайт с прогнозом нашего местоположения.

К примеру мне необходимо вывести в окно конки текущую погоду и прогноз на несколько суток для города Павлограда, что находится в Украине.

В окне поиска пишу

погода в Павлограде, Украина

Выбираю сайт, мне понравился сайт www.weatherreports.com, так как он открылся с необходимыми мне данными, сохраняю адрес этой страницы, для Павлограда он такой

http://www.weatherreports.com/Pavlograd,_Ukraine?units=c



Начинаем писать программу. Для начала заголовок, что впрочем не обязательно, но я напишу

--[[ forecast.lua
скрипт забирает прогноз погоды и обрабатывает его для вывода на экран
]]

Далее, как всегда пишем

require "cairo"

и создаём ссылку на понравившейся нам сайт

-- адрес сайта
web = "http://www.weatherreports.com/Pavlograd,_Ukraine?units=c"

ну и заодно время через которое будут обновляться данные

-- время обновления прогноза погоды
secs = 1800 -- обновление каждые 30 минут ( в секундах )

Теперь пишем функцию, которая будет забирать погоду с сайта и готовить данные к выводу на экран

function conky_forecast ()



end

Я всегда, начиная писать какую нибудь функцию, пропускаю несколько строк и пишу закрывающий функцию end, чтобы не забыть. Получилась функция которая ничего не делает. Сохраняем функцию в любое, на ваш выбор место, обозвав её например forecast.lua  и даём скрипту права на исполнение. Вписываем в свой любимый conkyrc строки, выше слова TEXT

lua_load ~/путь_до_скрипта/forecast.lua
lua_draw_hook_pre forecast


Это необходимо сделать для того чтобы иметь возможность запустить программу. Правда если её запустить в Терминале в таком виде, то ничего не должно произойти. Если при запуске вылетают ошибки, значит, или неправильный путь к скрипту, или нет прав на исполнение. Ниже слова TEXT должна быть хотя бы одна пустая строка.

Так выглядит скрипт на данный момент

-- ===========================================
--[[ forecast.lua
скрипт забирает прогноз погоды и обрабатывает его для вывода на экран
]]
require "cairo"


-- адрес сайта
web = "http://www.weatherreports.com/Pavlograd,_Ukraine?units=c"
-- время обновления прогноза погоды
secs = 1800 -- обновление каждые 30 минут ( в секундах )


function conky_forecast ()






end
-- ==============================================



Нам необходимо, чтобы через определённое время программа забирала данные о погоде с сайта. В классических conky это возможно сделать с помощью команды

execi 1800  (команда)

НО эта команда нагружает процессор, и ещё одно НО, мы пишем на lua.

Поэтому ниже названия функции пишем команды для таймера, который будет отсчитывать секунды

-- устанавливаем таймер обновления данных с сайта
local updates = tonumber(conky_parse('${updates}'))
local timer = (updates %secs) + 1
if timer == 1 or updates == 0 then






end

Первая строка забирает данные об обновлении из conkyrc, у меня всегда время обновления 1 секунда. Если время обновления сделать меньше, то повышается нагрузка на процессор, а если больше, то вывод секунд выводится некорректно.

Вторая строка, сам таймер, учитывающий каждое обновление conky, то есть количество прошедших секунд. Знак процента % указывает до какого момента считать, а secs - переменная которой мы выше присвоили значение 1800. При достижении 1800 секунд счетчик сбрасывается на 0.

Третья строка сравнивает полученное значение и если значения совпадают, то запускаются ниже стоящие программы. Остановкой служит значение end.

Теперь наша программа выглядит так

-- ===========================================
--[[ forecast.lua
скрипт забирает прогноз погоды и обрабатывает его для вывода на экран
]]

require "cairo"

-- адрес сайта
web = "http://www.weatherreports.com/Pavlograd,_Ukraine?units=c"
-- время обновления прогноза погоды
secs = 1800 -- обновление каждые 30 минут ( в секундах )

function conky_forecast ()

-- устанавливаем таймер обновления данных с сайта

local updates = tonumber(conky_parse('${updates}'))
local timer = (updates %secs) + 1
if timer == 1 or updates == 0 then







end
end
-- ==============================================

Всё готово для полученния данных с сайта

После строки

if timer == 1 or updates == 0 then

вписываем команду, которая заберет данные с сайта и поместит их в домашнюю директорию в файл pogoda. Эта команда нужна только для первого получения данных с сайта, ну и возможно потребуется, если сайт изменит формат вывода данных. Такой случай у меня был и в моём скрипте такая команда просто закомментирована, на всякий пожарный случай. И так пишем

-- для проверки загоняем в /home/pogoda
os.execute("curl --max-time 60 '"..web.."' | sed 's/%//g' >> ~/pogoda")

os.execute - очень универсальная команда. В данном случае она запускает строку написанную на bash. Её можно использовать везде, в программах написанных на lua, для запуска программ, плеера и т.д. и т.п.

curl - забирает данные, sed - фильтрует, и всё это загоняется в домашнюю директорию в файл pogoda

Полученный файл нужен для поиска данных на странице сайта.

Так выглядит программа после последних изменений.

-- ====================================================
--[[ forecast.lua
скрипт забирает прогноз погоды и обрабатывает его для вывода на экран
]]

require "cairo"

-- адрес сайта
web = "http://www.weatherreports.com/Pavlograd,_Ukraine?units=c"
-- время обновления прогноза погоды
secs = 1800 -- обновление каждые 30 минут ( в секундах )

function conky_forecast ()

-- устанавливаем таймер обновления данных с сайта

local updates = tonumber(conky_parse('${updates}'))
local timer = (updates %secs) + 1
if timer == 1 or updates == 0 then

-- для проверки загоняем в /tmp
os.execute("curl --max-time 60 '"..web.."' | sed 's/%//g' >> /tmp/pogoda &")

end
end
-- ==============================================

Итак скрипт готов, права на исполнение скрипту даны, в conkyrc прописан, ЗАПУСКАЕМ В ТЕРМИНАЛЕ

conky -c ~/путь-до-файла/conkyrc

В терминале появится примерно такое сообщение

olgmen@olgmen:~$ conky -c ~/proba/proba_conkyrc
Conky: desktop window (15a) is root window
Conky: window type - normal
Conky: drawing to created window (0x2c00001)
Conky: drawing to double buffer
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 49906  100 49906    0     0  34546      0  0:00:01  0:00:01 --:--:-- 47940

и в домашней директории появился файл pogoda. Это значит, что данные с сайта получены, скрипт работает.

На этом я остановлюсь. Продолжение следует.




1 комментарий:

  1. не могу разобраться что не так.

    ~$ conky -c ~/.conkyrc
    Conky: desktop window (1c00095) is subwindow of root window (14e)
    Conky: window type - override
    Conky: drawing to created window (0x4200001)
    Conky: drawing to double buffer
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    100 16502 0 16502 0 0 4562 0 --:--:-- 0:00:03 --:--:-- 10849

    файл pogoda создается, но не полный похоже. curl не хочет качать с сайта http://tolmachevo.nuipogoda.ru/forecast7.html
    подскажи, пожалуйста, что делать

    ОтветитьУдалить