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

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

Мојата прва мисла беше да изградам мала метеоролошка станица со сензори и да примам податоци од неа. Но, јас не го „измислив тркалото“ и ги избрав информациите за времето што се користат во цивилната авијација како извор на проверени податоци, имено МЕТАР (Извештај за метеоролошки аеродром) и Ли (TAF - Terminal Aerodrome Forecast). Во авијацијата, животите на стотици луѓе зависат од временските услови, така што прогнозите се што е можно попрецизни.

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

Пример за операција ATIS на аеродромот Внуково:

Пример како функционира VOLMET на аеродромот Внуково

Незгодно е да носите радио скенер или примопредавател со себе секој пат за соодветниот опсег и сакав да создадам бот во Telegram кој, со кликнување на копче, ви овозможува да ја добиете истата прогноза. Најмалку е непрактично да одвоите посебен сервер за ова, како и да испраќате барања до вашиот дом Raspberry.

Затоа, решив да ја користам услугата како заднина Selectel Cloud карактеристики. Бројот на барања ќе биде занемарлив, така што таквата услуга ќе биде практично бесплатна (според моите пресметки, ќе биде 22 рубли за 100 барања).

Подготовка на задниот дел

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

Во контролната табла 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

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

  • [UUWW] — Внуково, Москва (Русија — РУ);
  • [101130Z] — 10-ти ден во месецот, 11:30 часот по Гринич;
  • [31004 MPS] — насока на ветерот 310 степени, брзина 4 m/s;
  • [9999] — хоризонтална видливост 10 km или повеќе;
  • [SCT048] — расфрлани/расфрлени облаци на 4800 стапки (~1584 m);
  • [24 / 13] — температура 24°C, точка на росење 13°C;
  • [Q1014] — притисок (QNH) 1014 хектопаскали (750 mm Hg);
  • [R01/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()

Да преминеме на 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. ТЕМПО значи дека вистинското време во наведениот период периодично ќе се менува. БЕЦМГ - времето во одреден временски период постепено ќе се менува.

Тоа е, линијата:

TEMPO 1012/1020 -TSRA BKN020CB

Ќе значи:

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

Има доста термини за временски феномени, а нивното сеќавање е тешко. Шифрата за барањето TAF е напишана на сличен начин.

Се поставува код на облакот

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

Бидејќи во кодот ќе пристапиме до модулот питаф, тогаш неговата верзија треба веднаш да се додаде во барања.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 може да не се специфицира) и функција на крајна точка (во дадениот пример ова е Главната).
  • Во делот Променливи на животната средина напишете променлива ТОКЕН и доделете му го токенот на саканиот бот за телеграма.
  • Кликни тука Зачувај и прошири, по што одиме во делот Предизвикувачи.
  • Го ставаме прекинувачот HTTP барањебарањето да биде јавно.

Најточна временска прогноза: бот за Telegram на функциите на облакот
Сега имаме URL за јавно повикување на функцијата. Останува само конфигурирајте ја веб-кука. Најдете го нашиот бот @SelectelServerless_bot во Telegram и регистрирајте го вашиот бот со командата:

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

Резултира

Ако сè е направено правилно, вашиот бот веднаш ќе почне да работи и ќе го прикаже најновиот извештај за временската состојба директно во месинџерот.

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

Целосната верзија на кодот ќе ја најдете во нашата складишта на GitHub.

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

Извор: www.habr.com