دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
خدمات زیادی وجود دارد که اطلاعات آب و هوا را ارائه می دهند، اما به کدام یک باید اعتماد کنید؟ زمانی که به طور مکرر دوچرخه سواری را شروع کردم، می خواستم دقیق ترین اطلاعات را در مورد شرایط آب و هوایی مکانی که در آن دوچرخه سواری می کنم داشته باشم.

اولین فکر من ساختن یک ایستگاه هواشناسی کوچک با حسگرها و دریافت اطلاعات از آن بود. اما من "چرخ را دوباره اختراع نکردم" و اطلاعات آب و هوا را که در هوانوردی غیرنظامی استفاده می شود به عنوان منبع داده های تایید شده انتخاب کردم. METAR (گزارش هواشناسی فرودگاه) و TAF (TAF - پیش بینی ترمینال فرودگاه). در هوانوردی، زندگی صدها نفر به آب و هوا بستگی دارد، بنابراین پیش بینی ها تا حد امکان دقیق هستند.

این اطلاعات به صورت XNUMX ساعته به صورت صوتی در هر فرودگاه مدرن به صورت صوتی پخش می شود ATIS (سرویس اطلاعات ترمینال خودکار) و VOLMET (از فرانسوی. حجم - پرواز و MÉTÉO - آب و هوا). اولی اطلاعاتی در مورد آب و هوای واقعی در فرودگاه ارائه می دهد و دومی پیش بینی 24-30 ساعت آینده را نه تنها در فرودگاه پخش، بلکه در سایر فرودگاه ها نیز ارائه می دهد.

نمونه ای از عملیات ATIS در فرودگاه Vnukovo:

نمونه ای از نحوه کار VOLMET در فرودگاه Vnukovo

حمل یک اسکنر یا فرستنده رادیویی هر بار برای محدوده مربوطه با خود ناخوشایند است، و من می‌خواستم یک ربات در تلگرام ایجاد کنم که با کلیک یک دکمه به شما امکان می‌دهد همان پیش‌بینی را دریافت کنید. اختصاص یک سرور جداگانه برای این کار و همچنین ارسال درخواست به رزبری خانگی شما حداقل غیرعملی است.

بنابراین، تصمیم گرفتم از این سرویس به عنوان پشتیبان استفاده کنم ویژگی های Selectel Cloud. تعداد درخواست ها ناچیز خواهد بود، بنابراین چنین خدماتی تقریبا رایگان خواهد بود (طبق محاسبات من، 22 روبل برای 100 درخواست خواهد بود).

آماده سازی Backend

یک تابع ایجاد کنید

در کنترل پنل my.selectel.ru دید را باز کنید پلت فرم ابری و یک پروژه جدید ایجاد کنید:

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
پس از ایجاد پروژه، به بخش بروید توابع:

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
دکمه را فشار دهید یک تابع ایجاد کنید و نام مورد نظر را به آن بدهید:

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
پس از فشار دادن یک تابع ایجاد کنید ما یک نمایش از تابع ایجاد شده خواهیم داشت:

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
قبل از شروع ایجاد کد در پایتون، باید یک ربات در تلگرام ایجاد کنید. من توضیح نمی دهم که چگونه این کار انجام می شود - دستورالعمل های دقیقی وجود دارد در پایگاه دانش ما. نکته اصلی برای ما نشانه ربات ایجاد شده است.

در حال آماده کردن کد

من اداره ملی اقیانوسی و جوی (NOAA) را به عنوان منبع داده های قابل اعتماد انتخاب کردم. این آژانس علمی داده ها را در زمان واقعی بر روی سرور خود با فرمت TXT به روز می کند.

پیوند برای دریافت داده های METAR (به مورد توجه کنید):

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

در مورد من، نزدیکترین فرودگاه Vnukovo است، کد ICAO آن است UUWW. با رفتن به URL تولید شده موارد زیر را نشان می دهد:

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

خط اول زمان فعلی پیش بینی به وقت گرینویچ است. خط دوم خلاصه ای از آب و هوای واقعی است. خلبانان هوانوردی غیرنظامی در درک معنای این خط مشکلی نخواهند داشت، اما ما نیاز به توضیح داریم:

  • [UUWW] - Vnukovo، مسکو (روسیه - RU)؛
  • [101130Z] - دهمین روز ماه، ساعت 10:11 صبح به وقت گرینویچ؛
  • [31004MPPS] - جهت باد 310 درجه، سرعت 4 متر بر ثانیه؛
  • [9999] - دید افقی 10 کیلومتر یا بیشتر؛
  • [SCT048] - ابرهای پراکنده/پراکنده در 4800 فوت (~1584 متر)؛
  • [24 / 13] - درجه حرارت 24 درجه سانتیگراد، نقطه شبنم 13 درجه سانتیگراد؛
  • [Q1014] - فشار (QNH) 1014 هکتوپاسکال (750 میلی متر جیوه)؛
  • [R01/000070] - ضریب چسبندگی در خط 01 - 0,70.
  • [NOSIG] - بدون تغییرات قابل توجه

بیایید شروع به نوشتن کد برنامه کنیم. ابتدا باید توابع را وارد کنید درخواست и پیتاف:

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

مانند مثال قبلی، بیایید به پیش بینی فرودگاه Vnukovo نگاه کنیم:

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 به این معنی است که آب و هوای واقعی در طول دوره مشخص شده به صورت دوره ای تغییر می کند. BECMG - آب و هوا به تدریج در یک دوره زمانی مشخص تغییر می کند.

یعنی خط:

TEMPO 1012/1020 -TSRA BKN020CB

به این معنی خواهد بود:

  • [1012 / 1020] - بین 12 تا 20 ساعت (میانگین زمان گرینویچ)؛
  • [-TSRA] - رعد و برق (TS = رعد و برق) همراه با باران (RA = باران) با شدت کم (علامت منفی).
  • [BKN020CB] - ابرهای قابل توجه (BKN = شکسته)، کومولونیمبوس (CB = کومولونیمبوس) در 2000 فوت (610 متر) بالاتر از سطح دریا.

اصطلاحات بسیار زیادی برای پدیده های آب و هوایی وجود دارد و به خاطر سپردن آنها دشوار است. کد درخواست TAF به روشی مشابه نوشته شده است.

در حال آپلود کد در فضای ابری

برای اینکه زمان را تلف نکنیم، بیایید یک قالب ربات تلگرام را از مخزن خود برداریم ابر-تلگرام-ربات. از قبل آماده شده وجود دارد مورد نیاز .txt и setup.py با ساختار دایرکتوری صحیح

از آنجایی که در کد ما به ماژول دسترسی خواهیم داشت پیتاف، سپس نسخه آن باید بلافاصله به آن اضافه شود مورد نیاز .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 بسته بندی می کنیم و به کنترل پنل تابع ایجاد شده می رویم.
  • فشار ویرایش کنید و آرشیو را با کد دانلود کنید.

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری

  • مسیر نسبی را در فایل پر کنید tele_bot (افزونه .py ممکن است مشخص نباشد) و یک تابع نقطه پایانی (در مثال ارائه شده این است اصلی).
  • در بخش متغیرهای محیطی یک متغیر بنویس توکن و توکن ربات تلگرام مورد نظر را به آن اختصاص دهید.
  • فشار ذخیره و گسترش دهید، پس از آن به بخش می رویم راه اندازی.
  • سوئیچ را گذاشتیم درخواست HTTPبرای عمومی کردن درخواست

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
اکنون یک URL برای فراخوانی عمومی تابع داریم. تنها چیزی که باقی می ماند این است پیکربندی وب هوک. ربات ما را پیدا کنید @SelectelServerless_bot در تلگرام ربات خود را با دستور زیر ثبت کنید:

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

نتیجه

اگر همه چیز به درستی انجام شود، ربات شما بلافاصله شروع به کار می کند و آخرین گزارش آب و هوای هوانوردی را مستقیماً در پیام رسان نمایش می دهد.

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری
البته، کد را می توان بهبود بخشید، اما حتی در وضعیت فعلی کافی است که دقیق ترین آب و هوا و پیش بینی را از یک منبع قابل اعتماد دریافت کنید.

نسخه کامل کد را در ما پیدا خواهید کرد مخازن در GitHub.

دقیق ترین پیش بینی آب و هوا: ربات تلگرام در توابع ابری

منبع: www.habr.com

اضافه کردن نظر