Про 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()