提供天氣資訊的服務有很多,但您應該信任哪一個呢? 當我開始經常騎自行車時,我想獲得有關我騎行地點的天氣狀況的最準確資訊。
我的第一個想法是建造一個帶有感測器的小型 DIY 氣象站並從中接收數據。 但我並沒有“白費力氣”,而是選擇了民航使用的天氣資訊作為驗證數據的來源,即 美達 (機場氣象報告)和 TAF (TAF - 航站機場預報)。 在航空業,數百人的生命取決於天氣,因此預報盡可能準確。
該資訊在每個現代機場以以下形式 XNUMX/XNUMX 透過語音廣播: 信息系統 (自動終端資訊服務)和 伏爾梅特 (來自法語。 第一卷 - 飛行和 天氣 - 天氣)。 第一個提供有關機場實際天氣的信息,第二個提供未來 24-30 小時的天氣預報,不僅在廣播機場,而且在其他機場。
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
第一行是格林威治標準時間預報的當前時間。 第二行是實際天氣的總結。 民航飛行員很容易理解這條線的含義,但我們需要一個解釋:
- [UUWW] — 伏努科沃,莫斯科(俄羅斯 — RU);
- [101130Z] — 每月 10 日,上午 11:30 GMT;
- [31004MPS] ——風向310度,風速4m/s;
- [9999] ——水平能見度10公里或以上;
- [SCT048] — 4800 英尺(~1584m)處的分散雲;
- [24 / 13] — 溫度24°C,露點13°C;
- [問題一] — 壓力 (QNH) 1014 百帕斯卡 (750 毫米汞柱);
- [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
讓我們特別注意線條 TIME и 腦電圖。 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 可能未指定)和端點函數(在給出的範例中是 主).
- 在第 環境變數 寫一個變數 TOKEN 並為其分配所需電報機器人的代幣。
- 點擊 儲存並展開,之後我們進入該部分 扳機.
- 我們把開關 HTTP請求公開該請求。
現在我們有了一個用於公開呼叫該函數的 URL。 剩下的就是
/setwebhook <you bot token> <public URL of your function>
導致
如果一切都正確完成,您的機器人將立即開始工作並直接在訊息中顯示最新的航空天氣預報。
當然,程式碼可以改進,但即使在當前狀態下,也足以從可信來源找到最準確的天氣和預報。
您可以在我們的中找到完整版本的程式碼
來源: www.habr.com