En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Hava durumu bilgisi sağlayan pek çok hizmet var ama hangisine güvenmelisiniz? Sık sık bisiklet sürmeye başladığımda bisiklet sürdüğüm yerdeki hava koşulları hakkında en doğru bilgiye sahip olmak istedim.

İlk düşüncem, sensörlü küçük bir DIY hava durumu istasyonu kurmak ve ondan veri almaktı. Ancak ben “tekerleği yeniden icat etmedim” ve doğrulanmış veri kaynağı olarak sivil havacılıkta kullanılan hava durumu bilgisini seçtim. METAR (METeorolojik Havaalanı Raporu) ve TSK (TAF - Terminal Havaalanı Tahmini). Havacılıkta yüzlerce insanın hayatı hava durumuna bağlıdır, dolayısıyla tahminler mümkün olduğu kadar doğrudur.

Bu bilgiler her modern havaalanında XNUMX/XNUMX sesli olarak yayınlanmaktadır. ATIS (Otomatik Terminal Bilgi Servisi) ve VOLMET (Fransızca'dan. cilt - uçuş ve météo - hava durumu). Birincisi, havaalanındaki gerçek hava durumu hakkında bilgi sağlarken, ikincisi, yalnızca yayın yapılan havaalanında değil, diğerlerinde de önümüzdeki 24-30 saat için tahmin sağlıyor.

Vnukovo Havalimanı'ndaki ATIS operasyonu örneği:

VOLMET'in Vnukovo Havalimanı'nda nasıl çalıştığına bir örnek

İlgili aralık için her zaman yanınızda bir radyo tarayıcısı veya alıcı-verici taşımak sakıncalıdır ve Telegram'da, bir düğmeye tıklayarak aynı tahmini almanızı sağlayan bir bot oluşturmak istedim. Bunun için ayrı bir sunucu tahsis etmenin yanı sıra evinize Raspberry'e istek göndermek en azından pratik değildir.

Bu nedenle hizmeti arka uç olarak kullanmaya karar verdim Selectel Bulut Özellikleri. İsteklerin sayısı ihmal edilebilir düzeyde olacak, dolayısıyla böyle bir hizmet neredeyse ücretsiz olacak (hesaplamalarıma göre 22 istek için 100 ruble olacak).

Arka uç hazırlığı

Fonksiyon Yaratmak

kontrol panelinde my.selectel.ru görünümü aç Bulut platformu ve yeni bir proje oluşturun:

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Proje oluşturulduktan sonra bölüme gidin fonksiyonlar:

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Butona bas Bir işlev oluştur ve ona istediğiniz adı verin:

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
bastıktan sonra Bir işlev oluştur oluşturulan fonksiyonun bir temsiline sahip olacağız:

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Python'da kod oluşturmaya başlamadan önce Telegram'da bir bot oluşturmanız gerekecektir. Bunun nasıl yapıldığını açıklamayacağım - ayrıntılı talimatlar var bilgi tabanımızda. Bizim için asıl önemli olan, oluşturulan botun jetonudur.

Kodun hazırlanması

Güvenilir veri kaynağı olarak Ulusal Okyanus ve Atmosfer İdaresi'ni (NOAA) seçtim. Bu bilimsel kurum, sunucusundaki verileri TXT formatında gerçek zamanlı olarak günceller.

METAR verilerini alma bağlantısı (duruma dikkat edin):

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

Benim durumumda en yakın havaalanı Vnukovo, ICAO kodu UUWW. Oluşturulan URL'ye gitmek aşağıdakileri verecektir:

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

İlk satır, Greenwich Ortalama Saatine göre tahminin geçerli saatidir. İkinci satır gerçek hava durumunun bir özetidir. Sivil havacılık pilotları bu cümlenin ne anlama geldiğini anlamakta zorluk çekmeyecekler ancak bir açıklamaya ihtiyacımız var:

  • [UUWW] — Vnukovo, Moskova (Rusya — RU);
  • [101130Z] — Ayın 10'uncu günü, 11:30 GMT;
  • [31004MPS] — rüzgar yönü 310 derece, hız 4 m/s;
  • [9999] - yatay görüş 10 km veya daha fazla;
  • [SCT048] — 4800 feet'te (~1584 m) dağınık/dağınık bulutlar;
  • [24 / 13] — sıcaklık 24°C, çiğ noktası 13°C;
  • [S1014] — basınç (QNH) 1014 hektopaskal (750 mm Hg);
  • [R01/000070] - şerit 01 - 0,70'e yapışma katsayısı;
  • [NOSİG] - önemli değişiklikler olmadan.

Program kodunu yazmaya başlayalım. İlk önce işlevleri içe aktarmanız gerekir talep и pytaf:

from urllib import request
import pytaf

Değişkenleri belirtin ve kod çözme işlevini 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()

Gelelim TAF'a (durum da önemli).

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

Önceki örnekte olduğu gibi Vnukovo havaalanındaki hava tahminine bakalım:

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

Özellikle çizgilere dikkat edelim ZAMAN и BECMG. TEMPO, belirtilen dönemdeki gerçek hava durumunun periyodik olarak değişeceği anlamına gelir. BECMG - hava durumu belirli bir süre içinde kademeli olarak değişecektir.

Yani satır:

TEMPO 1012/1020 -TSRA BKN020CB

Şu anlama gelecektir:

  • [1012 / 1020] — 12 ila 20 saat arasında (Greenwich Ortalama Saati);
  • [-TSRA] — düşük yoğunlukta (eksi işareti) yağmurlu (RA = yağmur) gök gürültülü sağanak yağış (TS = fırtına);
  • [BKN020CB] - deniz seviyesinden 2000 feet (610 metre) yükseklikte önemli (BKN = kırık), kümülonimbus (CB = kümülonimbus) bulutları.

Hava olayları için oldukça fazla terim vardır ve bunları hatırlamak zordur. TAF talebinin kodu da benzer şekilde yazılmıştır.

Kodu buluta yükleme

Zaman kaybetmemek için depomuzdan bir telgraf bot şablonu alalım bulut-telegram-botu. Önceden hazırlanmış bir gereksinimler.txt и kurulum.py doğru dizin yapısına sahip.

Kodda modüle erişeceğimiz için pytaf, sürümü hemen eklenmelidir gereksinimler.txt

pytaf~=1.2.1

  • Hadi düzenlemeye geçelim bot/tele_bot.py. Gereksiz tüm şeyleri kaldırıp kodumuzu ekliyoruz.

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)

  • Dizinin tamamını bir ZIP arşivine paketliyoruz ve kontrol paneline oluşturulan işleve gidiyoruz.
  • Tıklayın Düzenle ve arşivi kodla birlikte indirin.

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot

  • Dosyadaki ilgili yolu doldurun tele_bot (eklenti .py belirtilmeyebilir) ve bir uç nokta işlevi (verilen örnekte bu ana).
  • Bölümünde Ortam Değişkenleri bir değişken yaz JETONU ve ona istediğiniz telgraf botunun jetonunu atayın.
  • Tıklayın Kaydet ve Genişlet, ardından bölüme gidiyoruz tetikleyiciler.
  • Anahtarı koyduk HTTP isteğiTalebin kamuya duyurulması.

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Artık işlevi herkese açık olarak çağırmak için bir URL'miz var. Geriye kalan tek şey web kancasını yapılandır. Botumuzu bulun @SelectelServerless_bot Telegram'da ve botunuzu şu komutla kaydedin:

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

sonuç

Her şey doğru yapılırsa, botunuz hemen çalışmaya başlayacak ve en son havacılık hava durumu raporunu doğrudan messenger'da görüntüleyecektir.

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot
Elbette kod geliştirilebilir, ancak mevcut durumunda bile güvenilir bir kaynaktan en doğru hava durumunu ve tahmini öğrenmek yeterlidir.

Kodun tam sürümünü sitemizde bulabilirsiniz. GitHub'daki depolar.

En doğru hava durumu tahmini: bulut işlevlerinde Telegram için bot

Kaynak: habr.com

Yorum ekle