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

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

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

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

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

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

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

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

تحضير الواجهة الخلفية

إنشاء وظيفة

في لوحة التحكم my.selectel.ru منظر مفتوح منصة سحابية وإنشاء مشروع جديد:

أدق توقعات الطقس: روبوت لـ Telegram على وظائف السحابة
بعد إنشاء المشروع ، انتقل إلى القسم وظائف:

أدق توقعات الطقس: روبوت لـ Telegram على وظائف السحابة
اضغط على الزر قم بإنشاء وظيفة وأعطها الاسم المطلوب:

أدق توقعات الطقس: روبوت لـ Telegram على وظائف السحابة
بعد النقر قم بإنشاء وظيفة سيكون لدينا تمثيل للوظيفة التي تم إنشاؤها:

أدق توقعات الطقس: روبوت لـ Telegram على وظائف السحابة
قبل البدء في إنشاء كود 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 и setup.py مع بنية الدليل الصحيحة.

منذ ذلك الحين في الكود سوف نشير إلى الوحدة بيتاف، ثم يجب إضافة نسخته على الفور إلى 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 وانتقل إلى لوحة التحكم إلى الوظيفة التي تم إنشاؤها.
  • انقر تحرير وتنزيل الأرشيف بالرمز.

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

  • املأ المسار النسبي في الملف tele_bot (امتداد .py يمكن حذفها) ووظيفة نقطة النهاية (في المثال أعلاه ، هذا رئيسي).
  • في القسم متغيرات البيئة اكتب متغير TOKEN وقم بتعيين الرمز المميز لبوت برقية المطلوب.
  • انقر احفظ ووسع، ثم انتقل إلى القسم مشغلات.
  • نضع المفتاح طلب HTTPلجعل الطلب عامًا.

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

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

نتيجة

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

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

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

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

المصدر: www.habr.com

إضافة تعليق