LINUX.ORG.RU
ФорумTalks

Посоветуйте погодный сервис

 , ,


0

1

Лучше rss

Что-то гисметео, который верой и правдой служил несколько лет, вот уже неделю выдает вместо xml пустую строку

http://informer.gismeteo.ru/rss/27612.xml

А до wttr.in не достучаться без квн:

Не работает:

$ get-ip | sel city, region

city   region
----   ------
Khimki Moscow Oblast

Работает, например Латвия:

$ get-ip | sel city, region

city region
---- ------
Riga Riga

$ wth -s                   

Moscow: ☀️ -15°C S 753mmHg
★★★★★

Нужен обязательно xml? там же на гисметео на html страницах есть все данные в json (начинаются с «M.state = {»).

yandrey ★★
()

Я на мобиле пользуюсь софтиной OSS Weather, там такие провайдеры используются:

  • Meteo France

  • OpenWeather

  • Open-Meteo

Bfgeshka ★★★★★
()

до wttr.in не достучаться без квн

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

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

Json тоже подойдет, если его не надо выдергивать из html

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

OpenWeather не доступен, а вот Open-Meteo вроде то, что надо, буду пробовать.

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

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

Может подобрать другой запрос? У меня:

wttr.in/Krasnogorsk?format=j1

Сейчас попробовал просто wttr.in, вроде отработал

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

Странно, почему не работало, был какой-то нереальный таймаут, поменял на format=j2 и все отлично. Только почему через впн работает и format=j1, хз.

dmitry237 ★★★★★
() автор топика

Пользуюсь яндексовским, поскольку многократные проверки показали, что их данные лучше всего соответствуют наблюдаемым за окном, да ещё и не просто по городу, а по району (для Москвы актуально например). Но требует регистрации с получением apikey. Что, впрочем, тривиально.

apikey="xxxxxx"
lat="xxxxx"
lon="xxxxx"
curl \
    -X GET \
    -H 'Access-Control-Allow-Origin: *' \
    -H "X-Yandex-API-Key: $apikey" \
    "$APIURL?lat=$lat&lon=$lon&lang=en_US"

В качестве «бэкапа» на случай отзыва ключа или ещё какой фигни использую wttr.in.

А до wttr.in не достучаться без квн:

Это новые реалии, которые надо воспринимать просто как данность. «квн» — часть полноценного доступа в интернет.

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

Вопрос был не как, а зачем. Более менее достоверную текущую погоду можно брать непосредственно с metar метеостанций или более удобных посредников.

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

Что, впрочем, тривиально.

Там наверное требуется яндексовская почта или что-то еще от яндекса? Какая-нибудь регистрация.

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

Вроде да, почта.

Вообще, если подумать, то не факт, что мой опыт актуален. Я регал кучу адресов на яндексе, когда это не требовало вообще никакого другого фактора — тупо 40 секунд, и почтовый ящик у тебя, то есть, ни телефона, ни другой почты, ничего не требовалось. И вроде этого было тогда достаточно и для получения ключа для погоды. Сейчас вроде бы и почту так на-отвали фиг зарегаешь, десяток штук за день точно проблематично.

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

Вроде разобрался с wttr.in, было бы неплохо и с gismeteo.ru, просто под эти два сервиса написан скрипт с функциями под каждый из них, который нормально работал. Подожду еще месяц, а потом буду пробовать то, что посоветовали. Или забью. Погода в консоли, это не что-то прям важное.

dmitry237 ★★★★★
() автор топика

openweathermap + свой api-key + свой скрипт в куда надо.

u@errcode:/# cat getweather.netbook
#!/bin/sh

# API-key для OpenWeatherMap
gw_key='XXXXXXXXXXXXXXXXXXXXXXXXX'

# Код города по-умолчанию
gw_cid='XXXXXXX'

# Язык
gw_lang="ru"

# Значки параметра
gw_celsius_icon='°'
gw_sunrise_icon=''
gw_sunset_icon=''
gw_wind_icon=''
gw_press_icon=''

# Значки статуса
gw_stat_thund_icon=''
gw_stat_drizzle_icon=''
gw_stat_rain_icon=''
gw_stat_snow_icon=''
gw_stat_mist_icon=''
gw_stat_clear_icon=''
gw_stat_clouds_icon=''
gw_stat_bug_icon=''

# Создаём временный файл
gw_basename="$(basename $0)"
# для json-данных
gw_temp="$(mktemp /tmp/${gw_basename}.XXXXXXX)"

gw_json_cmd="jq -r"

# Если в первом параметре не указан
# код города, то используем по-умолчанию
[ $1 ] && gw_cid="${1}"

# Возвращаем при ошибке загрузки json-данных
gw_err_msg() {
    printf "Ошибка получения информации о погоде"
    exit 1
}

# Количество попыток получения json-файла
gw_try_number="5"
# Получаем файл в формате json
until [ "$gw_try_number" -eq "0" ] ; do
    fetch -qo ${gw_temp} "http://api.openweathermap.org/data/2.5/weather?id=${gw_cid}&lang=${gw_lang}&units=metric&APPID=${gw_key}" \
    > /dev/null 2> /dev/null && break
    gw_try_number="$((${gw_try_number} - 1))"
done

# Если кол-во попыток превышено, выходим с ошибкой
[ "$gw_try_number" -le "0" ] && gw_err_msg

# Запрашиваем нужные параметры из файла
gw_param_name="$(${gw_json_cmd} .name ${gw_temp})"
gw_param_temp="$(${gw_json_cmd} .main.temp ${gw_temp})"
gw_param_main="$(${gw_json_cmd} ".weather[0] .description" ${gw_temp})"
gw_param_wind_speed="$(${gw_json_cmd} .wind.speed ${gw_temp})"
gw_param_wind_deg="$(${gw_json_cmd} .wind.deg ${gw_temp})"
gw_param_press="$(${gw_json_cmd} .main.pressure ${gw_temp})"
gw_param_sunrise="$(${gw_json_cmd} .sys.sunrise ${gw_temp})"
gw_param_sunset="$(${gw_json_cmd} .sys.sunset ${gw_temp})"
gw_param_stat="$(${gw_json_cmd} .weather[0].id ${gw_temp})"

# Преобразуем время восхода и заката из UNIX-time в обычный
gw_sunrise="`date -r ${gw_param_sunrise} +%H:%M`"
gw_sunset="`date -r ${gw_param_sunset} +%H:%M`"

# Округляем направление ветра до целых
gw_param_wind_deg="`echo ${gw_param_wind_deg}/1 | bc`"
# Переводим из градусов в направление
if [ "$gw_param_wind_deg" -ge "12" -a "$gw_param_wind_deg" -le "33" ] ; then
    gw_param_wind_deg="ССВ"
elif [ "$gw_param_wind_deg" -ge "34" -a "$gw_param_wind_deg" -le "56" ] ; then
    gw_param_wind_deg="СВ"
elif [ "$gw_param_wind_deg" -ge "57" -a "$gw_param_wind_deg" -le "78" ] ; then
    gw_param_wind_deg="ВСВ"
elif [ "$gw_param_wind_deg" -ge "79" -a "$gw_param_wind_deg" -le "101" ] ; then
    gw_param_wind_deg="В"
elif [ "$gw_param_wind_deg" -ge "102" -a "$gw_param_wind_deg" -le "123" ] ; then
    gw_param_wind_deg="ВЮВ"
elif [ "$gw_param_wind_deg" -ge "124" -a "$gw_param_wind_deg" -le "146" ] ; then
    gw_param_wind_deg="ЮВ"
elif [ "$gw_param_wind_deg" -ge "147" -a "$gw_param_wind_deg" -le "168" ] ; then
    gw_param_wind_deg="ЮЮВ"
elif [ "$gw_param_wind_deg" -ge "169" -a "$gw_param_wind_deg" -le "191" ] ; then
    gw_param_wind_deg="Ю"
elif [ "$gw_param_wind_deg" -ge "192" -a "$gw_param_wind_deg" -le "213" ] ; then
    gw_param_wind_deg="ЮЮЗ"
elif [ "$gw_param_wind_deg" -ge "214" -a "$gw_param_wind_deg" -le "236" ] ; then
    gw_param_wind_deg="ЮЗ"
elif [ "$gw_param_wind_deg" -ge "237" -a "$gw_param_wind_deg" -le "258" ] ; then
    gw_param_wind_deg="ЗЮЗ"
elif [ "$gw_param_wind_deg" -ge "259" -a "$gw_param_wind_deg" -le "281" ] ; then
    gw_param_wind_deg="З"
elif [ "$gw_param_wind_deg" -ge "282" -a "$gw_param_wind_deg" -le "303" ] ; then
    gw_param_wind_deg="ЗСЗ"
elif [ "$gw_param_wind_deg" -ge "304" -a "$gw_param_wind_deg" -le "326" ] ; then
    gw_param_wind_deg="СЗ"
elif [ "$gw_param_wind_deg" -ge "327" -a "$gw_param_wind_deg" -le "348" ] ; then
    gw_param_wind_deg="ССЗ"
elif [ "$gw_param_wind_deg" -ge "349" -a "$gw_param_wind_deg" -le "360" ] ; then
    gw_param_wind_deg="С"
elif [ "$gw_param_wind_deg" -ge "0" -a "$gw_param_wind_deg" -le "11" ] ; then
    gw_param_wind_deg="С"
else
    gw_param_wind_deg="???"
fi
# Получаем код погоды и возвращаем значок
if [ "$gw_param_stat" -ge "200" -a "$gw_param_stat" -le "232" ] ; then
        gw_stat_icon="${gw_stat_thund_icon}"
elif [ "$gw_param_stat" -ge "300" -a "$gw_param_stat" -le "321" ] ; then
        gw_stat_icon="${gw_stat_drizzle_icon}"
elif [ "$gw_param_stat" -ge "500" -a "$gw_param_stat" -le "531" ] ; then
        gw_stat_icon="${gw_stat_rain_icon}"
elif [ "$gw_param_stat" -ge "600" -a "$gw_param_stat" -le "622" ] ; then
        gw_stat_icon="${gw_stat_snow_icon}"
elif [ "$gw_param_stat" -ge "701" -a "$gw_param_stat" -le "781" ] ; then
        gw_stat_icon="${gw_stat_mist_icon}"
elif [ "$gw_param_stat" -eq "800" ] ; then
        gw_stat_icon="${gw_stat_clear_icon}"
elif [ "$gw_param_stat" -ge "801" -a  "$gw_param_stat" -le "804" ] ; then
        gw_stat_icon="${gw_stat_clouds_icon}"
else
        gw_stat_icon="${gw_stat_bug_icon}"
fi

# Пересчитываем давление в мм ртутного столба и округляем до целых
gw_param_press="`echo "${gw_param_press} * 0.750064 / 1" | bc`"

[ "$gw_param_sunrise" -ne "$gw_param_sunset" ] && \
gw_sunstat="${gw_sunrise_icon}${gw_sunrise} ${gw_sunset_icon}${gw_sunset}"

#printf '%s' "${gw_stat_icon} ${gw_param_temp}${gw_celsius_icon} ${gw_param_main} ${gw_wind_icon} ${gw_param_wind_deg} \
#${gw_param_wind_speed}м/с ${gw_press_icon} ${gw_param_press}мм ${gw_sunstat}"

printf '%s' "${gw_stat_icon} ${gw_param_temp}${gw_celsius_icon} ${gw_wind_icon} \
${gw_param_wind_speed} ${gw_param_wind_deg} ${gw_press_icon}${gw_param_press} ${gw_sunstat}"

# Удаляем временные файлы
rm -f ${gw_temp}

Использую для polybar.

// Из внешнего нужен jq и шрифт iconpack (awesome?).

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

У меня скрипт попроще, для каждого сервиса своя функция, wttr и gismeteo соответственно, без ключа:

#!/usr/bin/env -S pwsh -noprofile

param ( [switch] $short )


function gismeteo
{
    $url = "http://informer.gismeteo.ru/rss/27612.xml"

      Try { $data = Invoke-RestMethod $url -ErrorAction "Stop" }
    Catch { return "`e[91m error:`e[0m Service is unavailable" }

    if ([string]::IsNullOrEmpty($data)) { return "`e[91m error:`e[0m No data" }

    $result =
    foreach ($d in $data)
    {
        $x = $d.description -split ',\s'
        [array]::Reverse($x)

        $velo, $wind, $press, $temp, $cond = $x 

        [pscustomobject] @{
                  Время = $d.title.Split()[1]
              Состояние = $cond
            Температура = $temp -replace '[^-\d\.]'
               Давление = $press -replace '^\D+|\D+$'
                  Ветер = $wind.Split()[1]
               Скорость = [int] $velo.Split()[0]
        }
    }

    Write-Host
    Get-Date -Format 'ddd dd.MM.yyyy, HH:mm'
    $result | Format-Table Время, Состояние,
                           @{ expression = "Температура"; align = 'right'},
                           Давление, Ветер, Скорость
}


function wttr
{
    $clear = 226,152,128,239,184,143
    $fewClouds = 226,155,133,239,184,143
    $partlyCloudy = 240,159,140,164
    $cloudy = 226,152,129,239,184,143
    $lightRain = 240,159,140,166,239,184,143
    $rain = 240,159,140,167
    $thunderstorm = 226,155,136,239,184,143
    $snow = 240,159,140,168,239,184,143,239,184,143
    $fog = 240,159,140,171,239,184,143,239,184,143,239,184,143
    $freezeRain = 240,159,167,138


    Try   { $json = Invoke-RestMethod "https://wttr.in/Krasnogorsk?format=j2" -ConnectionTimeoutSeconds 15 -ErrorAction "Stop" }
    Catch { return  "`e[91merror: `e[0mService is unavailable" }


    $condCode = $json.current_condition.weatherCode
    $condText = $json.current_condition.weatherDesc.Value
    $temp = $json.current_condition.temp_C
    $windDirection = $json.current_condition.winddir16Point
    $pressure = [int]($json.current_condition.pressure) / 1.35951


    $icon =
    switch ($condCode)
    {
                                     113    { [text.encoding]::UTF8.GetString($clear) }
                                     116    { [text.encoding]::UTF8.GetString($partlyCloudy) }
                        { $_ -in 119,122 }  { [text.encoding]::UTF8.GetString($cloudy) }
                    { $_ -in 260,311,326 }  { [text.encoding]::UTF8.GetString($freezeRain) }
                { $_ -in 143,248,266,280 }  { [text.encoding]::UTF8.GetString($fog) }
                { $_ -in 176,293,296,353 }  { [text.encoding]::UTF8.GetString($lightRain) }
        { $_ -in 230,323,332,338,368,371 }  { [text.encoding]::UTF8.GetString($snow) }
                                   default  { $condCode + ": " + $condText }
    }

    "`nMoscow: {0}  {1}°C {2} {3}mmHg`n" -f $icon, $temp, $windDirection, [int] $pressure
}


if (-not $short) { gismeteo }
else { wttr }
dmitry237 ★★★★★
() автор топика
Ответ на: комментарий от CrX

Сейчас пробный период:

Тестовый тариф на 7 дней. Карта не требуется

А потом наверное потребуется карта.

UPD:

Начало работы

Чтобы начать пользоваться API Яндекс Погоды:

  1. Ознакомьтесь с тарифами доступа к API.
  2. Перейдите в Кабинет разработчика и зарегистрируйтесь.
  3. Выберите API Погодных Данных и создайте новый ключ, либо воспользуйтесь демо-ключом.
  4. При отправке запросов к API добавляйте значение полученного ключа в заголовок X-Yandex-Weather-Key: <значение ключа>.

Если что-то пошло не так, используйте форму обратной связи.

Самый простой тариф 54000 в месяц. Не такого не надо

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

Что-то гисметео, который верой и правдой служил несколько лет, вот уже неделю выдает вместо xml пустую строку

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

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

имхо стоит починить то каким образом вы сгребаете от него

Я им написал отзыв, надеюсь починят. Никакой документации не нашел, только старую, но в ней как раз то, чем и пользовался.

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

Можно попробовать хардкорный вариант в виде снифите трафик от того же гейфона и парсите, что он отсылает.

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

Да и фиг с ними. Они еще и зашифруют, с них станется.

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

Самый простой тариф 54000 в месяц

Как тебе такое, Илон Маск, да? :)

Думаю, что у тебя такое же лицо было, как и у меня, когда тариф увидел

bryak ★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)