рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рд╣рд╡рд╛рдорд╛рдирд╛рдЪреА рдорд╛рд╣рд┐рддреА рджреЗрдгрд╛рд░реНтАНрдпрд╛ рдмрд░реНтАНрдпрд╛рдЪ рд╕реЗрд╡рд╛ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рддреБрдореНрд╣реА рдХреЛрдгрд╛рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рд╛рд╡рд╛? рдЬреЗрд╡реНрд╣рд╛ рдореА рд╡рд╛рд░рдВрд╡рд╛рд░ рд╕рд╛рдпрдХрд▓ рдЪрд╛рд▓рд╡рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА, рддреЗрд╡реНрд╣рд╛ рдореА рдЬреНрдпрд╛ рдард┐рдХрд╛рдгреА рд╕рд╛рдпрдХрд▓ рдЪрд╛рд▓рд╡рддреЛ рддреНрдпрд╛ рдард┐рдХрд╛рдгрдЪреНрдпрд╛ рд╣рд╡рд╛рдорд╛рдирд╛рдЪреА рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рдорд╛рд╣рд┐рддреА рдорд▓рд╛ рд╣рд╡реА рд╣реЛрддреА.

рд╕реЗрдиреНрд╕рд░реНрд╕рд╕рд╣ рдПрдХ рд▓рд╣рд╛рди DIY рд╣рд╡рд╛рдорд╛рди рд╕реНрдЯреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рдЭрд╛ рдкрд╣рд┐рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрддрд╛. рдкрд░рдВрддреБ рдореА "рдЪрд╛рдХ рдкреБрдиреНрд╣рд╛ рд╢реЛрдзреВрди рдХрд╛рдврд▓реЗ" рдирд╛рд╣реА рдЖрдгрд┐ рд╕рддреНрдпрд╛рдкрд┐рдд рдбреЗрдЯрд╛рдЪрд╛ рд╕реНрд░реЛрдд рдореНрд╣рдгреВрди рдирд╛рдЧрд░реА рд╡рд┐рдорд╛рди рд╡рд╛рд╣рддреВрдХ рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд░реНтАНрдпрд╛ рд╣рд╡рд╛рдорд╛рди рдорд╛рд╣рд┐рддреАрдЪреА рдирд┐рд╡рдб рдХреЗрд▓реА, рдореНрд╣рдгрдЬреЗ рдореЗрдЯрд╛рд░ (Meteorological Aerodrome Report) рдЖрдгрд┐ рдЯреАрдПрдПрдл (TAF - рдЯрд░реНрдорд┐рдирд▓ рдПрд░реЛрдбреНрд░реЛрдо рдЕрдВрджрд╛рдЬ). рд╡рд┐рдорд╛рдирдЪрд╛рд▓рдирд╛рдд, рд╢реЗрдХрдбреЛ рд▓реЛрдХрд╛рдВрдЪреЗ рдЬреАрд╡рди рд╣рд╡рд╛рдорд╛рдирд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рдЕрдВрджрд╛рдЬ рд╢рдХреНрдп рддрд┐рддрдХреЗ рдЕрдЪреВрдХ рдЕрд╕рддрд╛рдд.

рд╣реА рдорд╛рд╣рд┐рддреА рдлреЙрд░реНрдордордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдзреБрдирд┐рдХ рдПрдЕрд░рдлреАрд▓реНрдбрд╡рд░ рдЖрд╡рд╛рдЬрд╛рджреНрд╡рд╛рд░реЗ XNUMX/XNUMX рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ рдПрдЯреАрдЖрдпрдПрд╕ (рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЯрд░реНрдорд┐рдирд▓ рдорд╛рд╣рд┐рддреА рд╕реЗрд╡рд╛) рдЖрдгрд┐ VOLMET (рдлреНрд░реЗрдВрдЪрдордзреВрди. рдЦрдВрдб - рдлреНрд▓рд╛рдЗрдЯ рдЖрдгрд┐ m├йt├йo - рд╣рд╡рд╛рдорд╛рди). рдкрд╣рд┐рд▓рд╛ рдПрдЕрд░рдлрд┐рд▓реНрдбрд╡рд░реАрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╡рд╛рдорд╛рдирд╛рд╡рд┐рд╖рдпреА рдорд╛рд╣рд┐рддреА рдкреНрд░рджрд╛рди рдХрд░рддреЛ рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдкреБрдвреАрд▓ 24-30 рддрд╛рд╕рд╛рдВрдЪрд╛ рдЕрдВрджрд╛рдЬ рдкреНрд░рджрд╛рди рдХрд░рддреЛ, рдХреЗрд╡рд│ рдкреНрд░рд╕рд╛рд░рдг рдПрдЕрд░рдлрд┐рд▓реНрдбрд╡рд░рдЪ рдирд╛рд╣реА рддрд░ рдЗрддрд░рд╛рдВрд╕рд╛рдареА рджреЗрдЦреАрд▓.

Vnukovo рд╡рд┐рдорд╛рдирддрд│рд╛рд╡рд░реАрд▓ ATIS рдСрдкрд░реЗрд╢рдирдЪреЗ рдЙрджрд╛рд╣рд░рдг:

VOLMET Vnukovo рд╡рд┐рдорд╛рдирддрд│рд╛рд╡рд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдпрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг

рд╕рдВрдмрдВрдзрд┐рдд рд╢реНрд░реЗрдгреАрд╕рд╛рдареА рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдЖрдкрд▓реНрдпрд╛рд╕реЛрдмрдд рд░реЗрдбрд┐рдУ рд╕реНрдХреЕрдирд░ рдХрд┐рдВрд╡рд╛ рдЯреНрд░рд╛рдиреНрд╕реАрд╡реНрд╣рд░ рдШреЗрдКрди рдЬрд╛рдгреЗ рдЧреИрд░рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдордордзреНрдпреЗ рдПрдХ рдмреЙрдЯ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ рдЬреЛ рдПрдХрд╛ рдмрдЯрдгрд╛рдЪреНрдпрд╛ рдХреНрд▓рд┐рдХрд╡рд░, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рдорд╛рди рдЕрдВрджрд╛рдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдИрд▓. рдпрд╛рд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдЯрдк рдХрд░рдгреЗ, рддрд╕реЗрдЪ рддреБрдордЪреНрдпрд╛ рдШрд░рд╛рддреАрд▓ рд░рд╛рд╕реНрдкрдмреЗрд░реАрд▓рд╛ рд╡рд┐рдирдВрддреНрдпрд╛ рдкрд╛рдард╡рдгреЗ рдХрд┐рдорд╛рди рдЕрд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЖрд╣реЗ.

рдореНрд╣рдгреВрди, рдореА рдмреЕрдХрдПрдВрдб рдореНрд╣рдгреВрди рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд┐рд▓реЗ Selectel рдХреНрд▓рд╛рдЙрдб рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ. рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдирдЧрдгреНрдп рдЕрд╕реЗрд▓, рдореНрд╣рдгреВрди рдЕрд╢реА рд╕реЗрд╡рд╛ рдЕрдХреНрд╖рд░рд╢рдГ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЕрд╕реЗрд▓ (рдорд╛рдЭреНрдпрд╛ рдЧрдгрдиреЗрдиреБрд╕рд╛рд░, 22 рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╕рд╛рдареА рддреЗ 100 рд░реВрдмрд▓ рдЕрд╕реЗрд▓).

рдмреЕрдХрдПрдВрдбрдЪреА рддрдпрд╛рд░реА

рдПрдХ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рд╛

рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓рдордзреНрдпреЗ my.selectel.ru рджреГрд╢реНрдп рдЙрдШрдбрд╛ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдЖрдгрд┐ рдПрдХ рдирд╡реАрди рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рд╛:

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛ рдХрд╛рд░реНрдпреЗ:

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рдмрдЯрдг рджрд╛рдмрд╛ рдПрдХ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╡ рджреНрдпрд╛:

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рджрд╛рдмрд▓реНрдпрд╛рдирдВрддрд░ рдПрдХ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрдВрдХреНрд╢рдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЕрд╕реЗрд▓:

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рддреБрдореНрд╣реА 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

рдкрд╣рд┐рд▓реА рдУрд│ рд╣реА рдЧреНрд░реАрдирд╡рд┐рдЪ рдореАрди рдЯрд╛рдЗрдордордзреАрд▓ рдЕрдВрджрд╛рдЬрд╛рдЪреА рд╡рд░реНрддрдорд╛рди рд╡реЗрд│ рдЖрд╣реЗ. рджреБрд╕рд░реА рдУрд│ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╡рд╛рдорд╛рдирд╛рдЪрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдЖрд╣реЗ. рдирд╛рдЧрд░реА рд╡рд┐рдорд╛рдирдЪрд╛рд▓рди рд╡реИрдорд╛рдирд┐рдХрд╛рдВрдирд╛ рдпрд╛ рдУрд│реАрдЪрд╛ рдЕрд░реНрде рдХрд╛рдп рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдд рдХреЛрдгрддреАрд╣реА рдЕрдбрдЪрдг рдпреЗрдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣рд╡реЗ рдЖрд╣реЗ:

  • [UUWW] - рд╡рдиреБрдХреЛрд╡реЛ, рдореЙрд╕реНрдХреЛ (рд░рд╢рд┐рдпрд╛ - рдЖрд░рдпреВ);
  • [резрежрезрезрейрежрдЭреЗрдб] тАФ рдорд╣рд┐рдиреНрдпрд╛рдЪрд╛ 10рд╡рд╛ рджрд┐рд╡рд╕, рд╕рдХрд╛рд│реА 11:30 GMT;
  • [рейрезрежрежрекрдПрдордкреАрдПрд╕] тАФ рд╡рд╛рд▒реНрдпрд╛рдЪреА рджрд┐рд╢рд╛ рейрезреж рдЕрдВрд╢, рдЧрддреА рек рдореА/рд╕реЗ;
  • [9999] - рдХреНрд╖реИрддрд┐рдЬ рджреГрд╢реНрдпрдорд╛рдирддрд╛ 10 рдХрд┐рдореА рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ;
  • [SCT048] тАФ рекреорежреж рдлреВрдЯ (~резрелреорек рдореА) рд╡рд░ рд╡рд┐рдЦреБрд░рд▓реЗрд▓реЗ/рд╡рд┐рдЦреБрд░рд▓реЗрд▓реЗ рдврдЧ;
  • [рез/реи] - рддрд╛рдкрдорд╛рди 24┬░C, рджрд╡рдмрд┐рдВрджреВ 13┬░C;
  • [рдкреНрд░.резрежрезрек] тАФ рджрд╛рдм (QNH) 1014 рд╣реЗрдХреНрдЯреЛрдкрд╛рд╕реНрдХрд▓реНрд╕ (750 mm Hg);
  • [R01/000070] тАФ рд▓реЗрди 01 тАФ 0,70 рд╡рд░ рдЖрд╕рдВрдЬрди рдЧреБрдгрд╛рдВрдХ;
  • [NOSIG] - рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рдВрд╢рд┐рд╡рд╛рдп.

рдЪрд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд▓рд┐рд╣рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛. рдкреНрд░рдердо рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлрдВрдХреНрд╢рдиреНрд╕ рдЖрдпрд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рд╡рд┐рдирдВрддреА ╨╕ pytaf:

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

рдЪрд▓рд╛ рд╡рд┐рд╢реЗрд╖рддрдГ рдУрд│реАрдВрдХрдбреЗ рд▓рдХреНрд╖ рджреЗрдКрдпрд╛ рдЯреЗрдореНрдкреЛ ╨╕ BECMG. рдЯреЗрдореНрдкреЛрдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд╛рд▓рд╛рд╡рдзреАрддреАрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╡рд╛рдорд╛рди рд╡реЗрд│реЛрд╡реЗрд│реА рдмрджрд▓реЗрд▓. BECMG - рдард░рд╛рд╡рд┐рдХ рдХрд╛рд▓рд╛рд╡рдзреАрдд рд╣рд╡рд╛рдорд╛рди рд╣рд│реВрд╣рд│реВ рдмрджрд▓реЗрд▓.

рдореНрд╣рдгрдЬреЗ, рдУрд│:

TEMPO 1012/1020 -TSRA BKN020CB

рдпрд╛рдЪрд╛ рдЕрд░реНрде рд╣реЛрдИрд▓:

  • [рез/реи] - 12 рддреЗ 20 рддрд╛рд╕рд╛рдВрдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди (рдЧреНрд░реАрдирд╡рд┐рдЪ рдореАрди рдЯрд╛рдЗрдо);
  • [-TSRA] тАФ рдЧрдбрдЧрдбрд╛рдЯ (TS = рдЧрдбрдЧрдбрд╛рдЯреА рд╡рд╛рджрд│) рдкрд╛рдКрд╕ (RA = рдкрд╛рдКрд╕) рд╕рд╣ рдХрдореА рддреАрд╡реНрд░рддреЗрдЪрд╛ (рд╡рдЬрд╛ рдЪрд┐рдиреНрд╣);
  • [BKN020CB] - рд╕рдореБрджреНрд░рд╕рдкрд╛рдЯреАрдкрд╛рд╕реВрди 2000 рдлреВрдЯ (610 рдореАрдЯрд░) рдЙрдВрдЪреАрд╡рд░ рд▓рдХреНрд╖рдгреАрдп (BKN = рддреБрдЯрд▓реЗрд▓реЗ), cumulonimbus (CB = cumulonimbus) рдврдЧ.

рд╣рд╡рд╛рдорд╛рдирд╛рдЪреНрдпрд╛ рдШрдЯрдиреЗрд╕рд╛рдареА рдмрд░реНтАНрдпрд╛рдЪ рдЕрдЯреА рдЖрд╣реЗрдд рдЖрдгрд┐ рддреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреЗ рдХрдареАрдг рдЖрд╣реЗ. TAF рд╡рд┐рдирдВрддреАрд╕рд╛рдареА рдХреЛрдб рдЕрд╢рд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ.

рдХреНрд▓рд╛рдЙрдбрд╡рд░ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ

рд╡реЗрд│ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡реВ рдирдпреЗ рдореНрд╣рдгреВрди, рдЖрдордЪреНрдпрд╛ рднрд╛рдВрдбрд╛рд░рд╛рддреВрди рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЗрдК cloud-telegram-bot. рдПрдХ рдкреВрд░реНрд╡ рддрдпрд╛рд░реА рдЖрд╣реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛.txt ╨╕ setup.py рдпреЛрдЧреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдиреЗрд╕рд╣.

рдХреЛрдбрдордзреНрдпреЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ рдЖрдкрдг рдореЙрдбреНрдпреВрд▓рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгрд╛рд░ рдЖрд╣реЛрдд pytaf, рдирдВрддрд░ рддреНрдпрд╛рдЪреА рдЖрд╡реГрддреНрддреА рддреНрд╡рд░рд┐рдд рдЬреЛрдбрд▓реА рдЬрд╛рд╡реА рдЖрд╡рд╢реНрдпрдХрддрд╛.txt

pytaf~=1.2.1

  • рдЪрд▓рд╛ рд╕рдВрдкрд╛рджрдирд╛рдХрдбреЗ рд╡рд│реВрдпрд╛ bot/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)

  • рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдбрд┐рд░реЗрдХреНрдЯрд░реА рдЭрд┐рдк рдЖрд░реНрдХрд╛рдЗрд╡реНрд╣рдордзреНрдпреЗ рдкреЕрдХ рдХрд░рддреЛ рдЖрдгрд┐ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрдВрдХреНрд╢рдирд╡рд░ рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓рд╡рд░ рдЬрд╛рддреЛ.
  • рдкреБрд╢ рд╕реБрдзрд╛рд░рдгреЗ рдЖрдгрд┐ рдХреЛрдбрд╕рд╣ рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛.

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ

  • рдлрд╛рдИрд▓рдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд░реНрдЧ рднрд░рд╛ tele_bot (рд╡рд┐рд╕реНрддрд╛рд░ .рдкреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА) рдЖрдгрд┐ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдлрдВрдХреНрд╢рди (рджрд┐рд▓реЗрд▓реНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рд╣реЗ рдЖрд╣реЗ рдореБрдЦреНрдп).
  • рд╡рд┐рднрд╛рдЧ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░рд┐рд╡рд░реНрддрдиреЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд▓рд┐рд╣рд╛ рдЯреЛрдХрди рдЖрдгрд┐ рддреНрдпрд╛рд╕ рдЗрдЪреНрдЫрд┐рдд рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯрдЪреЗ рдЯреЛрдХрди рдирд┐рдпреБрдХреНрдд рдХрд░рд╛.
  • рдкреБрд╢ рдЬрддрди рдХрд░рд╛ рдЖрдгрд┐ рд╡рд┐рд╕реНрддреГрдд рдХрд░рд╛, рдЬреНрдпрд╛рдирдВрддрд░ рдЖрдореНрд╣реА рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛рддреЛ рдЯреНрд░рд┐рдЧрд░.
  • рдЖрдореНрд╣реА рд╕реНрд╡рд┐рдЪ рдареЗрд╡рддреЛ HTTP рд╡рд┐рдирдВрддреАрд╡рд┐рдирдВрддреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрддрд╛ рдлрдВрдХреНрд╢рдирд▓рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХрдкрдгреЗ рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА URL рдЖрд╣реЗ. рдмрд╛рдХреА рдЖрд╣реЗ рддреЗ рд╡реЗрдмрд╣реБрдХ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛. рдЖрдордЪреЗ рдмреЙрдЯ рд╢реЛрдзрд╛ @SelectelServerless_bot рдЯреЗрд▓реАрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдгрд┐ рдХрдорд╛рдВрдбрд╕рд╣ рддреБрдордЪрд╛ рдмреЙрдЯ рдиреЛрдВрджрдгреА рдХрд░рд╛:

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

рдкрд░рд┐рдгрд╛рдо

рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдордЪрд╛ рдмреЙрдЯ рддрд╛рдмрдбрддреЛрдм рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрд▓ рдЖрдгрд┐ рдирд╡реАрдирддрдо рд╡рд┐рдорд╛рдирдЪрд╛рд▓рди рд╣рд╡рд╛рдорд╛рди рдЕрд╣рд╡рд╛рд▓ рдереЗрдЯ рдореЗрд╕реЗрдВрдЬрд░рдордзреНрдпреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрд▓.

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ
рдЕрд░реНрдерд╛рдд, рдХреЛрдб рд╕реБрдзрд╛рд░рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рджреНрдп рд╕реНрдерд┐рддреАрдд рджреЗрдЦреАрд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЖрдгрд┐ рдЕрдВрджрд╛рдЬ рд╢реЛрдзрдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ.

рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдХреЛрдбрдЪреА рдкреВрд░реНрдг рдЖрд╡реГрддреНрддреА рдорд┐рд│реЗрд▓ GitHub рд╡рд░ рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдЬ.

рд╕рд░реНрд╡рд╛рдд рдЕрдЪреВрдХ рд╣рд╡рд╛рдорд╛рди рдЕрдВрджрд╛рдЬ: рдХреНрд▓рд╛рдЙрдб рдлрдВрдХреНрд╢рдиреНрд╕рд╡рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛