LINUX.ORG.RU

Яндекс.Погода + conky [Arch]

 , , , ,


5

3

Решил засунуть погоду от Яндекса в коньки. Перерыв пол-интернета в поисках решения, понял, что быстрее написать все лично. Может, кому пригодится=)

 #!/usr/bin/python
import re
import sys
import urllib

from urllib.request import urlopen
html = urlopen("https://pogoda.yandex.ru/nizhny-novgorod")
htmls = html.read().decode('utf-8')
tempera=re.compile(r'<div\ class="current\-weather__thermometer\ current\-weather__thermometer_type_now">(.*?)</div>')
temp=tempera.findall(htmls)[0].replace("&thinsp;","").replace("°C","")
windera=re.compile(r'<div\ class="current\-weather__info\-row\ current\-weather__info\-row_type_wind"><span\ class="current\-weather__info\-label">Ветер:\ </s$:\ </span>\ (.*?)<abbr')
wind=windera.findall(htmls)[0]
kompasera=re.compile(r'<abbr title=".*?">(.*?)</abbr>')
kompas=kompasera.findall(htmls)[0]
ftemp = open(r'/home/osabio/weather/temp', "w+")
ftemp.write(temp)
ftemp.close()
ftemp = open(r'/home/osabio/weather/wind', "w+")
ftemp.write(wind)
ftemp.close()
ftemp = open(r'/home/osabio/weather/kompas', "w+")
ftemp.write(kompas)
ftemp.close()

В коньках, соответственно просто запуск скрипта ${execi cat ~/bin/weather.py} и вывод из файла ${execi 60 cat ~/weather/temp} (wind, kompas).

Камнями прошу не кидать - на питоне пишу впервые.

<зануда on> время поиска решения ~2,5 часа, чтение манов и написание скрипта - ~25 мин.

время выполнения скрипта ~500 мс, за вычетом пинга ~470 мс. <зануда off>

Deleted

Последнее исправление: osabio (всего исправлений: 1)

Ответ на: комментарий от Ake

Лучше. Долго искал где это у них, спасибо)

Deleted
()

Думаю, что быстрее как для скрипта, так и для соединения парсить «аскетичную версию», ссылка на которую есть на дефолтной странице погоды. Разница есть: https://p.ya.ru/blagoveshchensk

Bfgeshka ★★★★★
()
Ответ на: комментарий от Deleted
#!/bin/bash

function getId() {
  wget https://weather.yandex.ru/static/cities.xml -q -O- |
  grep "$1" |
  sed 's/.*id="\([0-9]*\)".*/\1/'
}

wget "https://export.yandex.ru/weather-ng/forecasts/$(getId "Нижний Новгород").xml"
anonymous
()

У тебя яндекс прогнозы точные дает? Я так пробовал и им пользоваться, и гисметео. В итоге, пришел к выводу что на Yahoo Weaher прогнозы для моего региона точнее =) И самое главное, более-менее точно показывает текущую погоду. С показаниями термометра за окном, как правило, или нет расхождения, или минимальное.

Мало ли решишь Yahoo Weaher попробовать, я для себя bash-скрипт писал, только код населенного пункта на свой заменить надо (по ссылке описано что и где брать).

xxblx ★★★
()
Ответ на: комментарий от Bfgeshka

ЗЫ. замерил скорость получения - одинаково.

$time curl https://pogoda.yandex.ru/berlin real 0m0.446s user 0m0.032s sys 0m0.007s

$time curl https://p.ya.ru/blagoveshchensk real 0m0.417s user 0m0.033s sys 0m0.007s

А с парсингом одинаково - примерно одинаково далеко от начало html идет распарсиваемое выражение.

Deleted
()
Ответ на: комментарий от xxblx

За ссылку спасибо, воспользуюсь)

Я распарсиваю текущую погоду) особенно принципиален ветер, а то вдруг выйти из дома придется, брр.

Deleted
()
Ответ на: комментарий от Deleted

У меня так яндекс в проливной дождь может в «Погода сейчас» показывать «Солнце, небольшая облачность». Ну, со временем, надоело. А потом как-то случайно наткнулся на яху погоду, заметил, что показывает достаточно точно. С тех пор и пользуюсь.

xxblx ★★★
()
Ответ на: комментарий от xxblx

Попробую сравнить. имхо, достаточно часто обновляется информация, примерно раз в два-три часа - последняя например на 18.00. Мне хватает

Да и погода резко не меняется, не тропики же.

Deleted
()
Ответ на: комментарий от DeadEye

Я здесь недавно, 25 сообщений, score 48 - а там меньше 50 не пущают. Но спасибо)

Правда, там ошибка - не ${execi 60 cat ~/weather/temp} (wind, kompas)

wind, kompas (ветер, направление ветра) подставляются вместо temp, т.е.

${execi 60 cat ~/weather/temp} ${execi 60 cat ~/weather/wind} ${execi 60 cat ~/weather/kompas}

или что-либо из этого набора.

Deleted
()

Вот обьясните, зачем людям коньки? У вас бывают приложения не на весь экран? У меня постоянно максимизированый браузер и терминал

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Гм. пользуюсь firefox-ом с Htile и classic theme restore, нехватки места не замечаю (коньки сверху, 22px). Большинство времени вне интернета провожу в terminator на весь экран или в железной консоли. ОО не пользуюсь, только Latex + ST3 - в нем нет дурацких толбаров, отнимающих место. Рамки окна - 1px, везде где отключается заголовок приложения при разворачивании - отключаю (раньше сидел на i3, сейчас pytyle)

В общем, исчезновения этих 22 пикселей и не заметил.

Deleted
()
Ответ на: комментарий от vertexua

Только чистая обоина, и никаких rox/pcmanfm)

Deleted
()

Ребятки, вас Яша забанит за обращение каждые 60 секунд. Проверял уже. Обновляйте раз в 30 минут и в полночь.

peregrine ★★★★★
()
Ответ на: комментарий от Deleted

Просто я не уверен, что тебе нужно направление ветра. Тем более каждую минуту. Тем более на питоне.

Простой быдлоскрипт на баше вышел в пять строк и на него в общем потрачено три минуты. В нём показывается температура, скорость ветра и характер погоды - что ещё надо-то?

Bfgeshka ★★★★★
()
Ответ на: комментарий от peregrine

я вот тоже на это напоролся в своё время:) сейчас отсюда беру на 10 дней, там и ветер есть.

http://api.wunderground.com/api/a1bdaae772795454/forecast10day/q/Moskva,%20Russia.xml

Frost ★★★
()
Ответ на: комментарий от Bfgeshka

1) В баше не силён. Пытался реализовать sed | grep , но не получилось. 2) Опечатка при копировании, у меня в исходниках 600 стоит(10 мин) 3,4) Скрипт на ч и с т о м баше может, и работает быстрее питона. а дергание sed grep awk точно медленнее. проверено. 5) Тот же самый быдлоскрипт и у меня, просто предложенный на растерзание. Питон вс Баш? каждому-свое, во всяком случае регулярки чаще на питоне и перле эффективнее *3,4).

Deleted
()
Ответ на: комментарий от Bfgeshka

Может, скрипт и не самый лучший - зато в обсуждении предложена куча вариантов, которые нагуглить не так уж и просто. Прошу считать тему закрытой, ибо информации здесь стало более чем достаточно)

Deleted
()
Ответ на: комментарий от vertexua

Вот обьясните, зачем людям коньки?

Лучше пусть объяснят зачем текущая погода без прогноза на экране. В окне всяко актуальней, даже в центре восточно-европейской равнины, не говоря о всяких северных столицах.

mandala ★★★★★
()
#!/usr/bin/env python3

import os
import re
import json
import urllib.request
import xml.etree.ElementTree as etree

# --- Пример файла конфигурации ---

defaults = {
    'cities': { # города в форме 'сокращенное имя города': 'полное имя'
        'nn': 'Нижний Новгород',
    },
    'cache': 'cache.json', # путь до файла кеша идентификаторов городов
    'groups': { # описания групп извлекаемых данных
        'group1': { # название группы присутствует в функции "замены значения"
            'items': { # описания переменных внутри группы
                'temp': [ # имя переменной участвует в функции "замены значения"
                    'nn', # сокращенное имя города
                    './/fact/temperature' # xpath в xml для значения
                ],
                'speed': ['nn', './/fact/wind_speed'],
                'direction': ['nn', './/fact/wind_direction'],
            },
            'base': '', # путь для создания файлов
            'files': { # расположение файлов относительно base
                'temp': [
                    '%s', # формат данных
                    ['temp'] # аргументы в формате
                ],
                'wind': ['%s м/с', ['speed']],
                'kompas': ['%s', ['direction']],
            }
        }
    }
}

# --- Функции замены значений ---
# Названия должны быть в виде: replace_%s_%s' % (group_name, item_name)

def replace_group1_direction(value):
    return {
        'w': 'западный'
    }.get(value, value)

# ------

config_fname = 'prefs.json' # путь к файлу конфигурации
url_cities = 'https://weather.yandex.ru/static/cities.xml'
url_weather = 'https://export.yandex.ru/weather-ng/forecasts/%s.xml'

def downloadETree(url):
    response = urllib.request.urlopen(url)
    text = response.read().decode('utf-8')
    text = re.sub(r'xmlns="[^"]*"', '', text)
    return etree.fromstring(text)

def getId(name):
    tree = downloadETree(url_cities)
    for city in tree.iterfind('.//city'):
        if city.text == name:
            return city.get('id')
    return None

def jsonload(fname, default):
    try:
        return json.load(open(fname))
    except:
        return default

def jsonsave(fname, context):
    text = json.dumps(context, ensure_ascii=False, indent=2)
    open(fname, 'w', encoding='utf-8').write(text)

def cachedId(name, fname):
    config = jsonload(fname, {})
    if name in config:
        return config[name]

    ident = getId(name)
    if not ident:
        return None

    config[name] = ident
    jsonsave(fname, config)
    return ident

def weatherByGroup(cities, key, group):
    def collectItems():
        for name, (city, xpath) in group['items'].items():
            func = 'replace_%s_%s' % (key, name)
            value = cities[city].find(xpath).text
            yield name, globals().get(func, lambda x: x)(value)
    items = dict(collectItems())

    for fname, (format, args) in group['files'].items():
        text = format % tuple((items[arg] for arg in args))
        open(os.path.join(group['base'], fname), 'w').write(text)

def execute(fname):
    config = jsonload(fname, None)
    if not config:
        jsonsave(fname, defaults)
        config = defaults

    cities = {}
    for city, name in config['cities'].items():
        ident = cachedId(name, config['cache'])
        if ident:
            cities[city] = downloadETree(url_weather % ident)
        else:
            print('Город "%s" не найден' % name)
            return False

    for key, group in config['groups'].items():
        weatherByGroup(cities, key, group)
    return True

if __name__ == '__main__':
    execute(config_fname)
anonymous
()
Ответ на: комментарий от anonymous

Я так и понял. Буду учить питон, неплохой код для понимания получается, имхо. И да, постройка DOM и вытаскивание из него значений разве быстрее регулярок?

Deleted
()

это что за ягодно-фруктовый микс второго питона и третьего? :) причём без указания, какой именно :)

odii
()
Ответ на: комментарий от Deleted

наглядней, плюс меньше зависит от изменения структуры документа (пробельные символы, переносы строк, порядок аргументов у элементов, одинаковые названия элементов в разных узлах DOM)

anonymous
()
Ответ на: комментарий от DeadEye

Да нет, спасибо) Я score наберу и сам исправлю. Кстати, судя по форуму ты разбирался с userChrome.css в firefox. Не подскажешь, как там сменить css вкладок? Вроде я в stylish-e указываю нужные свойства элементам. Половина работает, половина нет - например смена bg-цвета #urlbar работает, а смена его же border никак не влияет.

Deleted
()
Ответ на: комментарий от Deleted

Это зависит еще и от твоего элемента. Разрабы здорово запутали XUL в Firefox, поэтому нужно еще и внимательно осматривать все вложенные элементы. У меня urlbar сделан так:

#urlbar {
    border-radius: 0px !important;
    border-color: #a1a1a1 !important;
    background-color: #393939 !important;
    color: #fefefe !important;
    padding-top: 3px !important;
    padding-bottom: 3px !important;
    margin-top: 0px !important;
    margin-bottom: 0px !important;
    margin-left: 0.5px !important;
    margin-right: 0px !important;
    height: 29px !important;
    font-weight: bolder 100 !important;
    width: 100% !important;
}
И да, может быть нужна директива !important - она перезаписывает значение, если оно уже было задано.

DeadEye ★★★★★
()
Последнее исправление: DeadEye (всего исправлений: 1)
Ответ на: комментарий от DeadEye

Насчет !important в курсе, css знаю неплохо (верстал сайты). У меня (firefox 34) border-color из твоего примера не работает. Попробую разбираться, спасибо за конфиг) Верстаю темную темку, от лисы глаза текут.

Deleted
()
Ответ на: комментарий от DeadEye

P.S. С отключенным Classic Theme restorer все работает, видимо он important уже зарезервировал, ведь по второму разу он не сработает. Придется вручную australus выпиливать(

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.