Эң так аба ырайы: булут функциялары боюнча Telegram боту

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Аба ырайы тууралуу маалымат берүүчү кызматтар көп, бирок кайсынысына ишениш керек? Мен тез-тез велосипед тээп баштаганда мен тээп жүргөн жеримдеги аба ырайы тууралуу эң так маалыматка ээ болгум келди.

Менин биринчи оюмда сенсорлору бар кичинекей DIY метеостанциясын куруу жана андан маалыматтарды алуу болду. Бирок мен "дөңгөлөктү кайра ойлоп тапкан жокмун" жана тастыкталган маалыматтардын булагы катары жарандык авиацияда колдонулган аба ырайы тууралуу маалыматты тандадым, тактап айтканда METAR (Метеорологиялык аэродромдун отчету) жана иш (TAF - Терминал аэродромунун болжолу). Авиацияда жүздөгөн адамдардын жашоосу аба ырайынан көз каранды, ошондуктан божомолдор мүмкүн болушунча так.

Бул маалымат түрүндө ар бир заманбап аэродромдо үн аркылуу XNUMX/XNUMX берилет ATIS (Автоматтык терминалдык маалымат кызматы) жана VOLMET (француз тилинен. том - учуу жана погоды - аба ырайы). Биринчиси аэродромдогу иш жүзүндөгү аба ырайы тууралуу маалымат берет, экинчиси эфирдик аэродромдо гана эмес, башка аймактарда да кийинки 24-30 саатка болжолдоону берет.

Внуково аэропортунда ATIS ишинин мисалы:

Внуково аэропортунда VOLMET кантип иштегенине мисал

Тиешелүү диапазондо радио сканерди же трансиверди дайыма жаныңызда алып жүрүү ыңгайсыз жана мен Telegramда бир баскычты чыкылдатуу менен ошол эле прогнозду алууга мүмкүндүк берген бот түзгүм келди. Бул үчүн өзүнчө серверди бөлүү, ошондой эле үйүңүзгө Raspberry суроо-талаптарын жөнөтүү, жок эле дегенде, практикалык эмес.

Ошондуктан, мен кызматты backend катары колдонууну чечтим Булуттун өзгөчөлүктөрүн тандаңыз. Сурамдардын саны аз болот, ошондуктан мындай кызмат иш жүзүндө бекер болот (менин эсептөөлөрүм боюнча, 22 100 суроо-талап үчүн 000 рублди түзөт).

Backend даярдоо

Функцияны түзүү

Башкаруу панелинде my.selectel.ru көрүнүшүн ачуу булут платформа жана жаңы долбоор түзүү:

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Долбоор түзүлгөндөн кийин бөлүмгө өтүңүз милдеттери:

Эң так аба ырайы: булут функциялары боюнча Telegram боту
кнопкасын басканда ал Функция түзүү жана ага каалаган атын бериңиз:

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Баскандан кийин Функция түзүү биз түзүлгөн функциянын өкүлчүлүгүнө ээ болобуз:

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Pythonдо код түзүүнү баштоодон мурун Telegramда бот түзүшүңүз керек болот. Мен мунун кантип жасалганын сүрөттөбөйм - деталдуу көрсөтмөлөр бар биздин билим базабызда. Биз үчүн эң негизгиси – түзүлгөн боттун белгиси.

Код даярдалууда

Мен ишенимдүү маалымат булагы катары Улуттук океандык жана атмосфералык администрацияны (NOAA) тандадым. Бул илимий агенттик TXT форматында өзүнүн сервериндеги маалыматтарды реалдуу убакытта жаңыртып турат.

METAR маалыматтарын алуу үчүн шилтеме (ишке көңүл буруңуз):

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

Менин учурда эң жакын аэропорт Внуково, анын ИКАО коду UUWW. Түзүлгөн URL'ге өтүү төмөнкүлөрдү берет:

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

Биринчи сап - Гринвич убактысы боюнча болжолдоонун учурдагы убактысы. Экинчи сапта иш жүзүндөгү аба ырайынын корутундусу. Жарандык авиациянын учкучтары бул линия эмнени билдирерин түшүнүүдө эч кандай кыйынчылыктарга туш болушпайт, бирок бизге түшүндүрмө керек:

  • [UUWW] — Внуково, Москва (Россия — РУ);
  • [101130Z] — айдын 10-куну, GMT саат 11:30;
  • [31004MPS] — шамалдын багыты 310 градус, ылдамдыгы 4 м/с;
  • [9999] — горизонталдуу көрүнүш 10 км же андан ашык;
  • [SCT048] — 4800 футта (~1584м) чачылган/чачылган булуттар;
  • [24 / 13] — температура 24°С, шүүдүрүм температурасы 13°С;
  • [1014-черек] — басым (QNH) 1014 гектопаскаль (750 мм рт.ст.);
  • [R01/000070] — 01 тилкедеги адгезия коэффициенти — 0,70;
  • [NOSIG] - олуттуу өзгөрүүлөрсүз.

Программанын кодун жаза баштайлы. Биринчиден, сиз функцияларды импорттооңуз керек өтүнүч и pytaf:

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

Айрыкча саптарга көңүл буралы Погода и BECMG. ТЕМПО көрсөтүлгөн мезгилдеги аба ырайы мезгил-мезгили менен өзгөрүп тураарын билдирет. BECMG - аба ырайы белгиленген убакыт аралыгында акырындык менен өзгөрөт.

Башкача айтканда, сызык:

TEMPO 1012/1020 -TSRA BKN020CB

билдирет:

  • [1012 / 1020] — саат 12ден 20га чейин (Гринвич убактысы);
  • [-TSRA] — күн күркүрөшү (ТС = күн күркүрөө) менен жаан (РА = жамгыр) аз интенсивдүү (минус белгиси);
  • [BKN020CB] - деңиз деңгээлинен 2000 фут (610 метр) бийиктикте олуттуу (BKN = сынган), cumulonimbus (CB = cumulonimbus) булуттар.

Аба ырайынын кубулуштары үчүн терминдер абдан көп жана аларды эстеп калуу кыйын. TAF өтүнүчүнүн коду да ушундай жол менен жазылган.

Код булутка жүктөлүүдө

Убакытты текке кетирбөө үчүн биздин репозиторийден телеграмма бот үлгүсүн алалы булут-телеграмма-бот. Алдын ала даярдалган бар талаптар.txt и setup.py туура каталог түзүмү менен.

Коддо биз модулга киребиз pytaf, анда анын версиясы дароо кошулушу керек талаптар.txt

pytaf~=1.2.1

  • Келгиле, редакциялоону уланталы bot/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 боту

  • Файлдагы салыштырмалуу жолду толтуруңуз tele_bot (узартуу .py көрсөтүлбөшү мүмкүн) жана акыркы чекит функциясы (берилген мисалда бул негизги).
  • Бөлүмүндө Environment Variables өзгөрмө жазуу ТОКЕН жана ага каалаган телеграмма ботунун белгисин дайындаңыз.
  • басма сөз Сактоо жана кеңейтүү, андан кийин биз бөлүмгө барабыз Триггерлерди.
  • Биз которгуч койду HTTP сурамыөтүнүч жалпыга ачык болсун.

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Эми бизде функцияны ачык чакыруу үчүн URL бар. Болгону калды вебхукту конфигурациялоо. Биздин ботту табыңыз @SelectelServerless_bot Telegramда жана ботуңузду төмөнкү буйрук менен каттаңыз:

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

жыйынтык

Эгер баары туура аткарылса, сиздин ботуңуз дароо иштей баштайт жана аба ырайынын акыркы отчетун түздөн-түз мессенжерде көрсөтөт.

Эң так аба ырайы: булут функциялары боюнча Telegram боту
Албетте, кодду өркүндөтсө болот, бирок анын азыркы абалында да ишенимдүү булактан эң так аба ырайын жана божомолду билүү жетиштүү.

Сиз биздин коддун толук версиясын таба аласыз GitHubдагы репозиторийлер.

Эң так аба ырайы: булут функциялары боюнча Telegram боту

Source: www.habr.com

Комментарий кошуу