Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Awọn iṣẹ pupọ lo wa ti o pese alaye oju ojo, ṣugbọn ewo ni o yẹ ki o gbẹkẹle? Nigbati mo bẹrẹ gigun kẹkẹ nigbagbogbo, Mo fẹ lati ni alaye ti o peye julọ nipa awọn ipo oju-ọjọ ni ibiti Mo ti gun.

Ero mi akọkọ ni lati kọ ibudo oju ojo kekere DIY pẹlu awọn sensọ ati gba data lati ọdọ rẹ. Ṣugbọn Emi ko “tun kẹkẹ naa pada” ati yan alaye oju-ọjọ ti o lo ninu ọkọ oju-ofurufu ara ilu gẹgẹbi orisun data ti o jẹrisi, eyun METAR (METeorological Aerodrome Iroyin) ati iṣẹ (TAF - Asọtẹlẹ Aerodrome Terminal). Ni ọkọ ofurufu, awọn igbesi aye awọn ọgọọgọrun eniyan da lori oju ojo, nitorinaa awọn asọtẹlẹ jẹ deede bi o ti ṣee.

Alaye yii jẹ ikede XNUMX/XNUMX nipasẹ ohun ni gbogbo papa ọkọ ofurufu ode oni ni fọọmu naa ATIS (Aifọwọyi ebute Alaye Service) ati VOLMET (lati Faranse. flight - ofurufu ati Meteo - oju ojo). Ni igba akọkọ ti pese alaye nipa oju ojo gangan ni papa ọkọ ofurufu, ati keji pese asọtẹlẹ fun awọn wakati 24-30 to nbọ, kii ṣe ni aaye afẹfẹ igbohunsafefe nikan, ṣugbọn tun ni awọn miiran.

Apẹẹrẹ ti iṣẹ ATIS ni papa ọkọ ofurufu Vnukovo:

Apeere ti bii VOLMET ṣe n ṣiṣẹ ni Papa ọkọ ofurufu Vnukovo

Ko ṣe aibalẹ lati gbe ọlọjẹ redio tabi transceiver pẹlu rẹ ni gbogbo igba fun ibiti o baamu, ati pe Mo fẹ lati ṣẹda bot ni Telegram ti, ni titẹ bọtini kan, gba ọ laaye lati gba asọtẹlẹ kanna. O kere ju iwulo lati pin olupin lọtọ fun eyi, bakanna bi fifiranṣẹ awọn ibeere si Rasipibẹri ile rẹ.

Nitorinaa, Mo pinnu lati lo iṣẹ naa bi ẹhin Selectel awọsanma Awọn ẹya ara ẹrọ. Nọmba awọn ibeere yoo jẹ aifiyesi, nitorinaa iru iṣẹ bẹẹ yoo jẹ ọfẹ (gẹgẹbi awọn iṣiro mi, yoo jẹ 22 rubles fun awọn ibeere 100).

Backend igbaradi

Ṣiṣẹda Iṣẹ kan

Ni awọn iṣakoso nronu my.selectel.ru ṣii wiwo Awọsanma Syeed ati ṣẹda iṣẹ akanṣe tuntun:

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Lẹhin ti a ṣẹda ise agbese, lọ si apakan Awọn iṣẹ:

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Titari bọtini naa Ṣẹda iṣẹ kan ki o si fun ni orukọ ti o fẹ:

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Lẹhin titẹ Ṣẹda iṣẹ kan a yoo ni aṣoju iṣẹ ti a ṣẹda:

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Ṣaaju ki o to bẹrẹ ṣiṣẹda koodu ni Python, iwọ yoo nilo lati ṣẹda bot ni Telegram. Emi kii yoo ṣe apejuwe bi eyi ṣe ṣe - awọn ilana alaye wa ninu ipilẹ imọ wa. Ohun akọkọ fun wa ni ami ti bot ti a ṣẹda.

Ngbaradi koodu

Mo yan National Oceanic and Atmospheric Administration (NOAA) gẹgẹbi orisun data ti o gbẹkẹle. Ile-ibẹwẹ imọ-jinlẹ yii ṣe imudojuiwọn data ni akoko gidi lori olupin rẹ ni ọna kika TXT.

Ọna asopọ lati gba data METAR (ṣe akiyesi ọran naa):

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

Ninu ọran mi, papa ọkọ ofurufu ti o sunmọ julọ jẹ Vnukovo, koodu ICAO rẹ jẹ UUWW. Lilọ si URL ti ipilẹṣẹ yoo fun ni atẹle:

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

Laini akọkọ jẹ akoko lọwọlọwọ ti asọtẹlẹ ni Akoko Itumọ Greenwich. Laini keji jẹ akopọ ti oju ojo gangan. Awọn awakọ ọkọ ofurufu ti ilu kii yoo ni iṣoro lati ni oye kini laini yii tumọ si, ṣugbọn a nilo alaye kan:

  • [UUWW] - Vnukovo, Moscow (Russia - RU);
  • [101130Z] - Ọjọ kẹwa ti oṣu, 10:11 owurọ GMT;
  • [31004MPS] - itọsọna afẹfẹ 310 iwọn, iyara 4 m / s;
  • [9999] - hihan petele 10 km tabi diẹ ẹ sii;
  • [SCT048] - awọn awọsanma ti a ti tuka / ti o ti tuka ni awọn ẹsẹ 4800 (~ 1584 m);
  • [24 / 13] - iwọn otutu 24 ° C, aaye ìri 13 ° C;
  • [Q1014] - titẹ (QNH) 1014 hectopascals (750 mm Hg);
  • [R01/000070] - olùsọdipúpọ ti adhesion lori ona 01 - 0,70;
  • [NOSIG] - lai significant ayipada.

Jẹ ki a bẹrẹ kikọ koodu eto. Ni akọkọ o nilo lati gbe awọn iṣẹ wọle ìbéèrè и pytaf:

from urllib import request
import pytaf

Pato awọn oniyipada ati mura iṣẹ iyipada:

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

Jẹ ki a lọ si TAF (ọran tun ṣe pataki).

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

Gẹgẹbi apẹẹrẹ ti tẹlẹ, jẹ ki a wo asọtẹlẹ ni papa ọkọ ofurufu 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

Jẹ ki a paapa san ifojusi si awọn ila TEMPO и BECMG. TEMPO tumọ si pe oju ojo gangan lakoko akoko ti a sọ pato yoo yipada lorekore. BECMG - oju ojo yoo yipada ni diėdiė laarin akoko kan pato.

Iyẹn ni, ila:

TEMPO 1012/1020 -TSRA BKN020CB

Yoo tumọ si:

  • [1012 / 1020] - laarin awọn wakati 12 ati 20 (Aago Itumọ Greenwich);
  • [-TSRA] - ãra (TS = ãra) pẹlu ojo (RA = ojo) ti kekere kikankikan (ami iyokuro);
  • [BKN020CB] - pataki (BKN = baje), cumulonimbus (CB = cumulonimbus) awọsanma ni 2000 ẹsẹ (610 mita) loke ipele okun.

Awọn ofin pupọ lo wa fun awọn iyalẹnu oju ojo, ati iranti wọn nira. Awọn koodu fun TAF ìbéèrè ti wa ni kikọ ni a iru ona.

Ikojọpọ koodu si awọsanma

Ni ibere ki o ma ṣe padanu akoko, jẹ ki a mu awoṣe bot telegram kan lati ibi ipamọ wa awọsanma-telegram-bot. Ti pese sile tẹlẹ wa awọn ibeere.txt и setup.py pẹlu awọn ti o tọ liana be.

Niwon ninu koodu a yoo wọle si module pytaf, lẹhinna ẹya rẹ yẹ ki o wa ni afikun lẹsẹkẹsẹ si awọn ibeere.txt

pytaf~=1.2.1

  • Jẹ ki a tẹsiwaju si ṣiṣatunkọ bot/tele_bot.py. A yọ gbogbo awọn nkan ti ko wulo ati ṣafikun koodu wa.

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)

  • A ṣe akopọ gbogbo ilana sinu ibi ipamọ ZIP kan ki o lọ si igbimọ iṣakoso si iṣẹ ti a ṣẹda.
  • Ti Ṣatunkọ ati ki o gba awọn pamosi pẹlu awọn koodu.

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma

  • Fọwọsi ọna ojulumo ninu faili naa tele_bot (itẹsiwaju .py le ma wa ni pato) ati awọn ẹya endpoint iṣẹ (ninu awọn apẹẹrẹ fun yi ni akọkọ).
  • Ninu ori iwe Awọn iyipada Ayika kọ oniyipada Àmi ki o si fun ni ami ami ti bot telegram ti o fẹ.
  • Ti Fipamọ ati Faagun, lẹhin eyi a lọ si apakan awọn okunfa.
  • A fi yipada HTTP ìbéèrèlati ṣe ibeere ni gbangba.

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
A ni URL kan fun pipe iṣẹ naa ni gbangba. Gbogbo nkan to ku ni tunto webhook. Wa bot wa @SelectelServerless_bot ni Telegram ati forukọsilẹ bot rẹ pẹlu aṣẹ:

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

Esi

Ti ohun gbogbo ba ṣe ni deede, bot rẹ yoo bẹrẹ ṣiṣẹ lẹsẹkẹsẹ ati ṣafihan ijabọ oju ojo oju-ofurufu tuntun taara ninu ojiṣẹ naa.

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma
Nitoribẹẹ, koodu naa le ni ilọsiwaju, ṣugbọn paapaa ni ipo lọwọlọwọ o to lati wa oju ojo deede julọ ati asọtẹlẹ lati orisun ti o gbẹkẹle.

Iwọ yoo wa ẹya kikun ti koodu ninu wa awọn ibi ipamọ lori GitHub.

Asọtẹlẹ oju-ọjọ deede julọ: bot fun Telegram lori awọn iṣẹ awọsanma

orisun: www.habr.com

Fi ọrọìwòye kun