Най-точната прогноза за времето: бот за Telegram на облачни функции

Най-точната прогноза за времето: бот за Telegram на облачни функции
Има много услуги, които предоставят информация за времето, но на коя да се доверим? Когато започнах да карам често колело, исках да имам най-точна информация за метеорологичните условия на мястото, където карам.

Първата ми мисъл беше да сглобя малка DIY метеорологична станция със сензори и да получавам данни от нея. Но аз не „преоткрих колелото“ и избрах информацията за времето, която се използва в гражданската авиация като източник на проверени данни, а именно METAR (METeorological Aerodrome Report) и TAF (TAF - Прогноза за терминално летище). В авиацията животът на стотици хора зависи от времето, така че прогнозите са максимално точни.

Тази информация се излъчва денонощно с глас на всяко модерно летище във формата АТИС (Автоматична терминална информационна услуга) и VOLMET (от френски том - полет и Meteo - метеорологично време). Първият предоставя информация за действителното време на летището, а вторият - прогнозата за следващите 24-30 часа, не само на летището за излъчване, но и на други.

Пример за работа на ATIS на летище Внуково:

Пример за работа на VOLMET на летище Внуково

Всеки път е неудобно да носите радиоскенер или приемо-предавател със себе си до съответния диапазон и исках да създам бот в Telegram, който с натискане на бутон ви позволява да получите същата прогноза. Отделянето на отделен сървър за това е най-малкото нецелесъобразно, както и изпращането на заявки до домашната Raspberry.

Затова като бекенд реших да използвам услугата Selectel облачни функции. Броят на заявките ще бъде незначителен, така че такава услуга всъщност ще струва безплатно (според моите изчисления ще бъде 22 рубли за 100 000 заявки).

Подготовка на бекенда

Създайте функция

В контролния панел my.selectel.ru отворен изглед облачна платформа и създайте нов проект:

Най-точната прогноза за времето: бот за Telegram на облачни функции
След като проектът е създаден, отидете в раздела функции:

Най-точната прогноза за времето: бот за Telegram на облачни функции
Натиснете бутона Създайте функция и му дайте желаното име:

Най-точната прогноза за времето: бот за Telegram на облачни функции
След натискане Създайте функция ще имаме представяне на създадената функция:

Най-точната прогноза за времето: бот за Telegram на облачни функции
Преди да започнете да създавате код на Python, трябва да създадете бот в Telegram. Няма да описвам как се прави - има подробни инструкции в нашата база от знания. Основното за нас е токенът на създадения бот.

Код за готвене

Избрах Националната администрация за океаните и атмосферата (NOAA) като източник на надеждни данни. Тази научна агенция актуализира данните в реално време на своя сървър във формат TXT.

Връзка за получаване на METAR данни (обърнете внимание на регистъра):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT

В моя случай най-близкото летище е Внуково, кодът му е ICAO UUWW. Навигирането до генерирания URL ще доведе до следното:

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

Първият ред е GMT ​​времето за релевантност на прогнозата. Вторият ред е обобщение на действителното време. Пилотите на гражданската авиация няма да имат проблем да разберат какво означава този ред, но имаме нужда от препис:

  • [UUWW] — Внуково, Москва (Русия — RU);
  • [101130Z] — 10-ти ден от месеца, 11:30 GMT;
  • [31004MPS] — посока на вятъра 310 градуса, скорост 4 m/s;
  • [9999] — хоризонтална видимост от 10 km или повече;
  • [SCT048] — разпръснати/разпръснати облаци на 4800 фута (~1584 м);
  • [24 / 13] — температура 24°C, точка на оросяване 13°C;
  • [Q1014] - налягане (QNH) 1014 хектопаскала (750 mm Hg);
  • [R01/000070] — коефициент на сцепление на лента 01 — 0,70;
  • [NOSIG] - без съществени промени.

Да започнем да пишем код. Първо трябва да импортирате функциите поиска и питаф:

from urllib import request
import pytaf

Посочете променливи и подгответе функцията за декодиране:

URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"

def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()

Нека да преминем към TAF (кейсът също е важен).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT

Както в предишния пример, нека видим прогнозата на летище Внуково:

2020/08/10 12:21
TAF UUWW 101050Z 1012/1112 28003G10MPS 9999 SCT030 TX25/1012Z TN15/1103Z 
      TEMPO 1012/1020 -TSRA BKN020CB 
      BECMG 1020/1021 FEW007 BKN016 
      TEMPO 1021/1106 -SHRA BKN020CB PROB40 
      TEMPO 1021/1106 -TSRA BKN020CB 
      BECMG 1101/1103 34006G13MPS

Обърнете специално внимание на линиите TEMPO и BECMG. TEMPO означава, че действителното време през определения период ще се променя периодично. BECMG - времето постепенно ще се променя през посочения интервал от време.

Това е линията:

TEMPO 1012/1020 -TSRA BKN020CB

Ще означава:

  • [1012 / 1020] - в периода от 12 до 20 часа (средно време по Гринуич);
  • [-TSRA] — гръмотевична буря (TS = гръмотевична буря) с дъжд (RA = дъжд) с ниска интензивност (знак минус);
  • [BKN020CB] - значителна (BKN = разкъсана), купесто-дъждовна (CB = купесто-дъждовна) облачност на надморска височина от 2000 фута (610 метра).

Има много термини, които означават метеорологични явления, и е трудно да ги запомните. Кодът за TAF заявка е написан по подобен начин.

Качване на код в облака

За да не губим време, нека вземем шаблон за телеграма бот от нашето хранилище облачен телеграм-бот. Има предварително подготвен изисквания.txt и setup.py с правилната структура на директорията.

Тъй като в кода ще се позоваваме на модула питаф, то неговата версия трябва незабавно да се добави към изисквания.txt

pytaf~=1.2.1

  • Да преминем към редактирането бот/tele_bot.py. Премахваме всичко ненужно и добавяме нашия код.

import os
from urllib import request
import telebot
import pytaf
 
TOKEN = os.environ.get('TOKEN')
URL_METAR = "https://tgftp.nws.noaa.gov/data/observations/metar/stations/UUWW.TXT"
URL_TAF = "https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/UUWW.TXT"
 
bot = telebot.TeleBot(token=TOKEN, threaded=False)
keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.row('/start', '/get_metar', '/get_taf')
 
def start(message):
    msg = "Привет. Это бот для получения авиационного прогноза погоды " 
          "с серверов NOAA. Бот настроен на аэропорт Внуково (UUWW)."
    bot.send_message(message.chat.id, msg, reply_markup=keyboard)
 
def parse_data(code):
    code = code.split('n')[1]
    return pytaf.Decoder(pytaf.TAF(code)).decode_taf()
 
def get_metar(message):
    # Fetch info from server.
    code = request.urlopen(URL_METAR).read().decode('utf-8')
    # Send formatted answer.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def get_taf(message):
    # Fetch info from server.
    code = request.urlopen(URL_TAF).read().decode('utf-8')
    # Send formatted answer.
    bot.send_message(message.chat.id, parse_data(code), reply_markup=keyboard)
 
def route_command(command, message):
    """
    Commands router.
    """
    if command == '/start':
        return start(message)
    elif command == '/get_metar':
        return get_metar(message)
    elif command == '/get_taf':
        return get_taf(message)
 
def main(**kwargs):
    """
    Serverless environment entry point.
    """
    print(f'Received: "{kwargs}"')
    message = telebot.types.Update.de_json(kwargs)
    message = message.message or message.edited_message
    if message and message.text and message.text[0] == '/':
        print(f'Echo on "{message.text}"')
        route_command(message.text.lower(), message)

  • Пакетираме цялата директория в ZIP архив и отиваме в контролния панел до създадената функция.
  • тласък редактирам и изтеглете архива с кода.

Най-точната прогноза за времето: бот за Telegram на облачни функции

  • Попълнете относителния път във файла теле_бот (разширение .py може да се пропусне) и функция за крайна точка (в горния пример това основен).
  • В раздел Променливи на средата напишете променлива ЛЕКСЕМА и му задайте токена на желания телеграм бот.
  • тласък Запазване и разширяване, след което отидете в секцията тригери.
  • Поставяме превключвателя HTTP заявкада направи заявката публична.

Най-точната прогноза за времето: бот за Telegram на облачни функции
Имаме URL за извикване на публична функция. Всичко, което остава е настройте уеб кукичка. Намерете нашия бот @SelectelServerless_bot в Telegram и регистрирайте вашия бот с командата:

/setwebhook <you bot token> <public URL of your function>

Резултат

Ако всичко е направено правилно, вашият бот веднага ще започне да работи и ще покаже текущия авиационен метеорологичен доклад директно в месинджъра.

Най-точната прогноза за времето: бот за Telegram на облачни функции
Разбира се, кодът може да бъде подобрен, но дори и в сегашното си състояние е достатъчен, за да разберете най-точното време и прогноза от доверен източник.

Можете да намерите пълната версия на кода в нашия хранилища в GitHub.

Най-точната прогноза за времето: бот за Telegram на облачни функции

Източник: www.habr.com

Добавяне на нов коментар