أدق توقعات الطقس: بوت لـ Telegram على وظائف السحابة



هناك الكثير من الخدمات التي توفر معلومات عن الطقس ، ولكن أي منها نصدق؟ عندما بدأت ركوب الدراجات كثيرًا ، كنت أرغب في الحصول على أدق المعلومات حول أحوال الطقس في المنطقة التي أركب فيها.



كانت الفكرة الأولى هي بناء محطة طقس صغيرة DIY بها أجهزة استشعار وتلقي البيانات منها. لكنني لم أعد اختراع العجلة واخترت معلومات الطقس المستخدمة في الطيران المدني ، مثل METAR ( تقرير METeorological Aerodrome) و TAF (TAF - توقعات المطارات) كمصدر للبيانات التي تم التحقق منها . في مجال الطيران ، تعتمد حياة مئات الأشخاص على الطقس ، لذلك تكون التوقعات دقيقة قدر الإمكان.



يتم بث هذه المعلومات على مدار الساعة عن طريق الصوت في كل مطار حديث على شكل ATIS (خدمة معلومات المحطة الطرفية التلقائية) و VOLMET (من المجلد الفرنسي - رحلة جوية وطقس - طقس). الأول يوفر معلومات حول الطقس الفعلي في المطار ، والثاني يوفر توقعات لمدة 24-30 ساعة القادمة ، ليس فقط في مطار البث ، ولكن أيضًا في مطار آخر.



مثال على ATIS في مطار فنوكوفو:




مثال على VOLMET في مطار فنوكوفو




من غير الملائم أن أحمل معي ماسحًا لاسلكيًا أو جهاز إرسال واستقبال إلى النطاق المقابل في كل مرة ، وأردت إنشاء روبوت في Telegram ، والذي يتيح لي ، بالضغط على زر ، الحصول على نفس التوقعات. يعد تخصيص خادم منفصل لهذا الأمر غير عملي على الأقل ، بالإضافة إلى طلبات القيادة إلى منزل Raspberry.



لذلك ، قررت استخدام خدمة Selectel Cloud Functions كخلفية . سيكون عدد الطلبات ضئيلًا ، لذا ستكلف هذه الخدمة مجانًا تقريبًا (وفقًا لحساباتي ، ستكون 22 روبل لكل 100000 طلب).



إعداد الواجهة الخلفية



خلق الوظيفة



في لوحة التحكم my.selectel.ru ، افتح عرض Cloud Platform وأنشئ مشروعًا جديدًا:





بعد إنشاء المشروع ، انتقل إلى قسم الوظائف :





انقر فوق زر إنشاء وظيفة وأعطها الاسم المطلوب:





بعد النقر فوق إنشاء وظيفة ، سيكون لدينا عرض للوظيفة التي تم إنشاؤها:





قبل البدء في إنشاء كود 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] - فنوكوفو ، موسكو (روسيا - روسيا) ؛
  • [101130Z] - اليوم العاشر من الشهر ، 11:30 بتوقيت غرينتش ؛
  • [31004MPS] - اتجاه الرياح 310 درجة وسرعة 4 م / ث ؛
  • [9999] - الرؤية الأفقية 10 كم أو أكثر ؛
  • [SCT048] - سحب مبعثرة / متفرقة على ارتفاع 4800 قدم (~ 1584 م) ؛
  • [24/13] - درجة الحرارة 24 درجة مئوية ، نقطة الندى 13 درجة مئوية ؛
  • [Q1014] - الضغط ( QNH ) 1014 هيكتوباسكال (750 ملم زئبق) ؛
  • [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


انتبه بشكل خاص لخطوط TEMPO و BECMG . يعني TEMPO أن الطقس الفعلي خلال الفترة المحددة سيتغير بشكل دوري. BECMG - سيتغير الطقس تدريجياً خلال الفترة الزمنية المحددة.



هذا هو الخط:



TEMPO 1012/1020 -TSRA BKN020CB


سيعني:



  • [1012/1020] - بين 12:00 و 20:00 (GMT) ؛
  • [-TSRA] - عاصفة رعدية (TS = عاصفة رعدية) مع مطر (RA = مطر) منخفض الشدة (علامة ناقص) ؛
  • [BKN020CB] سحب ركامية كبيرة (BKN = مكسورة) (CB = ركامية) على ارتفاع 2000 قدم (610 متر) فوق مستوى سطح البحر.


هناك الكثير من المصطلحات التي تعني ظواهر الطقس ، ومن الصعب تذكرها. تتم كتابة رمز طلب TAF بطريقة مماثلة.



تحميل الكود على السحابة



حتى لا نضيع الوقت ، دعنا نأخذ قالب برقية برقية من مستودع البرقية السحابية لدينا . هناك متطلبات معدة مسبقًا .txt و setup.py مع بنية الدليل الصحيحة.



نظرًا لأننا سنشير في الكود إلى وحدة pytaf ، يجب إضافة نسخته على الفور إلى 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 ) - ( main).
  • TOKEN -.
  • , .
  • HTTP-, .




لدينا الآن عنوان URL لاستدعاء وظيفة عامة. يبقى فقط لتهيئة webhook . ابحث عن الروبوت الخاص بنا SelectelServerless_bot في Telegram وقم بتسجيل الروبوت الخاص بك باستخدام الأمر:



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


نتيجة



إذا تم كل شيء بشكل صحيح ، فسيبدأ الروبوت الخاص بك على الفور في العمل ويعرض تقرير طقس الطيران الحالي في برنامج المراسلة.





بالطبع ، يمكن تعديل الكود ، ولكن حتى في حالته الحالية ، يكفي اكتشاف حالة الطقس الأكثر دقة والتنبؤات من مصدر موثوق.



يمكنك العثور على النسخة الكاملة من الكود في مستودعنا على GitHub .






All Articles