תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
יש הרבה שירותים המספקים מידע על מזג האוויר, אבל על איזה מהם כדאי לסמוך? כשהתחלתי לרכוב תכופות, רציתי לקבל את המידע המדויק ביותר על תנאי מזג האוויר במקום בו אני רוכב.

המחשבה הראשונה שלי הייתה לבנות תחנת מזג אוויר קטנה עשה זאת בעצמך עם חיישנים ולקבל ממנה נתונים. אבל לא "המצאתי את הגלגל מחדש" ובחרתי במידע מזג אוויר שמשמש בתעופה אזרחית כמקור לנתונים מאומתים, כלומר מטר (דוח תעופה מטאורולוגי) ו TAF (TAF - תחזית תעופה מסוף). בתעופה, חייהם של מאות אנשים תלויים במזג האוויר, ולכן התחזיות מדויקות ככל האפשר.

מידע זה משודר XNUMX/XNUMX בקול בכל שדה תעופה מודרני בטופס אטיס (שירות מסוף אוטומטי) ו VOLMET (מצרפתית. כרך - טיסה ו מטאורולוגי - מזג אוויר). הראשון מספק מידע על מזג האוויר בפועל בשדה התעופה, והשני מספק תחזית ל-24-30 השעות הבאות, לא רק בשדה השידור, אלא גם באחרים.

דוגמה לתפעול ATIS בנמל התעופה ונוקובו:

דוגמה לאופן שבו פועלת VOLMET בנמל התעופה ונוקובו

זה לא נוח לשאת איתך סורק רדיו או מקלט משדר בכל פעם לטווח המתאים, ורציתי ליצור בוט בטלגרם שבלחיצת כפתור מאפשר לך לקבל את אותה תחזית. זה לפחות לא מעשי להקצות שרת נפרד לכך, כמו גם שליחת בקשות לביתכם פטל.

לכן, החלטתי להשתמש בשירות כ-backend בחר תכונות ענן. מספר הבקשות יהיה זניח, כך ששירות כזה יהיה כמעט בחינם (לפי החישובים שלי, זה יהיה 22 רובל עבור 100 בקשות).

הכנה עורפית

צור פונקציה

בלוח הבקרה my.selectel.ru לפתוח את הנוף פלטפורמת ענן וליצור פרויקט חדש:

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
לאחר יצירת הפרויקט, עבור אל הקטע פונקציות:

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
לחץ על הכפתור צור פונקציה ותן לו את השם הרצוי:

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
לאחר לחיצה צור פונקציה יהיה לנו ייצוג של הפונקציה שנוצרה:

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
לפני שתתחיל ליצור קוד ב- Python, תצטרך ליצור בוט בטלגרם. אני לא אתאר איך זה נעשה - יש הוראות מפורטות במאגר הידע שלנו. העיקר עבורנו הוא האסימון של הבוט שנוצר.

הכנת הקוד

בחרתי ב-National Oceanic and Atmospheric Administration (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 GMT;
  • [31004MPS] - כיוון הרוח 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

כמו בדוגמה הקודמת, בואו נסתכל על התחזית בנמל התעופה של ונוקובו:

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 = שבור), cumulonimbus (CB = cumulonimbus) בגובה 2000 רגל (610 מטר) מעל פני הים.

יש די הרבה מונחים לתופעות מזג אוויר, וקשה לזכור אותם. הקוד לבקשת TAF כתוב בצורה דומה.

העלאת קוד לענן

כדי לא לבזבז זמן, בואו ניקח תבנית בוט של טלגרם מהמאגר שלנו ענן-טלגרם-בוט. יש מוכן מראש דרישות. טקסט и setup.py עם מבנה הספריות הנכון.

מכיוון שבקוד אנחנו ניגשים למודול פיתף, אז יש להוסיף מיד את הגרסה שלו דרישות. טקסט

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 לקריאה פומבית לפונקציה. כל מה שנשאר זה להגדיר webhook. מצא את הבוט שלנו @SelectelServerless_bot בטלגרם ורשום את הבוט שלך עם הפקודה:

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

תוצאה

אם הכל נעשה כהלכה, הבוט שלך יתחיל מיד לעבוד ויציג את דוח מזג האוויר העדכני ביותר של תעופה ישירות במסנג'ר.

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן
כמובן שניתן לשפר את הקוד, אבל גם במצבו הנוכחי מספיק לברר את מזג האוויר והתחזית המדויקים ביותר ממקור מהימן.

אתה תמצא את הגרסה המלאה של הקוד אצלנו מאגרים ב- GitHub.

תחזית מזג האוויר המדויקת ביותר: בוט לטלגרם על פונקציות ענן

מקור: www.habr.com