Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Ob-havo ma'lumotlarini taqdim etadigan ko'plab xizmatlar mavjud, ammo qaysi biriga ishonish kerak? Men tez-tez velosiped haydashni boshlaganimda, men minadigan joydagi ob-havo sharoiti haqida eng aniq ma'lumotga ega bo'lishni xohlardim.

Mening birinchi fikrim sensorlar bilan kichik DIY ob-havo stantsiyasini qurish va undan ma'lumot olish edi. Ammo men "g'ildirakni qayta ixtiro qilmadim" va tasdiqlangan ma'lumotlar manbai sifatida fuqaro aviatsiyasida ishlatiladigan ob-havo ma'lumotlarini tanladim. METAR (METeorologik aerodrom hisoboti) va Ansora (TAF - Terminal aerodrom prognozi). Aviatsiyada yuzlab odamlarning hayoti ob-havoga bog'liq, shuning uchun prognozlar imkon qadar aniq.

Ushbu ma'lumot har bir zamonaviy aerodromda XNUMX/XNUMX shaklda ovozli uzatiladi ATIS (Avtomatik terminal ma'lumotlar xizmati) va VOLMET (frantsuz tilidan. vol - parvoz va météo - ob-havo). Birinchisi aerodromdagi haqiqiy ob-havo haqida ma'lumot beradi, ikkinchisi esa nafaqat translyatsiya aerodromida, balki boshqa joylarda ham keyingi 24-30 soatlik prognozni taqdim etadi.

Vnukovo aeroportida ATIS ishlashiga misol:

Vnukovo aeroportida VOLMET qanday ishlashiga misol

Tegishli diapazon uchun har safar o‘zingiz bilan radio skaner yoki qabul qiluvchi uzatgichni olib yurish noqulay va men Telegramda bir tugmani bosish orqali bir xil prognozni olish imkonini beruvchi bot yaratmoqchi edim. Buning uchun alohida server ajratish, shuningdek, uyingizga Raspberry so'rovlarini yuborish hech bo'lmaganda amaliy emas.

Shuning uchun men xizmatdan backend sifatida foydalanishga qaror qildim Bulutli xususiyatlarni tanlang. So'rovlar soni ahamiyatsiz bo'ladi, shuning uchun bunday xizmat deyarli bepul bo'ladi (mening hisob-kitoblarimga ko'ra, 22 100 so'rov uchun 000 rubl bo'ladi).

Orqa tomonni tayyorlash

Funktsiya yarating

Boshqaruv panelida my.selectel.ru ko'rinishni oching Bulutli platforma va yangi loyiha yarating:

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Loyiha yaratilgandan so'ng, bo'limga o'ting Vazifalar:

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Tugmani bosing Funktsiya yarating va unga kerakli nomni bering:

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Bosgandan keyin Funktsiya yarating Biz yaratilgan funksiyaning tasviriga ega bo'lamiz:

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Python-da kod yaratishni boshlashdan oldin Telegram-da bot yaratishingiz kerak bo'ladi. Bu qanday amalga oshirilganligini tasvirlamayman - batafsil ko'rsatmalar mavjud bilim bazamizda. Biz uchun asosiy narsa yaratilgan botning tokenidir.

Kod tayyorlanmoqda

Men ishonchli ma'lumotlar manbai sifatida Okean va Atmosfera tadqiqotlari milliy boshqarmasini (NOAA) tanladim. Ushbu ilmiy agentlik real vaqt rejimida o'z serveridagi ma'lumotlarni TXT formatida yangilaydi.

METAR ma'lumotlarini olish uchun havola (holatga e'tibor bering):

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

Mening holatimda, eng yaqin aeroport - Vnukovo, uning ICAO kodi UUWW. Yaratilgan URL manziliga o'tish quyidagilarni beradi:

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

Birinchi qator Grinvich vaqti bo'yicha prognozning joriy vaqti. Ikkinchi qator - haqiqiy ob-havoning qisqacha mazmuni. Fuqaro aviatsiyasining uchuvchilari bu chiziq nimani anglatishini tushunishda muammoga duch kelmaydilar, ammo bizga tushuntirish kerak:

  • [UUWW] — Vnukovo, Moskva (Rossiya — RU);
  • [101130Z] — oyning 10-kuni, GMT soat 11:30;
  • [31004MPS] — shamol yoʻnalishi 310 daraja, tezligi 4 m/s;
  • [9999] — gorizontal koʻrinish 10 km va undan ortiq;
  • [SCT048] — 4800 futda (~1584m) tarqoq/tarqoq bulutlar;
  • [24 / 13] — harorat 24°C, shudring nuqtasi 13°C;
  • [Q1014] — bosim (QNH) 1014 gektopaskal (750 mm Hg);
  • [R01/000070] — 01-yo‘lda yopishish koeffitsienti — 0,70;
  • [NOSIG] - sezilarli o'zgarishlarsiz.

Keling, dastur kodini yozishni boshlaylik. Avval siz funktsiyalarni import qilishingiz kerak so'rov и pytaf:

from urllib import request
import pytaf

O'zgaruvchilarni belgilang va dekodlash funktsiyasini tayyorlang:

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

Keling, TAFga o'tamiz (holda ham muhim).

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

Oldingi misolda bo'lgani kabi, Vnukovo aeroportidagi prognozni ko'rib chiqaylik:

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

Keling, ayniqsa, chiziqlarga e'tibor qarataylik TEMPO и BECMG. TEMPO ko'rsatilgan davrdagi haqiqiy ob-havo vaqti-vaqti bilan o'zgarib turishini anglatadi. BECMG - belgilangan vaqt ichida ob-havo asta-sekin o'zgaradi.

Ya'ni qator:

TEMPO 1012/1020 -TSRA BKN020CB

Bu degani:

  • [1012 / 1020] — 12 dan 20 soatgacha (Grinvich vaqti);
  • [-TSRA] — momaqaldiroq (TS = momaqaldiroq) yomg'ir bilan (RA = yomg'ir) past intensivlikdagi (minus belgisi);
  • [BKN020CB] - dengiz sathidan 2000 fut (610 metr) balandlikda muhim (BKN = singan), cumulonimbus (CB = cumulonimbus) bulutlari.

Ob-havo hodisalari uchun juda ko'p atamalar mavjud va ularni eslab qolish qiyin. TAF so'rovining kodi shunga o'xshash tarzda yozilgan.

Kod bulutga yuklanmoqda

Vaqtni behuda o'tkazmaslik uchun, keling, omborimizdan telegram bot shablonini olaylik bulut-telegram-bot. Oldindan tayyorlangan narsa bor talablar.txt и setup.py to'g'ri katalog tuzilishi bilan.

Kodda biz modulga kiramiz pytaf, keyin uning versiyasi darhol qo'shilishi kerak talablar.txt

pytaf~=1.2.1

  • Keling, tahrirlashga o'tamiz bot/tele_bot.py. Biz barcha keraksiz narsalarni olib tashlaymiz va kodimizni qo'shamiz.

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)

  • Biz butun katalogni ZIP arxiviga joylashtiramiz va yaratilgan funktsiyaga boshqaruv paneliga o'tamiz.
  • Bu yerni bosing Tahrirlash va arxivni kod bilan yuklab oling.

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot

  • Fayldagi nisbiy yo'lni to'ldiring tele_bot (kengaytma .py ko'rsatilmagan bo'lishi mumkin) va so'nggi nuqta funktsiyasi (berilgan misolda bu asosiy).
  • bo'lim Atrof-muhit o'zgaruvchilari o'zgaruvchini yozing TOKEN va unga kerakli telegram bot tokenini tayinlang.
  • Bu yerni bosing Saqlash va kengaytirish, shundan so'ng biz bo'limga o'tamiz Triggerlar.
  • Biz kalitni o'rnatamiz HTTP so'roviso'rovni ommaviy qilish uchun.

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Endi funksiyani ochiq chaqirish uchun bizda URL manzil mavjud. Hammasi qolgan webhookni sozlang. Bizning botimizni toping @SelectelServerless_bot Telegram-da va botingizni quyidagi buyruq bilan ro'yxatdan o'tkazing:

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

natija

Agar hamma narsa to'g'ri bajarilgan bo'lsa, sizning botingiz darhol ishlay boshlaydi va aviatsiya ob-havosi haqidagi so'nggi hisobotni bevosita messenjerda ko'rsatadi.

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot
Albatta, kodni yaxshilash mumkin, ammo hozirgi holatda ham ishonchli manbadan eng aniq ob-havo va prognozni bilish kifoya.

Kodning to'liq versiyasini bizning sahifamizda topasiz GitHub-dagi omborlar.

Eng aniq ob-havo prognozi: bulut funksiyalarida Telegram uchun bot

Manba: www.habr.com

a Izoh qo'shish