มีบริการมากมายที่ให้ข้อมูลสภาพอากาศ แต่คุณควรเชื่อถือบริการใด เมื่อฉันเริ่มปั่นจักรยานบ่อยๆ ฉันอยากได้ข้อมูลที่แม่นยำที่สุดเกี่ยวกับสภาพอากาศในสถานที่ที่ฉันปั่นจักรยาน
ความคิดแรกของฉันคือการสร้างสถานีตรวจอากาศ DIY ขนาดเล็กพร้อมเซ็นเซอร์และรับข้อมูลจากมัน แต่ผมไม่ได้ “สร้างวงล้อใหม่” และเลือกข้อมูลสภาพอากาศที่ใช้ในการบินพลเรือนเป็นแหล่งข้อมูลที่ตรวจสอบแล้ว กล่าวคือ เมทาร์ (รายงานสนามบินอุตุนิยมวิทยา) และ TAF (TAF - การพยากรณ์สนามบินเทอร์มินัล) ในแวดวงการบิน ชีวิตของผู้คนหลายร้อยคนขึ้นอยู่กับสภาพอากาศ ดังนั้นการพยากรณ์จึงมีความแม่นยำมากที่สุด
ข้อมูลนี้จะถูกถ่ายทอดด้วยเสียงทุกวันตลอด XNUMX ชั่วโมงที่สนามบินสมัยใหม่ทุกแห่งในรูปแบบ เอทิส (บริการข้อมูลเทอร์มินัลอัตโนมัติ) และ โวลเมต (จากภาษาฝรั่งเศส. ฉบับ - เที่ยวบินและ Météo - สภาพอากาศ). รายการแรกให้ข้อมูลเกี่ยวกับสภาพอากาศจริงที่สนามบิน และรายการที่สองให้ข้อมูลพยากรณ์อากาศใน 24-30 ชั่วโมงข้างหน้า ไม่เพียงแต่ในสนามบินที่ออกอากาศเท่านั้น แต่ยังรวมถึงสนามบินอื่นๆ ด้วย
ตัวอย่างการดำเนินงานของ ATIS ที่สนามบิน Vnukovo:
ตัวอย่างการทำงานของ VOLMET ที่สนามบิน Vnukovo
ไม่สะดวกที่จะพกเครื่องสแกนหรือเครื่องรับส่งสัญญาณวิทยุติดตัวคุณทุกครั้งในช่วงที่สอดคล้องกัน และฉันต้องการสร้างบอทใน Telegram ซึ่งเมื่อคลิกปุ่มจะทำให้คุณได้รับการคาดการณ์แบบเดียวกัน อย่างน้อยที่สุดก็เป็นไปไม่ได้ที่จะจัดสรรเซิร์ฟเวอร์แยกต่างหากสำหรับสิ่งนี้รวมถึงการส่งคำขอไปยัง Raspberry ที่บ้านของคุณ
ดังนั้นฉันจึงตัดสินใจใช้บริการนี้เป็นแบ็กเอนด์
การเตรียมแบ็กเอนด์
การสร้างฟังก์ชั่น
ในแผงควบคุม
หลังจากสร้างโครงการแล้ว ให้ไปที่ส่วนนี้ ฟังก์ชั่น:
กดปุ่ม สร้างฟังก์ชัน และตั้งชื่อตามที่ต้องการ:
หลังจากกด สร้างฟังก์ชัน เราจะได้เป็นตัวแทนของฟังก์ชันที่สร้างขึ้น:
ก่อนที่คุณจะเริ่มสร้างโค้ดใน Python คุณจะต้องสร้างบอทใน 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
บรรทัดแรกคือเวลาปัจจุบันของการพยากรณ์ตามเวลามาตรฐานกรีนิช บรรทัดที่ XNUMX คือสรุปสภาพอากาศจริง นักบินการบินพลเรือนจะไม่มีปัญหาในการทำความเข้าใจว่าบรรทัดนี้หมายถึงอะไร แต่เราต้องการคำอธิบาย:
- [UUWW] — วนูโคโว, มอสโก (รัสเซีย — RU);
- [101130Z] — วันที่ 10 ของเดือน, 11:30 น. GMT;
- [31004MPS] — ทิศทางลม 310 องศา ความเร็ว 4 เมตร/วินาที;
- [9999] - ทัศนวิสัยในแนวนอน 10 กม. ขึ้นไป
- [SCT048] — เมฆกระจัดกระจาย/กระจัดกระจายที่ความสูง 4800 ฟุต (~ 1584 ม.)
- [24 / 13] — อุณหภูมิ 24°C จุดน้ำค้าง 13°C;
- [ไตรมาสที่ 1014] — ความดัน (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
ให้เราใส่ใจกับเส้นเป็นพิเศษ จังหวะ и บีอีเอ็มจี. TEMPO หมายความว่าสภาพอากาศจริงในช่วงเวลาที่กำหนดจะเปลี่ยนแปลงเป็นระยะ BECMG - สภาพอากาศจะค่อยๆ เปลี่ยนแปลงภายในระยะเวลาที่กำหนด
นั่นคือบรรทัด:
TEMPO 1012/1020 -TSRA BKN020CB
จะหมายถึง:
- [1012 / 1020] — ระหว่าง 12 ถึง 20 ชั่วโมง (เวลามาตรฐานกรีนิช)
- [-TSRA] — พายุฝนฟ้าคะนอง (TS = พายุฝนฟ้าคะนอง) โดยมีฝนตก (RA = ฝน) ที่มีความรุนแรงต่ำ (เครื่องหมายลบ)
- [BKN020CB] - มีนัยสำคัญ (BKN = แตก), เมฆคิวมูโลนิมบัส (CB = คิวมูโลนิมบัส) เมฆที่ระดับความสูง 2000 ฟุต (610 เมตร) เหนือระดับน้ำทะเล
ปรากฏการณ์สภาพอากาศมีคำศัพท์อยู่มากมาย และการจำคำศัพท์เหล่านี้เป็นเรื่องยาก รหัสสำหรับคำขอ TAF เขียนในลักษณะเดียวกัน
กำลังอัพโหลดโค้ดไปยังคลาวด์
เพื่อไม่ให้เป็นการเสียเวลา ลองใช้เทมเพลตบอทโทรเลขจากแหล่งเก็บข้อมูลของเรา
เนื่องจากในโค้ดเราจะเข้าถึงโมดูล ปิตาฟจากนั้นควรเพิ่มเวอร์ชันเข้าไปทันที Requirement.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>
ผล
หากทุกอย่างถูกต้อง บอทของคุณจะเริ่มทำงานทันทีและแสดงรายงานสภาพอากาศการบินล่าสุดใน Messenger โดยตรง
แน่นอนว่าสามารถปรับปรุงโค้ดได้ แต่แม้จะอยู่ในสถานะปัจจุบันก็เพียงพอที่จะค้นหาสภาพอากาศและพยากรณ์อากาศที่แม่นยำที่สุดจากแหล่งที่เชื่อถือได้
คุณจะพบรหัสเวอร์ชันเต็มได้ในของเรา
ที่มา: will.com