พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
มีบริการมากมายที่ให้ข้อมูลสภาพอากาศ แต่คุณควรเชื่อถือบริการใด เมื่อฉันเริ่มปั่นจักรยานบ่อยๆ ฉันอยากได้ข้อมูลที่แม่นยำที่สุดเกี่ยวกับสภาพอากาศในสถานที่ที่ฉันปั่นจักรยาน

ความคิดแรกของฉันคือการสร้างสถานีตรวจอากาศ DIY ขนาดเล็กพร้อมเซ็นเซอร์และรับข้อมูลจากมัน แต่ผมไม่ได้ “สร้างวงล้อใหม่” และเลือกข้อมูลสภาพอากาศที่ใช้ในการบินพลเรือนเป็นแหล่งข้อมูลที่ตรวจสอบแล้ว กล่าวคือ เมทาร์ (รายงานสนามบินอุตุนิยมวิทยา) และ TAF (TAF - การพยากรณ์สนามบินเทอร์มินัล) ในแวดวงการบิน ชีวิตของผู้คนหลายร้อยคนขึ้นอยู่กับสภาพอากาศ ดังนั้นการพยากรณ์จึงมีความแม่นยำมากที่สุด

ข้อมูลนี้จะถูกถ่ายทอดด้วยเสียงทุกวันตลอด XNUMX ชั่วโมงที่สนามบินสมัยใหม่ทุกแห่งในรูปแบบ เอทิส (บริการข้อมูลเทอร์มินัลอัตโนมัติ) และ โวลเมต (จากภาษาฝรั่งเศส. ฉบับ - เที่ยวบินและ Météo - สภาพอากาศ). รายการแรกให้ข้อมูลเกี่ยวกับสภาพอากาศจริงที่สนามบิน และรายการที่สองให้ข้อมูลพยากรณ์อากาศใน 24-30 ชั่วโมงข้างหน้า ไม่เพียงแต่ในสนามบินที่ออกอากาศเท่านั้น แต่ยังรวมถึงสนามบินอื่นๆ ด้วย

ตัวอย่างการดำเนินงานของ ATIS ที่สนามบิน Vnukovo:

ตัวอย่างการทำงานของ VOLMET ที่สนามบิน Vnukovo

ไม่สะดวกที่จะพกเครื่องสแกนหรือเครื่องรับส่งสัญญาณวิทยุติดตัวคุณทุกครั้งในช่วงที่สอดคล้องกัน และฉันต้องการสร้างบอทใน Telegram ซึ่งเมื่อคลิกปุ่มจะทำให้คุณได้รับการคาดการณ์แบบเดียวกัน อย่างน้อยที่สุดก็เป็นไปไม่ได้ที่จะจัดสรรเซิร์ฟเวอร์แยกต่างหากสำหรับสิ่งนี้รวมถึงการส่งคำขอไปยัง Raspberry ที่บ้านของคุณ

ดังนั้นฉันจึงตัดสินใจใช้บริการนี้เป็นแบ็กเอนด์ เลือกคุณสมบัติคลาวด์. จำนวนคำขอจะไม่มีนัยสำคัญดังนั้นบริการดังกล่าวจะไม่มีค่าใช้จ่าย (ตามการคำนวณของฉันจะเป็น 22 รูเบิลสำหรับ 100 คำขอ)

การเตรียมแบ็กเอนด์

การสร้างฟังก์ชั่น

ในแผงควบคุม my.selectel.ru เปิดมุมมอง แพลตฟอร์มคลาวด์ และสร้างโปรเจ็กต์ใหม่:

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
หลังจากสร้างโครงการแล้ว ให้ไปที่ส่วนนี้ ฟังก์ชั่น:

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
กดปุ่ม สร้างฟังก์ชัน และตั้งชื่อตามที่ต้องการ:

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
หลังจากกด สร้างฟังก์ชัน เราจะได้เป็นตัวแทนของฟังก์ชันที่สร้างขึ้น:

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
ก่อนที่คุณจะเริ่มสร้างโค้ดใน 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 и setup.py ด้วยโครงสร้างไดเร็กทอรีที่ถูกต้อง

เนื่องจากในโค้ดเราจะเข้าถึงโมดูล ปิตาฟจากนั้นควรเพิ่มเวอร์ชันเข้าไปทันที 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 และไปที่แผงควบคุมไปยังฟังก์ชันที่สร้างขึ้น
  • กด แก้ไข และดาวน์โหลดไฟล์เก็บถาวรพร้อมรหัส

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์

  • กรอกเส้นทางสัมพัทธ์ในไฟล์ tele_bot (ส่วนขยาย .py อาจไม่สามารถระบุได้) และฟังก์ชันจุดสิ้นสุด (ในตัวอย่างที่ให้ไว้นี้คือ หลัก).
  • ในส่วน ตัวแปรสภาพแวดล้อม เขียนตัวแปร โทเค็น และกำหนดโทเค็นของบอตโทรเลขที่ต้องการ
  • กด บันทึกและขยายหลังจากนั้นเราไปที่ส่วนนี้ ทริกเกอร์.
  • เราใส่สวิตช์ คำขอ HTTPเพื่อเปิดเผยคำขอต่อสาธารณะ

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
ตอนนี้เรามี URL สำหรับการเรียกใช้ฟังก์ชันแบบสาธารณะแล้ว สิ่งที่เหลืออยู่ก็คือ กำหนดค่าเว็บฮุค. ค้นหาบอทของเรา @SelectelServerless_bot ใน Telegram และลงทะเบียนบอทของคุณด้วยคำสั่ง:

/setwebhook <you bot token> <public URL of your function>

ผล

หากทุกอย่างถูกต้อง บอทของคุณจะเริ่มทำงานทันทีและแสดงรายงานสภาพอากาศการบินล่าสุดใน Messenger โดยตรง

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์
แน่นอนว่าสามารถปรับปรุงโค้ดได้ แต่แม้จะอยู่ในสถานะปัจจุบันก็เพียงพอที่จะค้นหาสภาพอากาศและพยากรณ์อากาศที่แม่นยำที่สุดจากแหล่งที่เชื่อถือได้

คุณจะพบรหัสเวอร์ชันเต็มได้ในของเรา ที่เก็บบน GitHub.

พยากรณ์อากาศที่แม่นยำที่สุด: บอทสำหรับ Telegram บนฟังก์ชั่นคลาวด์

ที่มา: will.com

เพิ่มความคิดเห็น