Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Có rất nhiều dịch vụ cung cấp thông tin thời tiết nhưng bạn nên tin tưởng dịch vụ nào? Khi tôi bắt đầu đạp xe thường xuyên, tôi muốn có thông tin chính xác nhất về điều kiện thời tiết ở nơi tôi đạp xe.

Suy nghĩ đầu tiên của tôi là xây dựng một trạm thời tiết DIY nhỏ có cảm biến và nhận dữ liệu từ đó. Nhưng tôi đã không “phát minh lại bánh xe” và chọn thông tin thời tiết được sử dụng trong hàng không dân dụng làm nguồn dữ liệu được xác minh, cụ thể là METAR (Báo cáo khí tượng sân bay) và TAF (TAF - Dự báo sân bay ga). Trong ngành hàng không, mạng sống của hàng trăm người phụ thuộc vào thời tiết nên dự báo càng chính xác càng tốt.

Thông tin này được phát sóng XNUMX/XNUMX bằng giọng nói tại mọi sân bay hiện đại dưới dạng ATIS (Dịch vụ thông tin thiết bị đầu cuối tự động) và VOLMET (đến từ Pháp. chuyến bay - chuyến bay và Meteo - thời tiết). Cái đầu tiên cung cấp thông tin về thời tiết thực tế tại sân bay và cái thứ hai cung cấp dự báo trong 24-30 giờ tới, không chỉ tại sân bay phát sóng mà còn ở những sân bay khác.

Ví dụ về hoạt động ATIS tại sân bay Vnukovo:

Một ví dụ về cách thức hoạt động của VOLMET tại Sân bay Vnukovo

Thật bất tiện khi phải mang theo máy quét hoặc máy thu phát vô tuyến mọi lúc trong phạm vi tương ứng và tôi muốn tạo một bot trong Telegram, chỉ bằng một nút bấm, sẽ cho phép bạn nhận được dự báo tương tự. Ít nhất là không thực tế khi phân bổ một máy chủ riêng cho việc này, cũng như gửi yêu cầu đến Raspberry tại nhà của bạn.

Vì vậy tôi quyết định sử dụng dịch vụ làm backend Tính năng của đám mây Selectel. Số lượng yêu cầu sẽ không đáng kể, vì vậy dịch vụ như vậy sẽ hầu như miễn phí (theo tính toán của tôi, sẽ là 22 rúp cho 100 yêu cầu).

Chuẩn bị phụ trợ

Tạo một hàm

Trong bảng điều khiển my.selectel.ru mở chế độ xem Nền tảng đám mây và tạo một dự án mới:

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Sau khi tạo xong dự án, hãy chuyển đến phần Chức năng:

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Ấn nút Tạo một chức năng và đặt cho nó cái tên mong muốn:

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Sau khi nhấn Tạo một chức năng chúng ta sẽ có một biểu diễn của hàm đã tạo:

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Trước khi bắt đầu tạo mã bằng Python, bạn sẽ cần tạo bot trong Telegram. Tôi sẽ không mô tả cách thực hiện việc này - có hướng dẫn chi tiết trong cơ sở kiến ​​thức của chúng tôi. Điều chính đối với chúng tôi là mã thông báo của bot đã tạo.

Đang chuẩn bị mã

Tôi đã chọn Cơ quan Khí quyển và Đại dương Quốc gia (NOAA) làm nguồn dữ liệu đáng tin cậy. Cơ quan khoa học này cập nhật dữ liệu theo thời gian thực trên máy chủ của mình ở định dạng TXT.

Link lấy dữ liệu METAR (lưu ý trường hợp):

https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT

Trong trường hợp của tôi, sân bay gần nhất là Vnukovo, mã ICAO của nó là UUWW. Truy cập URL được tạo sẽ cung cấp thông tin sau:

2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG

Dòng đầu tiên là thời gian hiện tại của dự báo theo Giờ chuẩn Greenwich. Dòng thứ hai là tóm tắt về thời tiết thực tế. Các phi công hàng không dân dụng sẽ không gặp khó khăn gì khi hiểu ý nghĩa của đường này, nhưng chúng ta cần một lời giải thích:

  • [UUWW] — Vnukovo, Mátxcơva (Nga — RU);
  • [101130Z] — Ngày 10 hàng tháng, 11:30 sáng GMT;
  • [31004MPS] - hướng gió 310 độ, tốc độ 4 m/s;
  • [9999] - tầm nhìn ngang 10 km trở lên;
  • [SCT048] — các đám mây rải rác/rải rác ở độ cao 4800 feet (~1584m);
  • [24 / 13] - nhiệt độ 24°C, điểm sương 13°C;
  • [Q1014] - áp suất (QNH) 1014 hectopascal (750 mm Hg);
  • [R01/000070] - hệ số bám trên làn 01 - 0,70;
  • [NOSIG] - không có thay đổi đáng kể.

Hãy bắt đầu viết mã chương trình. Đầu tiên bạn cần nhập hàm yêu cầu и pytaf:

from urllib import request
import pytaf

Chỉ định các biến và chuẩn bị hàm giải mã:

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()

Hãy chuyển sang TAF (trường hợp này cũng quan trọng).

https://tgftp.nws.noaa.gov/data/forecasts/taf/stations/<код аэропорта по ICAO>.TXT

Như trong ví dụ trước, hãy xem dự báo tại sân bay 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

Chúng ta hãy đặc biệt chú ý đến các dòng TẠM THỜI и BECMG. TEMPO có nghĩa là thời tiết thực tế trong khoảng thời gian quy định sẽ thay đổi định kỳ. BECMG - thời tiết sẽ dần thay đổi trong một khoảng thời gian nhất định.

Tức là dòng:

TEMPO 1012/1020 -TSRA BKN020CB

Sẽ có nghĩa là:

  • [1012 / 1020] — từ 12 đến 20 giờ (Giờ chuẩn Greenwich);
  • [-TSRA] — giông bão (TS = giông bão) có mưa (RA = mưa) cường độ thấp (dấu trừ);
  • [BKN020CB] - các đám mây tích lũy (BKN = vỡ), tích lũy (CB = tích lũy) ở độ cao 2000 feet (610 mét) so với mực nước biển.

Có khá nhiều thuật ngữ mô tả các hiện tượng thời tiết và việc ghi nhớ chúng không hề dễ dàng. Mã cho yêu cầu TAF được viết theo cách tương tự.

Tải mã lên đám mây

Để không lãng phí thời gian, hãy lấy mẫu bot telegram từ kho lưu trữ của chúng tôi đám mây-telegram-bot. Có sự chuẩn bị trước Yêu cầu.txt и setup.py với cấu trúc thư mục chính xác.

Vì trong mã chúng ta sẽ truy cập vào mô-đun pytaf, thì phiên bản của nó sẽ được thêm ngay vào Yêu cầu.txt

pytaf~=1.2.1

  • Hãy chuyển sang chỉnh sửa bot/tele_bot.py. Chúng tôi loại bỏ tất cả những thứ không cần thiết và thêm mã của chúng tôi.

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)

  • Chúng tôi đóng gói toàn bộ thư mục vào một kho lưu trữ ZIP và chuyển đến bảng điều khiển để tìm chức năng đã tạo.
  • Nhấp vào đây Chỉnh sửa và tải xuống kho lưu trữ có mã.

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây

  • Điền đường dẫn tương đối trong file tele_bot (sự mở rộng .py có thể không được chỉ định) và hàm điểm cuối (trong ví dụ đã cho là chính).
  • Trong phần Biến môi trường viết một biến MÃ THÔNG BÁO và gán cho nó mã thông báo của bot telegram mong muốn.
  • Nhấp vào đây Lưu và mở rộng, sau đó chúng ta đi đến phần Kích hoạt.
  • Chúng tôi đặt công tắc Yêu cầu HTTPđể công khai yêu cầu.

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Bây giờ chúng tôi có một URL để gọi hàm một cách công khai. Tất cả những gì còn lại là cấu hình webhook. Tìm bot của chúng tôi @SelectelServerless_bot trong Telegram và đăng ký bot của bạn bằng lệnh:

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

Kết quả

Nếu mọi thứ được thực hiện chính xác, bot của bạn sẽ ngay lập tức bắt đầu hoạt động và hiển thị dự báo thời tiết hàng không mới nhất trực tiếp trong trình nhắn tin.

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây
Tất nhiên, mã có thể được cải thiện, nhưng ngay cả ở trạng thái hiện tại, nó cũng đủ để tìm ra thời tiết và dự báo chính xác nhất từ ​​một nguồn đáng tin cậy.

Bạn sẽ tìm thấy phiên bản đầy đủ của mã trong kho lưu trữ trên GitHub.

Dự báo thời tiết chính xác nhất: bot cho Telegram trên các chức năng đám mây

Nguồn: www.habr.com

Thêm một lời nhận xét