Најтачнија временска прогноза: бот за Телеграм на клауд функцијама

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Постоји много услуга које пружају информације о времену, али којој од њих треба веровати? Када сам почео често да возим бицикл, желео сам да имам што тачније информације о временским приликама у месту где возим.

Моја прва мисао била је да саставим малу „уради сам“ метеоролошку станицу са сензорима и примам податке од ње. Али нисам „измислио точак“ и одабрао информације о времену које се користе у цивилном ваздухопловству као извор проверених података, тј. МЕТАР (МЕТеоролошки извештај са аеродрома) и ТАФ (ТАФ - Терминал Аеродроме Форецаст). У ваздухопловству животи стотина људи зависе од времена, па су прогнозе што тачније.

Ова информација се емитује 24/7 гласом на сваком модерном аеродрому у форми АТИС (Информациона служба за аутоматске терминале) и ВОЛМЕТ (са француског. вол - лет и прогнозу - време). Први даје информације о стварном времену на аеродрому, а други даје прогнозу за наредних 24-30 сати, не само на аеродрому за емитовање, већ и на другим.

Пример рада АТИС-а на аеродрому Внуково:

Пример како ВОЛМЕТ ради на аеродрому Внуково

Незгодно је сваки пут са собом носити радио скенер или примопредајник за одговарајући домет, а ја сам желео да направим бота у Телеграму који ће вам једним кликом на дугме омогућити да добијете исту прогнозу. У најмању руку је непрактично издвојити посебан сервер за ово, као и слање захтева вашем кућном Распберри-у.

Стога сам одлучио да користим услугу као бацкенд Селецтел Цлоуд функције. Број захтева ће бити занемарљив, тако да ће таква услуга бити практично бесплатна (према мојим прорачунима, то ће бити 22 рубље за 100 захтева).

Бацкенд припрема

Креирање функције

У контролној табли ми.селецтел.ру отвори поглед Цлоуд платформа и креирајте нови пројекат:

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Након што је пројекат креиран, идите на одељак Функције:

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Притиснете дугме Креирајте функцију и дајте му жељено име:

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Након притиска Креирајте функцију имаћемо приказ креиране функције:

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Пре него што почнете да креирате код у Питхон-у, мораћете да направите бота у Телеграму. Нећу описивати како се то ради - постоје детаљна упутства у нашој бази знања. Главна ствар за нас је токен креираног бота.

Припрема кода

Одабрао сам Националну управу за океане и атмосферу (НОАА) као извор поузданих података. Ова научна агенција ажурира податке у реалном времену на свом серверу у ТКСТ формату.

Линк за добијање МЕТАР података (обратите пажњу на случај):

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

У мом случају, најближи аеродром је Внуково, његов ИЦАО код је УУВВ. Одлазак на генерисани УРЛ ће дати следеће:

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

Први ред је тренутно време прогнозе у средњем времену по Гриничу. Други ред је резиме стварног времена. Пилоти цивилног ваздухопловства неће имати проблема да схвате шта ова линија значи, али нам је потребно објашњење:

  • [УУВВ] — Внуково, Москва (Русија — РУ);
  • [101130З] — 10. дан у месецу, 11:30 ГМТ;
  • [31004МПС] — правац ветра 310 степени, брзина 4 м/с;
  • [КСНУМКС] — хоризонтална видљивост 10 км или више;
  • [СЦТ048] — разбацани/разбацани облаци на 4800 стопа (~1584м);
  • [КСНУМКС / КСНУМКС] — температура 24°Ц, тачка росе 13°Ц;
  • [К1014] — притисак (КНХ) 1014 хектопаскала (750 мм Хг);
  • [Р01/000070] — коефицијент адхезије на траци 01 — 0,70;
  • [НОСИГ] - без значајнијих промена.

Почнимо да пишемо програмски код. Прво морате да увезете функције захтева и питаф:

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()

Пређимо на ТАФ (случај је такође важан).

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 1012/1020 -TSRA BKN020CB

ће значити:

  • [КСНУМКС / КСНУМКС] — између 12 и 20 сати (средње време по Гриничу);
  • [-ТСРА] — грмљавина (ТС = грмљавина) са кишом (РА = киша) слабог интензитета (знак минус);
  • [БКН020ЦБ] - значајни (БКН = испрекидани), кумулонимбус (ЦБ = кумулонимбус) облаци на 2000 стопа (610 метара) изнад нивоа мора.

Постоји доста термина за временске појаве, а запамтити их је тешко. Код за ТАФ захтев је написан на сличан начин.

Отпремање кода у облак

Да не бисмо губили време, узмимо шаблон телеграм бота из нашег спремишта облак-телеграм-бот. Постоји унапред припремљена захтеве.ткт и сетуп.пи са правилном структуром именика.

Пошто ћемо у коду приступати модулу питаф, онда треба одмах додати његову верзију захтеве.ткт

pytaf~=1.2.1

  • Пређимо на уређивање бот/теле_бот.пи. Уклањамо све непотребне ствари и додајемо наш код.

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)

  • Пакујемо цео директоријум у ЗИП архиву и идемо на контролни панел до креиране функције.
  • Притисни Уреди и преузмите архиву са кодом.

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама

  • Попуните релативну путању у датотеци теле_бот (продужетак .пи можда није наведено) и функцију крајње тачке (у датом примеру ово је главни).
  • У секцији Променљиве окружења написати променљиву ТОКЕН и доделите му токен жељеног телеграм бота.
  • Притисни Сачувај и прошири, након чега идемо на одељак Окидачи.
  • Ставили смо прекидач ХТТП захтевда се захтев учини јавним.

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Сада имамо УРЛ за јавно позивање функције. Све што је остало је конфигуришите вебхоок. Пронађите нашег бота @СелецтелСерверлесс_бот у Телеграму и региструјте свог бота командом:

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

Резултат

Ако је све урађено како треба, ваш бот ће одмах почети са радом и приказати најновији извештај о времену у ваздухопловству директно у месинџеру.

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама
Наравно, код се може побољшати, али чак иу његовом тренутном стању довољно је сазнати најтачније време и прогнозу из поузданог извора.

Наћи ћете пуну верзију кода у нашој спремишта на ГитХуб-у.

Најтачнија временска прогноза: бот за Телеграм на клауд функцијама

Извор: ввв.хабр.цом

Додај коментар