Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Υπάρχουν πολλές υπηρεσίες που παρέχουν πληροφορίες για τον καιρό, αλλά ποια πρέπει να εμπιστευτείτε; Όταν άρχισα να κάνω συχνά ποδήλατο, ήθελα να έχω τις πιο ακριβείς πληροφορίες για τις καιρικές συνθήκες στο μέρος όπου κάνω ποδήλατο.

Η πρώτη μου σκέψη ήταν να φτιάξω έναν μικρό μετεωρολογικό σταθμό με αισθητήρες και να λάβω δεδομένα από αυτόν. Αλλά δεν «επινόησα ξανά τον τροχό» και επέλεξα τις πληροφορίες καιρού που χρησιμοποιούνται στην πολιτική αεροπορία ως πηγή επαληθευμένων δεδομένων, δηλαδή METAR (Έκθεση Μετεωρολογικού Αεροδρομίου) και TAF (TAF - Terminal Aerodrome Forecast). Στην αεροπορία, οι ζωές εκατοντάδων ανθρώπων εξαρτώνται από τον καιρό, επομένως οι προβλέψεις είναι όσο το δυνατόν ακριβέστερες.

Αυτές οι πληροφορίες μεταδίδονται XNUMX/XNUMX φωνητικά σε κάθε σύγχρονο αεροδρόμιο στη φόρμα ATIS (Αυτόματη Υπηρεσία Πληροφοριών Τερματικού) και VOLMET (από τα γαλλικά. vol - πτήση και MÉTÉO - καιρός). Το πρώτο παρέχει πληροφορίες για τον πραγματικό καιρό στο αεροδρόμιο και το δεύτερο παρέχει μια πρόγνωση για τις επόμενες 24-30 ώρες, όχι μόνο στο αεροδρόμιο μετάδοσης, αλλά και σε άλλα.

Παράδειγμα λειτουργίας ATIS στο αεροδρόμιο Vnukovo:

Ένα παράδειγμα του πώς λειτουργεί το VOLMET στο αεροδρόμιο Vnukovo

Δεν είναι βολικό να έχετε μαζί σας έναν ραδιοσαρωτή ή πομποδέκτη κάθε φορά για το αντίστοιχο εύρος και ήθελα να δημιουργήσω ένα bot στο Telegram που, με το πάτημα ενός κουμπιού, σας επιτρέπει να λαμβάνετε την ίδια πρόβλεψη. Δεν είναι τουλάχιστον πρακτικό να διαθέσετε έναν ξεχωριστό διακομιστή για αυτό, καθώς και να στείλετε αιτήματα στο σπίτι σας Raspberry.

Ως εκ τούτου, αποφάσισα να χρησιμοποιήσω την υπηρεσία ως backend Επιλογές Cloud. Ο αριθμός των αιτημάτων θα είναι αμελητέος, επομένως μια τέτοια υπηρεσία θα είναι σχεδόν δωρεάν (σύμφωνα με τους υπολογισμούς μου, θα είναι 22 ρούβλια για 100 αιτήματα).

Προετοιμασία backend

Δημιουργία Συνάρτησης

Στον Πίνακα Ελέγχου my.selectel.ru ανοίξτε τη θέα πλατφόρμα cloud και δημιουργήστε ένα νέο έργο:

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Αφού δημιουργηθεί το έργο, μεταβείτε στην ενότητα Λειτουργίες:

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Πιέστε το πλήκτρο Δημιουργήστε μια συνάρτηση και δώστε του το επιθυμητό όνομα:

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Αφού κάνετε κλικ Δημιουργήστε μια συνάρτηση θα έχουμε μια αναπαράσταση της συνάρτησης που δημιουργήθηκε:

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Πριν ξεκινήσετε τη δημιουργία κώδικα στην Python, θα χρειαστεί να δημιουργήσετε ένα bot στο Telegram. Δεν θα περιγράψω πώς γίνεται αυτό - υπάρχουν λεπτομερείς οδηγίες στη γνωσιακή μας βάση. Το κύριο πράγμα για εμάς είναι το διακριτικό του δημιουργημένου bot.

Προετοιμασία του κώδικα

Επέλεξα την Εθνική Υπηρεσία Ωκεανών και Ατμόσφαιρας (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:30 π.μ. GMT.
  • [31004 MPS] — διεύθυνση ανέμου 310 μοίρες, ταχύτητα 4 m/s.
  • [9999] — οριζόντια ορατότητα 10 km ή περισσότερο·
  • [SCT048] — διάσπαρτα/διάσπαρτα σύννεφα στα 4800 πόδια (~1584 m).
  • [24 / 13] — θερμοκρασία 24°C, σημείο δρόσου 13°C.
  • [Ε1014] — πίεση (QNH) 1014 hectopascals (750 mm Hg).
  • [R01/000070] — συντελεστής πρόσφυσης στη λωρίδα 01 — 0,70.
  • [NOSIG] - χωρίς σημαντικές αλλαγές.

Ας αρχίσουμε να γράφουμε κώδικα προγράμματος. Πρώτα πρέπει να εισαγάγετε συναρτήσεις ζητήσει и pytaf:

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

Ας προσέξουμε ιδιαίτερα τις γραμμές TIME и BECMG. TEMPO σημαίνει ότι ο πραγματικός καιρός κατά τη διάρκεια της καθορισμένης περιόδου θα αλλάζει περιοδικά. BECMG - ο καιρός θα αλλάξει σταδιακά μέσα σε μια καθορισμένη χρονική περίοδο.

Δηλαδή η γραμμή:

TEMPO 1012/1020 -TSRA BKN020CB

Θα σημαίνει:

  • [1012 / 1020] — μεταξύ 12 και 20 ωρών (μέση ώρα Γκρίνουιτς).
  • [-TSRA] — καταιγίδα (TS = καταιγίδα) με βροχή (RA = βροχή) χαμηλής έντασης (σύμβολο μείον).
  • [BKN020CB] - σημαντικά (BKN = σπασμένα), cumulonimbus (CB = cumulonimbus) σύννεφα στα 2000 πόδια (610 μέτρα) πάνω από την επιφάνεια της θάλασσας.

Υπάρχουν πάρα πολλοί όροι για τα καιρικά φαινόμενα και η απομνημόνευσή τους είναι δύσκολη. Ο κωδικός για το αίτημα TAF είναι γραμμένος με παρόμοιο τρόπο.

Μεταφόρτωση κώδικα στο cloud

Για να μην χάνουμε χρόνο, ας πάρουμε ένα πρότυπο bot telegram από το αποθετήριο μας cloud-telegram-bot. Υπάρχει ένα προπαρασκευασμένο απαιτήσεις.txt и setup.py με τη σωστή δομή καταλόγου.

Δεδομένου ότι στον κώδικα θα έχουμε πρόσβαση στη μονάδα pytaf, τότε η έκδοσή του θα πρέπει να προστεθεί αμέσως απαιτήσεις.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 και πηγαίνουμε στον πίνακα ελέγχου στη συνάρτηση που δημιουργήθηκε.
  • Κάντε κλικ Επεξεργασία και κατεβάστε το αρχείο με τον κωδικό.

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud

  • Συμπληρώστε τη σχετική διαδρομή στο αρχείο tele_bot (επέκταση .py μπορεί να μην καθορίζεται) και μια συνάρτηση τελικού σημείου (στο παράδειγμα που δίνεται αυτό είναι κύριος).
  • Στο τμήμα Μεταβλητές περιβάλλοντος γράψτε μια μεταβλητή ΕΝΔΕΙΞΗ και αντιστοιχίστε του το διακριτικό του επιθυμητού bot τηλεγραφήματος.
  • Κάντε κλικ Αποθήκευση και επέκταση, μετά την οποία πηγαίνουμε στην ενότητα Ενεργοποιεί.
  • Βάζουμε τον διακόπτη Αίτημα HTTPγια να δημοσιοποιηθεί το αίτημα.

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Τώρα έχουμε μια διεύθυνση URL για δημόσια κλήση της συνάρτησης. Το μόνο που μένει είναι διαμόρφωση webhook. Βρείτε το bot μας @SelectelServerless_bot στο Telegram και καταχωρήστε το bot σας με την εντολή:

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

Αποτέλεσμα

Εάν όλα γίνουν σωστά, το bot σας θα αρχίσει αμέσως να λειτουργεί και θα εμφανίζει το πιο πρόσφατο δελτίο καιρού της αεροπορίας απευθείας στο messenger.

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud
Φυσικά, ο κώδικας μπορεί να βελτιωθεί, αλλά ακόμα και στην τρέχουσα κατάστασή του αρκεί να μάθετε τον πιο ακριβή καιρό και πρόγνωση από μια αξιόπιστη πηγή.

Θα βρείτε την πλήρη έκδοση του κώδικα στο δικό μας αποθετήρια στο GitHub.

Η πιο ακριβής πρόγνωση καιρού: ένα bot για το Telegram στις λειτουργίες cloud

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο