気象情報を提供するサービスはたくさんありますが、どれを信頼すればよいでしょうか? 頻繁にサイクリングを始めたとき、サイクリングする場所の気象状況について最も正確な情報を知りたいと思いました。
私が最初に考えたのは、センサーを備えた小さな DIY 気象観測所を構築し、そこからデータを受信することでした。 しかし、私は「車輪の再発明」はせず、検証されたデータのソースとして民間航空で使用されている気象情報を選択しました。 METAR (気象飛行場レポート) および TAF (TAF - ターミナル飛行場予報)。 航空業界では、何百人もの人々の命が天候に左右されるため、予測は可能な限り正確です。
この情報は、すべての現代の飛行場で XNUMX 時間 XNUMX 日音声で次の形式でブロードキャストされます。 ATIS (自動端末案内サービス)と ボリュームメット (フランス語から。 vol - フライトと 天候 - 天気)。 24 つ目は飛行場の実際の天気に関する情報を提供し、30 つ目は放送飛行場だけでなく他の飛行場でも、今後 XNUMX ~ XNUMX 時間の天気予報を提供します。
ヴヌーコボ空港での ATIS 運用の例:
ヴヌーコヴォ空港での VOLMET の仕組みの例
対応する範囲を確認するために、毎回ラジオ スキャナーやトランシーバーを持ち歩くのは不便です。ボタンをクリックするだけで同じ予報を取得できるボットを Telegram で作成したいと思いました。 少なくとも、ホーム Raspberry にリクエストを送信するのと同様に、これに別のサーバーを割り当てることは非現実的です。
そこで、このサービスをバックエンドとして使用することにしました
バックエンドの準備
関数の作成
コントロールパネル内
プロジェクトが作成されたら、セクションに移動します 機能:
ボタンを押す 関数を作成する そして希望の名前を付けます:
クリック後 関数を作成する 作成された関数の表現が得られます。
Python でコードの作成を開始する前に、Telegram でボットを作成する必要があります。 これがどのように行われるかについては説明しません - 詳細な手順があります
コードの準備
私は信頼できるデータ源として米国海洋大気局 (NOAA) を選びました。 この科学機関は、サーバー上のデータを TXT 形式でリアルタイムに更新します。
METAR データを取得するためのリンク (大文字と小文字に注意してください):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
私の場合、最寄りの空港はヴヌーコボ空港で、そのICAOコードは次のとおりです。 ううう。 生成された URL にアクセスすると、次の結果が表示されます。
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
最初の行は、グリニッジ標準時での予測の現在時刻です。 XNUMX 行目は実際の天気の概要です。 民間航空のパイロットはこの行の意味を問題なく理解できるでしょうが、説明が必要です。
- [UUWW] — モスクワ、ヴヌーコボ (ロシア — RU);
- 【101130Z】 — 毎月 10 日、グリニッジ標準時午前 11 時 30 分。
- [31004MPS] — 風向 310 度、風速 4 m/s。
- 【9999] — 水平視程 10 km 以上。
- [SCT048] — 4800フィート(約1584メートル)の散在/散乱雲。
- [24 / 13] — 温度 24°C、露点 13°C;
- 【Q1014】 — 圧力 (QNH) 1014 ヘクトパスカル (750 mm Hg);
- [R01/000070] — レーン 01 の接着係数 — 0,70;
- [ノシグ] - 大幅な変更なし。
プログラムコードを書き始めましょう。 まず関数をインポートする必要があります 要求 и ピタフ:
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】 - 海抜 2000 フィート (610 メートル) の顕著な (BKN = 壊れた) 積乱雲 (CB = 積乱雲)。
気象現象の用語は非常に多く、覚えるのが大変です。 TAF リクエストのコードも同様の方法で記述されます。
コードをクラウドにアップロードする
時間を無駄にしないために、リポジトリから電報ボット テンプレートを取得しましょう
コードではモジュールにアクセスすることになるので、 ピタフの場合、そのバージョンはすぐに追加されます。 Requirements.txt
pytaf~=1.2.1
- 編集に移りましょう ボット/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 アーカイブに圧縮し、コントロール パネルで作成した関数に移動します。
- クリック 編集 コードを含むアーカイブをダウンロードします。
- ファイル内の相対パスを入力します テレボット (拡大 .py 指定できない場合があります) とエンドポイント関数 (この例ではこれは メイン).
- セクション内の 環境変数 変数を書き込む トークン そして、それに目的の電報ボットのトークンを割り当てます。
- クリック 保存して展開する、その後セクションに進みます トリガー.
- 私たちはスイッチを入れます HTTPリクエストリクエストを公開します。
これで、関数をパブリックに呼び出すための URL ができました。 残っているのは
/setwebhook <you bot token> <public URL of your function>
結果
すべてが正しく行われれば、ボットはすぐに動作を開始し、最新の航空天気予報をメッセンジャーに直接表示します。
もちろん、コードを改善することはできますが、現在の状態でも、信頼できる情報源から最も正確な天気と予報を見つけるには十分です。
コードの完全版は、次のリンクにあります。
出所: habr.com