Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Hava haqqında məlumat verən bir çox xidmət var, amma hansına etibar etmək lazımdır? Tez-tez velosiped sürməyə başlayanda, sürdüyüm yerdəki hava şəraiti haqqında ən dəqiq məlumata sahib olmaq istəyirdim.

İlk fikrim sensorlarla kiçik bir DIY hava stansiyası yığmaq və ondan məlumat almaq idi. Ancaq mən "təkəri yenidən ixtira etmədim" və təsdiqlənmiş məlumat mənbəyi kimi mülki aviasiyada istifadə olunan hava məlumatlarını seçdim, yəni METAR (METeoroloji Aerodrom Hesabatı) və TSK (TAF - Terminal Aerodrom Proqnozu). Aviasiyada yüzlərlə insanın həyatı hava şəraitindən asılıdır, ona görə də proqnozlar mümkün qədər dəqiqdir.

Bu məlumat formada hər bir müasir aerodromda səslə gecə-gündüz yayımlanır ATİS (Avtomatik Terminal Məlumat Xidməti) və VOLMET (fransız dilindən vol - uçuş və Météo - hava). Birincisi, aerodromdakı faktiki hava haqqında məlumat verir, ikincisi - yalnız yayım aerodromunda deyil, digərlərində də növbəti 24-30 saat üçün proqnoz.

Vnukovo hava limanında ATIS-in işinə bir nümunə:

Vnukovo hava limanında VOLMET əməliyyatının nümunəsi

Hər dəfə radio skaner və ya qəbuledicini özünüzlə uyğun diapazona aparmaq əlverişsiz olur və mən Telegram-da bir düyməyə basmaqla eyni proqnozu əldə etməyə imkan verən bot yaratmaq istədim. Bunun üçün ayrıca bir server ayırmaq ən azı məqsədəuyğun deyil, həm də ev Raspberry-ə sorğu göndərmək.

Buna görə də, bir backend olaraq, xidmətdən istifadə etmək qərarına gəldim Bulud funksiyalarını seçin. Sorğuların sayı əhəmiyyətsiz olacaq, buna görə də belə bir xidmət praktiki olaraq pulsuz olacaq (hesablamalarıma görə, 22 sorğu üçün 100 rubl olacaq).

Arxa uçun hazırlanması

Funksiya yaradın

İdarəetmə panelində my.selectel.ru açıq görünüş Bulud platforması və yeni layihə yaradın:

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Layihə yaradıldıqdan sonra bölməyə keçin Funksiyalar:

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Düyməni basın Funksiya yaradın və istədiyiniz adı verin:

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Basdıqdan sonra Funksiya yaradın yaradılmış funksiyanın təqdimatına sahib olacağıq:

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Python-da kod yaratmağa başlamazdan əvvəl Telegram-da bot yaratmalısınız. Bunun necə edildiyini təsvir etməyəcəyəm - ətraflı təlimatlar var bilik bazamızda. Bizim üçün əsas şey yaradılan botun əlamətidir.

Kodun hazırlanması

Mən etibarlı məlumat mənbəyi kimi Milli Okean və Atmosfer Administrasiyasını (NOAA) seçdim. Bu elmi agentlik öz serverindəki məlumatları real vaxt rejimində TXT formatında yeniləyir.

METAR məlumatlarını əldə etmək üçün keçid (reestri qeyd edin):

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

Mənim vəziyyətimdə ən yaxın hava limanı Vnukovodur, onun ICAO kodudur UUWW. Yaradılmış URL-ə keçid aşağıdakıları yaradacaq:

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

Birinci sətir proqnozun aktuallığının GMT vaxtıdır. İkinci sətir faktiki havanın xülasəsidir. Mülki aviasiya pilotlarının bu xəttin nə demək olduğunu anlamaqda heç bir problemi olmayacaq, lakin bizə transkript lazımdır:

  • [UUWW] — Vnukovo, Moskva (Rusiya — RU);
  • [101130Z] — ayın 10-cu günü, GMT 11:30;
  • [31004MPS] — küləyin istiqaməti 310 dərəcə, sürəti 4 m/s;
  • [9999] — üfüqi görünürlük 10 km və ya daha çox;
  • [SCT048] — 4800 futda (~1584m) səpələnmiş/səpələnmiş buludlar;
  • [24 / 13] — temperatur 24°C, şeh nöqtəsi 13°C;
  • [Q1014] - təzyiq (QNH) 1014 hektopaskal (750 mm Hg);
  • [R01/000070] — zolaqda yapışma əmsalı 01 — 0,70;
  • [NOSIG] - əhəmiyyətli dəyişikliklər olmadan.

Kodu yazmağa başlayaq. Əvvəlcə funksiyaları idxal etməlisiniz xahiş и pytaf:

from urllib import request
import pytaf

Dəyişənləri təyin edin və dekodlaşdırma funksiyasını hazırlayın:

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-a keçək (iş də vacibdir).

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

Əvvəlki nümunədə olduğu kimi, Vnukovo hava limanında proqnoza baxaq:

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

Xətlərə xüsusi diqqət yetirin TEMPO и BECMG. TEMPO o deməkdir ki, göstərilən dövrdə faktiki hava vaxtaşırı dəyişəcək. BECMG - müəyyən edilmiş vaxt intervalında hava tədricən dəyişəcək.

Bu xətt:

TEMPO 1012/1020 -TSRA BKN020CB

Demək olar:

  • [1012 / 1020] - 12 saatdan 20 saata qədər (Qrinviç vaxtı);
  • [-TSRA] — aşağı intensivliyə malik yağışla (RA = yağış) ildırım (TS = tufan) (mənfi işarə);
  • [BKN020CB] - dəniz səviyyəsindən 2000 fut (610 metr) yüksəklikdə əhəmiyyətli (BKN = qırıq), cumulonimbus (CB = cumulonimbus) bulud örtüyü.

Hava hadisələrini ifadə edən çoxlu terminlər var və onları yadda saxlamaq çətindir. TSK sorğusunun kodu da oxşar şəkildə yazılır.

Buluda kodu yükləyin

Vaxt itirməmək üçün anbarımızdan teleqram bot şablonunu götürək bulud-teleqram-bot. Əvvəlcədən hazırlanmış var tələblər.txt и quraşdırma.py düzgün kataloq strukturu ilə.

Kodda modula müraciət edəcəyik pytaf, onda onun versiyası dərhal əlavə edilməlidir tələblər.txt

pytaf~=1.2.1

  • Gəlin redaktəyə keçək bot/tele_bot.py. Bütün lazımsızları çıxarırıq və kodumuzu əlavə edirik.

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)

  • Bütün kataloqu ZIP arxivinə yığırıq və yaradılan funksiyaya idarəetmə panelinə keçirik.
  • Push Редактировать və arxivi kodla yükləyin.

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot

  • Faylda nisbi yolu doldurun tele_bot (uzatma .py buraxıla bilər) və son nöqtə funksiyası (yuxarıdakı misalda bu Elanlar ).
  • Bölmədə Ətraf mühit dəyişənləri dəyişən yazın Nişan və ona istədiyiniz teleqram botunun işarəsini təyin edin.
  • Push Saxla və genişləndir, sonra bölməyə keçin tetikler.
  • Anahtarı qoyduq HTTP sorğususorğunu ictimailəşdirmək.

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Bizdə ictimai funksiya çağırışı üçün URL var. Qalan hər şey webhook qurun. Bizim botu tapın @SelectelServerless_bot Telegram-da və botunuzu əmrlə qeydiyyatdan keçirin:

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

Nəticə

Hər şey düzgün aparılırsa, botunuz dərhal işə başlayacaq və cari aviasiya havası hesabatını birbaşa messencerdə göstərəcək.

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot
Əlbəttə ki, kodu təkmilləşdirmək olar, lakin indiki vəziyyətdə belə etibarlı mənbədən ən dəqiq hava və proqnozu öyrənmək kifayətdir.

Kodun tam versiyasını bizim saytda tapa bilərsiniz GitHub-da depolar.

Ən dəqiq hava proqnozu: bulud funksiyalarında Telegram üçün bot

Mənbə: www.habr.com

Добавить комментарий