среда, 7 октября 2009 г.

Погода в conky. Пишем скрипт

Про conky, наверное, знает знает каждый. Это один из самых популярных системных мониторов, отбражающих информацю на рабочий стол. Многие помимо информации о системе хоте ли бы видеть на рабачем столе и погоду, однако, когда я столкнулся с подобной задачей, то не смог ее решить: то готовый скрипт не работал, то на сервере, к которому он обращался, не было информации о моем городе. Что ж, не беда на пишем свой скрипт.

Писать будем на Python 2.6. В качестве ланных будум использовать те, что предоставляет http://informer.gismeteo.ru. Данный сервис умеет выдовать погоду в формате XML, чем мы и воспользуемся. По умолчанию скрипт отображает в файл только текущую погоду, но данные имеет обо всей погоде на день. У меня он вызывается cron'ом раз в час и сохраняет все данные в файл, который уже смотрит conky



#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import xml.dom.minidom
import urllib

addr = 'http://informer.gismeteo.ru/xml/28411_1.xml'
param = ['TEMPERATURE', 'PRESSURE', 'WIND']
file = '/home/kirill/.conky/GetWeath/weather'

class weathClass(list):
    def __init__(self, lst): # [temp, press, wind]
        self.temp = lst[0] # title
        self.press = lst[1] # link
        self.wind = lst[2] # date

class Parser():
    def __init__(self, xml_str):
        self.doc = xml.dom.minidom.parseString(xml_str)

    def parse(self):
        weath = []
        items = self.doc.getElementsByTagName('FORECAST')
        for i in items:
            max_val = map(lambda p: i.getElementsByTagName(p)[0].
                getAttribute('max'), param)
            min_val = map(lambda p: i.getElementsByTagName(p)[0]
                getAttribute('min'), param)
            weath.append(weathClass(zip(max_val, min_val)))
        return weath

class Application():
    def __init__(self):
        parser = Parser(self.load(addr))
        self.save(self.format(parser.parse()))

    def format(self, weath):
        st = 'Погода в Ижевске: ' 
        st = st.decode('UTF-8') + weath[0].temp[1] + 
            ' .. ' + weath[0].temp[0] + ' C\n'
        st = st + 'Давление: '.decode('UTF-8') + 
            weath[0].press[1] + ' .. ' + weath[0].press[0] 
            + 'мм рт.ст.\n'.decode('UTF-8')
        st = st + 'Ветер: '.decode('UTF-8') + weath[0].wind[1] 
            + ' .. ' + weath[0].wind[0] + ' м/с'.decode('UTF-8')
        return st
  
    def load(self, url):
        up = urllib.urlopen(url)
        return up.read()

    def save(self, st):
        fp = open(file, 'w')
        fp.write(st.encode('UTF-8'))
        fp.close()

App = Application()

Комментариев нет:

Отправить комментарий