Υπάρχουν πολλές υπηρεσίες που παρέχουν πληροφορίες για τον καιρό, αλλά ποια πρέπει να εμπιστευτείτε; Όταν άρχισα να κάνω συχνά ποδήλατο, ήθελα να έχω τις πιο ακριβείς πληροφορίες για τις καιρικές συνθήκες στο μέρος όπου κάνω ποδήλατο.
Η πρώτη μου σκέψη ήταν να φτιάξω έναν μικρό μετεωρολογικό σταθμό με αισθητήρες και να λάβω δεδομένα από αυτόν. Αλλά δεν «επινόησα ξανά τον τροχό» και επέλεξα τις πληροφορίες καιρού που χρησιμοποιούνται στην πολιτική αεροπορία ως πηγή επαληθευμένων δεδομένων, δηλαδή METAR (Έκθεση Μετεωρολογικού Αεροδρομίου) και TAF (TAF - Terminal Aerodrome Forecast). Στην αεροπορία, οι ζωές εκατοντάδων ανθρώπων εξαρτώνται από τον καιρό, επομένως οι προβλέψεις είναι όσο το δυνατόν ακριβέστερες.
Αυτές οι πληροφορίες μεταδίδονται XNUMX/XNUMX φωνητικά σε κάθε σύγχρονο αεροδρόμιο στη φόρμα ATIS (Αυτόματη Υπηρεσία Πληροφοριών Τερματικού) και VOLMET (από τα γαλλικά. vol - πτήση και MÉTÉO - καιρός). Το πρώτο παρέχει πληροφορίες για τον πραγματικό καιρό στο αεροδρόμιο και το δεύτερο παρέχει μια πρόγνωση για τις επόμενες 24-30 ώρες, όχι μόνο στο αεροδρόμιο μετάδοσης, αλλά και σε άλλα.
Παράδειγμα λειτουργίας ATIS στο αεροδρόμιο Vnukovo:
Ένα παράδειγμα του πώς λειτουργεί το VOLMET στο αεροδρόμιο Vnukovo
Δεν είναι βολικό να έχετε μαζί σας έναν ραδιοσαρωτή ή πομποδέκτη κάθε φορά για το αντίστοιχο εύρος και ήθελα να δημιουργήσω ένα bot στο Telegram που, με το πάτημα ενός κουμπιού, σας επιτρέπει να λαμβάνετε την ίδια πρόβλεψη. Δεν είναι τουλάχιστον πρακτικό να διαθέσετε έναν ξεχωριστό διακομιστή για αυτό, καθώς και να στείλετε αιτήματα στο σπίτι σας Raspberry.
Ως εκ τούτου, αποφάσισα να χρησιμοποιήσω την υπηρεσία ως backend
Προετοιμασία backend
Δημιουργία Συνάρτησης
Στον Πίνακα Ελέγχου
Αφού δημιουργηθεί το έργο, μεταβείτε στην ενότητα Λειτουργίες:
Πιέστε το πλήκτρο Δημιουργήστε μια συνάρτηση και δώστε του το επιθυμητό όνομα:
Αφού κάνετε κλικ Δημιουργήστε μια συνάρτηση θα έχουμε μια αναπαράσταση της συνάρτησης που δημιουργήθηκε:
Πριν ξεκινήσετε τη δημιουργία κώδικα στην Python, θα χρειαστεί να δημιουργήσετε ένα bot στο Telegram. Δεν θα περιγράψω πώς γίνεται αυτό - υπάρχουν λεπτομερείς οδηγίες
Προετοιμασία του κώδικα
Επέλεξα την Εθνική Υπηρεσία Ωκεανών και Ατμόσφαιρας (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 από το αποθετήριο μας
Δεδομένου ότι στον κώδικα θα έχουμε πρόσβαση στη μονάδα 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 και πηγαίνουμε στον πίνακα ελέγχου στη συνάρτηση που δημιουργήθηκε.
- Κάντε κλικ Επεξεργασία και κατεβάστε το αρχείο με τον κωδικό.
- Συμπληρώστε τη σχετική διαδρομή στο αρχείο tele_bot (επέκταση .py μπορεί να μην καθορίζεται) και μια συνάρτηση τελικού σημείου (στο παράδειγμα που δίνεται αυτό είναι κύριος).
- Στο τμήμα Μεταβλητές περιβάλλοντος γράψτε μια μεταβλητή ΕΝΔΕΙΞΗ και αντιστοιχίστε του το διακριτικό του επιθυμητού bot τηλεγραφήματος.
- Κάντε κλικ Αποθήκευση και επέκταση, μετά την οποία πηγαίνουμε στην ενότητα Ενεργοποιεί.
- Βάζουμε τον διακόπτη Αίτημα HTTPγια να δημοσιοποιηθεί το αίτημα.
Τώρα έχουμε μια διεύθυνση URL για δημόσια κλήση της συνάρτησης. Το μόνο που μένει είναι
/setwebhook <you bot token> <public URL of your function>
Αποτέλεσμα
Εάν όλα γίνουν σωστά, το bot σας θα αρχίσει αμέσως να λειτουργεί και θα εμφανίζει το πιο πρόσφατο δελτίο καιρού της αεροπορίας απευθείας στο messenger.
Φυσικά, ο κώδικας μπορεί να βελτιωθεί, αλλά ακόμα και στην τρέχουσα κατάστασή του αρκεί να μάθετε τον πιο ακριβή καιρό και πρόγνωση από μια αξιόπιστη πηγή.
Θα βρείτε την πλήρη έκδοση του κώδικα στο δικό μας
Πηγή: www.habr.com