๋ ์จ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์๋น์ค๋ ๋ง์ง๋ง ์ด๋ค ์๋น์ค๋ฅผ ๋ฏฟ์ด์ผ ํ ๊น์? ์ฌ์ดํด๋ง์ ์์ฃผ ์์ํ๋ฉด์ ๋ผ์ด๋ฉ ์ฅ์์ ๊ธฐ์ ์ํฉ์ ๋ํด ๊ฐ์ฅ ์ ํํ ์ ๋ณด๋ฅผ ์ป๊ณ ์ถ์์ต๋๋ค.
์ ๊ฐ ์ฒ์ ์๊ฐํ ๊ฒ์ ์ผ์๊ฐ ์๋ ์์ DIY ๊ธฐ์ ๊ด์ธก์๋ฅผ ๋ง๋ค๊ณ ๊ทธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ โ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช
โํ์ง ์๊ณ ๋ฏผ๊ฐ ํญ๊ณต์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋ณด๋ฅผ ๊ฒ์ฆ๋ ๋ฐ์ดํฐ์ ์์ค๋ก ์ ํํ์ต๋๋ค. ๋ฉํ (๊ธฐ์๋นํ์ฅ ๋ณด๊ณ ์) ๋ฐ TAF (TAF - ํฐ๋ฏธ๋ ๋นํ์ฅ ์์ธก). ํญ๊ณต ๋ถ์ผ์์๋ ์๋ฐฑ ๋ช
์ ์๋ช
์ด ๋ ์จ์ ์ข์ฐ๋๋ฏ๋ก ์์ธก์ ์ต๋ํ ์ ํํฉ๋๋ค.
์ด ์ ๋ณด๋ ๋ชจ๋ ํ๋ ๋นํ์ฅ์์ ์์ฑ์ผ๋ก ์ฐ์ค๋ฌดํด XNUMX์๊ฐ ๋ฐฉ์ก๋ฉ๋๋ค. ATIS (์๋ ํฐ๋ฏธ๋ ์ ๋ณด ์๋น์ค) ๋ฐ ๋ณผ๋ฉํธ (ํ๋์ค์ด์์. ๊ถ - ๋นํ ๋ฐ ๋ ์จ - ๋ ์จ). ์ฒซ ๋ฒ์งธ๋ ๋นํ์ฅ์ ์ค์ ๋ ์จ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ , ๋ ๋ฒ์งธ๋ ๋ฐฉ์ก ๋นํ์ฅ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋นํ์ฅ์์๋ ํฅํ 24~30์๊ฐ ๋์์ ์ผ๊ธฐ์๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ธ๋์ฝ๋ณด ๊ณตํญ์ ATIS ์ด์ ์:
Vnukovo ๊ณตํญ์์ VOLMET๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์
ํด๋น ๋ฒ์์ ๋ํด ๋งค๋ฒ ๋ฌด์ ์ค์บ๋๋ ํธ๋์๋ฒ๋ฅผ ํด๋ํ๋ ๊ฒ์ ๋ถํธํ๋ฉฐ, ํ ๋ ๊ทธ๋จ์์ ๋ฒํผ ํด๋ฆญ๋ง์ผ๋ก ๋์ผํ ์์ธก์ ์ป์ ์ ์๋ ๋ด์ ๋ง๋ค๊ณ ์ถ์์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ณ๋์ ์๋ฒ๋ฅผ ํ ๋นํ๊ณ ํ ๋ผ์ฆ๋ฒ ๋ฆฌ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์ ์ด๋ ๋นํ์ค์ ์ ๋๋ค.
๊ทธ๋์ ์ด ์๋น์ค๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ฐฑ์๋ ์ค๋น
ํจ์ ์์ฑ
์ ์ดํ์์
ํ๋ก์ ํธ๊ฐ ์์ฑ๋ ํ ์น์
์ผ๋ก ์ด๋ํฉ๋๋ค. ๊ธฐ๋ฅ:
๋ฒํผ ๋๋ฆ ํจ์ ๋ง๋ค๊ธฐ ์ํ๋ ์ด๋ฆ์ ์ง์ ํ์ญ์์ค.
ํด๋ฆญ ํ ํจ์ ๋ง๋ค๊ธฐ ์์ฑ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ํํ๋ฉ๋๋ค.
Python์์ ์ฝ๋ ์์ฑ์ ์์ํ๊ธฐ ์ ์ Telegram์์ ๋ด์ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ํ๋๋์ง ์ค๋ช
ํ์ง ์๊ฒ ์ต๋๋ค. ์์ธํ ์ง์นจ์ด ์์ต๋๋ค.
์ฝ๋ ์ค๋น
์ ๋ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ ์์ค๋ก ๋ฏธ๊ตญ ๊ตญ๋ฆฝํด์๋๊ธฐ์ฒญ(NOAA)์ ์ ํํ์ต๋๋ค. ์ด ๊ณผํ ๊ธฐ๊ด์ TXT ํ์์ผ๋ก ์๋ฒ์ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
METAR ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ ๋งํฌ(์ฌ๋ก ์ฐธ๊ณ ):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<ะบะพะด ะฐััะพะฟะพััะฐ ะฟะพ ICAO>.TXT
๋ด ๊ฒฝ์ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํญ์ Vnukovo์ด๊ณ 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] - ์ํ ์์ ์ด 10km ์ด์;
- [SCT048] โ 4800ํผํธ(~1584m)์์ ํฉ์ด์ง/ํฉ์ด์ง ๊ตฌ๋ฆ;
- [24 / 13] - ์จ๋ 24ยฐC, ์ด์ฌ์ 13ยฐC;
- [Q1014] - ์๋ ฅ(QNH) 1014ํฅํ ํ์ค์นผ(750mmHg)
- [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
์ด์ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก 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] - ๋ฎ์ ๊ฐ๋์ ๋น(RA = ๋น)๋ฅผ ๋๋ฐํ ๋์ฐ(TS = ๋์ฐ)(๋ง์ด๋์ค ๊ธฐํธ)
- [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 ์์นด์ด๋ธ๋ก ์์ถํ๊ณ ์์ฑ๋ ๊ธฐ๋ฅ์ด ์๋ ์ ์ดํ์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋ธ๊น ํ๋ ์๋ฆฌ ํธ์ง ์ฝ๋๊ฐ ํฌํจ๋ ์์นด์ด๋ธ๋ฅผ ๋ค์ด๋ก๋ํ์ธ์.
- ํ์ผ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ์ธ์. tele_bot (ํ๋ .py ์ง์ ๋์ง ์์ ์ ์์) ๋ฐ ๋์ ํจ์(์ฃผ์ด์ง ์์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ณธ๊ด).
- ์น์ ์์ ํ๊ฒฝ ๋ณ์ ๋ณ์๋ฅผ ์ฐ๋ค ํ ํฐ ์ํ๋ ํ ๋ ๊ทธ๋จ ๋ด์ ํ ํฐ์ ํ ๋นํ์ธ์.
- ๋ธ๊น ํ๋ ์๋ฆฌ ์ ์ฅ ๋ฐ ํ์ฅ, ๊ทธ ํ ์น์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ.
- ์ฐ๋ฆฌ๋ ์ค์์น๋ฅผ ๋์๋ค. HTTP ์์ฒญ์์ฒญ์ ๊ณต๊ฐํฉ๋๋ค.
์ด์ ํจ์๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ํธ์ถํ๊ธฐ ์ํ URL์ด ์๊ฒผ์ต๋๋ค. ๋จ์ ๊ฑด
/setwebhook <you bot token> <public URL of your function>
๊ฒฐ๊ณผ
๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฃ๋๋ฉด ๋ด์ด ์ฆ์ ์๋ํ๊ธฐ ์์ํ๊ณ ์ต์ ํญ๊ณต ์ผ๊ธฐ ์๋ณด๋ฅผ ๋ฉ์ ์ ์ ์ง์ ํ์ํฉ๋๋ค.
๋ฌผ๋ก ์ฝ๋๋ ๊ฐ์ ๋ ์ ์์ง๋ง, ํ์ฌ ์ํ์์๋ ์ ๋ขฐํ ์ ์๋ ์์ค๋ก๋ถํฐ ๊ฐ์ฅ ์ ํํ ๋ ์จ์ ์๋ณด๋ฅผ ์์๋ด๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
์ฝ๋์ ์ ์ฒด ๋ฒ์ ์ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ถ์ฒ : habr.com