روبوت الطقس: DialogFlow + OpenWeather + Python

صياغة المشكلة



تم تعيين المهمة على النحو التالي: كتابة روبوت برقية يتعرف على الأسئلة المتعلقة بالطقس اليوم في مدينة معينة ويعطي معلومات حول الطقس.



DialogFlow



يعتبر إطار عمل DialogFlow ، الذي يحتوي بالفعل على ML مدمجًا فيه ، هو الأنسب للتعرف على الكلام البشري. لنبدأ العمل.



اتبع الرابط https://dialogflow.cloud.google.com/ ، وقم بتسجيل الدخول إلى حساب Google الخاص بك وانتقل إلى صفحة إنشاء الروبوت. انقر فوق "إنشاء وكيل جديد" وأدخل اسم الوكيل: "weather-bot". نختار اللغة الافتراضية الروسية.



صورة



الكائن الرئيسي الذي يعمل به DialogFlow هو النوايا أو النوايا. عند التفاعل مع روبوت ، فإن هذه النية أو تلك تعمل دائمًا ، ومهمة أنت كمطور هي مرافقة كل نية بعبارات تدريبية مختلفة حتى يخمن الروبوت هذه النية أو تلك بشكل صحيح قدر الإمكان في كل مرة.



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



صورة



انتقل إلى نية "get-weather" الخاصة بنا ، ثم إلى علامة التبويب "عبارات التدريب" وقم بإنشاء عدة عبارات تدريبية ، على سبيل المثال ، ما يلي:



صورة



لاحظ أن DialogFlow يكتشف تلقائيًا المدن كمعلمات موقع. هذا مناسب للغاية ، لأننا سنمرر هذه المعلمات بالذات إلى الواجهة الخلفية لتطبيقنا.



لم يتبق سوى القليل جدًا للقيام به في DialogFlow نفسه - للسماح لخطافات الويب بالتفاعل مع الواجهة الخلفية لبرنامج الروبوت الخاص بنا. للقيام بذلك ، قم بالتمرير لأسفل إلى أسفل ، وقم بتوسيع علامة التبويب "الوفاء" وحدد مربع "تمكين استدعاء الرد التلقائي على الويب لهذه النية".



عودة



لنبدأ في كتابة جانب الخادم في برنامج الروبوت الخاص بنا. سنكتب في بايثون بالتزامن مع Flask. تم اختيار OpenWeather API للحصول على معلومات الطقس . قم بالتسجيل في هذا الموقع ، ثم ستتلقى API KEY عن طريق البريد - ستكون هناك حاجة إليه في تطبيقنا. بالإضافة إلى ذلك ، نظرًا لأن المعلومات حول الطقس في واجهة برمجة التطبيقات هذه يتم إرجاعها من خلال معلمات خطوط الطول والعرض - العرض وخط الطول - نحتاج إلى تحويل المدينة بطريقة ما إلى عرضها وخط الطول. ستساعدنا مكتبة Geopy Python في ذلك.



نستورد كل ما نحتاجه:



from flask import Flask, request, make_response, jsonify
import requests
import json
from geopy.geocoders import Nominatim


إنشاء تطبيق Flask:



app = Flask(__name__)


وأدخل API KEY في متغير API_KEY:



API_KEY = '<your_API_KEY_here>'


نكتب مسارًا للمسار "/":



@app.route('/')
def index():
    return 'Hello World!'


ثم وظيفة النتائج () ، التي سيتم فيها تنفيذ منطق البرنامج بالكامل:



def results():
    req = request.get_json(force=True)

    action = req.get('queryResult').get('action')

    result = req.get("queryResult")
    parameters = result.get("parameters")

    if parameters.get('location').get('city'):
        geolocator = Nominatim(user_agent='weather-bot')
        location = geolocator.geocode(parameters.get('location').get('city'))
        lat = location.latitude
        long = location.longitude
        weather_req = requests.get('https://api.openweathermap.org/data/2.5/onecall?lat={}&lon={}&appid={}'.format(lat, long, API_KEY))
        current_weather = json.loads(weather_req.text)['current']
        temp = round(current_weather['temp'] - 273.15)
        feels_like = round(current_weather['feels_like'] - 273.15)
        clouds = current_weather['clouds']
        wind_speed = current_weather['wind_speed']

    return {'fulfillmentText': '   - {} ,   {} ,  - {}%,   - {}/'.format(str(temp), str(feels_like), str(clouds), str(wind_speed))}


يبقى إضافة المسار الذي سيكون عليه الانتقال إلى تطبيقنا ، فلنطلق عليه webhook:



@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
    return make_response(jsonify(results()))


وقم بتشغيل التطبيق:



if __name__ == '__main__':
   app.run(debug=True)


لقد فعلناها!



وهل كل شيء؟



ليس صحيحا. البرنامج موجود على جهازنا المحلي ، لكن DialogFlow لا يعرف شيئًا عنه. لتحويل أجهزتنا إلى خادم سيصبح متاحًا على الإنترنت ، نحتاج إلى أداة مساعدة خاصة. نجروك يلبي هذه المتطلبات . قم بتنزيله وتشغيله وأدخل ما يلي في وحدة التحكم: "ngrok http 5000". سيظهر رابط https ، والذي يجب نسخه ووضعه في DialogFlow. انسخ ، انتقل إلى Fulfillment في DialogFlow ، ضع Webhook في حالة التمكين والصق الرابط في الحقل الناتج. نضيف الطريق ، أي "/ webhook". يجب أن ينتهي بك الأمر بشيء مشابه لما يلي:



صورة



الآن نطلق تطبيق Python الخاص بنا. لم يتبق سوى القليل جدًا - لربط التكامل مع Telegram. انتقل إلى علامة التبويب "عمليات التكامل" ، وحدد البرقية ، ثم اتبع التعليمات للحصول على رمز مميز ، وأدخل الرمز المميز ، وفويلا - التطبيق جاهز! يبقى اختباره:



صورة



آمل أن يكون هذا المقال مفيدًا لك وسوف يشجعك على التجربة بنفسك في هذا المجال. كود المشروع متاح هنا .



All Articles