هناك الكثير من الخدمات التي توفر معلومات حول الطقس ، ولكن أي منها تثق به؟ عندما بدأت في ركوب الدراجة في كثير من الأحيان ، كنت أرغب في الحصول على أدق المعلومات حول أحوال الطقس في المكان الذي أركب فيه.
كانت فكرتي الأولى هي تجميع محطة طقس صغيرة DIY بها أجهزة استشعار وتلقي البيانات منها. لكنني لم "أعد اختراع العجلة" واخترت معلومات الطقس المستخدمة في الطيران المدني كمصدر للبيانات التي تم التحقق منها ، وهي METAR (تقرير مطار الأرصاد الجوية) و TAF (TAF - توقعات المطارات). في مجال الطيران ، تعتمد حياة مئات الأشخاص على الطقس ، لذا فإن التنبؤات دقيقة قدر الإمكان.
يتم بث هذه المعلومات على مدار الساعة بصوت في كل مطار حديث في الشكل ATIS (خدمة معلومات المحطة الطرفية التلقائية) و فولميت (من الفرنسية المجلد - رحلة و طقس - طقس). الأول يوفر معلومات حول الطقس الفعلي في المطار ، والثاني - التوقعات لمدة 24-30 ساعة القادمة ، ليس فقط في مطار البث ، ولكن أيضًا في أماكن أخرى.
مثال على تشغيل ATIS في مطار فنوكوفو:
مثال على تشغيل VOLMET في مطار فنوكوفو
في كل مرة يكون من غير المناسب أن تحمل معك ماسحًا لاسلكيًا أو جهاز إرسال واستقبال إلى النطاق المناسب ، وأردت إنشاء روبوت في Telegram ، والذي يتيح لك ، بلمسة زر واحدة ، الحصول على نفس التوقعات. يعد تخصيص خادم منفصل لهذا أمرًا غير مفيد على الأقل ، بالإضافة إلى إرسال الطلبات إلى منزل Raspberry.
لذلك ، كخلفية ، قررت استخدام الخدمة
تحضير الواجهة الخلفية
إنشاء وظيفة
في لوحة التحكم
بعد إنشاء المشروع ، انتقل إلى القسم وظائف:
اضغط على الزر قم بإنشاء وظيفة وأعطها الاسم المطلوب:
بعد النقر قم بإنشاء وظيفة سيكون لدينا تمثيل للوظيفة التي تم إنشاؤها:
قبل البدء في إنشاء كود Python ، تحتاج إلى إنشاء روبوت في Telegram. لن أصف كيف يتم ذلك - هناك تعليمات مفصلة
كود الطبخ
اخترت الإدارة الوطنية للمحيطات والغلاف الجوي (NOAA) كمصدر للبيانات الموثوقة. تقوم هذه الوكالة العلمية بتحديث البيانات في الوقت الفعلي على خادمها بتنسيق TXT.
رابط للحصول على بيانات METAR (لاحظ التسجيل):
https://tgftp.nws.noaa.gov/data/observations/metar/stations/<код аэропорта по ICAO>.TXT
في حالتي ، فإن أقرب مطار هو فنوكوفو ، ورمز منظمة الطيران المدني الدولي هو UUWW. سيؤدي الانتقال إلى عنوان URL الذي تم إنشاؤه إلى إنتاج ما يلي:
2020/08/10 11:30
UUWW 101130Z 31004MPS 9999 SCT048 24/13 Q1014 R01/000070 NOSIG
السطر الأول هو توقيت جرينتش الخاص بالتنبؤ. السطر الثاني هو ملخص للطقس الفعلي. لن يواجه طيارو الطيران المدني أي مشكلة في فهم معنى هذا الخط ، لكننا نحتاج إلى نسخة طبق الأصل:
- [UUWW] - فنوكوفو ، موسكو (روسيا - RU) ؛
- [101130 زد] - اليوم العاشر من الشهر ، 10:11 بتوقيت جرينتش ؛
- [31004 ميجا بايت في الثانية] - اتجاه الرياح 310 درجة وسرعة 4 م / ث ؛
- [9999] - رؤية أفقية تبلغ 10 كم أو أكثر ؛
- [SCT048] - سحب متناثرة / متناثرة على ارتفاع 4800 قدم (~ 1584 م) ؛
- [24 / 13] - درجة الحرارة 24 درجة مئوية ، نقطة الندى 13 درجة مئوية ؛
- [س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 بطريقة مماثلة.
قم بتحميل الكود إلى السحابة
حتى لا نضيع الوقت ، دعنا نأخذ قالب روبوت برقية من مستودعنا
منذ ذلك الحين في الكود سوف نشير إلى الوحدة بيتاف، ثم يجب إضافة نسخته على الفور إلى requirements.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)
- نقوم بحزم الدليل بأكمله في أرشيف ZIP وانتقل إلى لوحة التحكم إلى الوظيفة التي تم إنشاؤها.
- انقر تحرير وتنزيل الأرشيف بالرمز.
- املأ المسار النسبي في الملف tele_bot (امتداد .py يمكن حذفها) ووظيفة نقطة النهاية (في المثال أعلاه ، هذا رئيسي).
- في القسم متغيرات البيئة اكتب متغير TOKEN وقم بتعيين الرمز المميز لبوت برقية المطلوب.
- انقر احفظ ووسع، ثم انتقل إلى القسم مشغلات.
- نضع المفتاح طلب HTTPلجعل الطلب عامًا.
لدينا عنوان URL لاستدعاء الوظيفة العامة. كل ما تبقى هو
/setwebhook <you bot token> <public URL of your function>
نتيجة
إذا تم كل شيء بشكل صحيح ، فسيبدأ الروبوت الخاص بك على الفور في العمل ويعرض تقرير الطقس الحالي للطيران مباشرة في برنامج المراسلة.
بالطبع ، يمكن تحسين الكود ، ولكن حتى في حالته الحالية ، يكفي اكتشاف حالة الطقس الأكثر دقة والتنبؤات من مصدر موثوق.
يمكنك العثور على النسخة الكاملة من الكود في موقعنا
المصدر: www.habr.com