Weather bot:DialogFlow + OpenWeather + Python

問題の定式化



タスクは次のように設定されました。特定の都市の今日の天気に関する質問を認識し、天気に関する情報を提供する電報ボットを作成します。



DialogFlow



すでにMLが組み込まれているDialogFlowフレームワークは、人間の音声認識に最適です。仕事に取り掛かりましょう。



リンクhttps://dialogflow.cloud.google.com/をたどり、Googleアカウントにログインして、ボット作成ページに移動します。 「Createnewagent」をクリックし、エージェントの名前「weather-bot」を入力します。デフォルトの言語であるロシア語を選択します。



画像



DialogFlowが機能する主なオブジェクトは、インテントまたはインテントです。ボットと対話するとき、1つまたは別の意図が常に機能します。開発者としてのあなたのタスクは、ボットが毎回これまたはその意図を可能な限り正確に推測できるように、各意図にさまざまなトレーニングフレーズを添えることです。



したがって、[インテント]タブに移動します。ボットを作成すると、「デフォルトのフォールバックインテント」と「デフォルトのウェルカムインテント」の2つのインテントが自動的に作成されます。ウェルカムインテントは、ボットが起動したとき、またはボットにウェルカムメッセージを書き込んだときに呼び出されます。フォールバックは、ボットが何を書き込んでいるかをボットが理解できない場合にすべて呼び出されます。他の意図が機能しない場合はすべて。デフォルトのインテントを変更せずに、「インテントの作成」をクリックして、「get-weather」と呼びます。この記事で作業を続けるのはこの意図によるものです。



画像



「get-weather」インテントに移動し、次に「Trainingphrases」タブに移動して、次のようないくつかのトレーニングフレーズを作成します。



画像



DialogFlowは、ロケーションパラメータとして都市を自動的に検出することに注意してください。これらのパラメータをアプリケーションのバックエンドに渡すため、これは非常に便利です。



DialogFlow自体で行うことはほとんど残っていません。Webhookがボットのバックエンドと対話できるようにするためです。これを行うには、一番下までスクロールし、[フルフィルメント]タブを展開して、[このインテントのWebhook呼び出しを有効にする]にチェックマークを付けます。



バック



ボットのサーバー側の作成を始めましょう。Flaskと組み合わせてPythonで記述します。OpenWeather APIは、気象情報を取得するために選択されましたこのサイトに登録すると、APIKEYがメールで届きます。これはアプリケーションで必要になります。さらに、このAPIの天気に関する情報は、緯度と経度のパラメーター(幅と経度)によって返されるため、何らかの方法で都市を幅と経度に変換する必要があります。geopy Pythonライブラリは、これを支援します。



必要なものはすべてインポートします。



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


Flaskアプリケーションを作成します。



app = Flask(__name__)


APIKEYをAPI_KEY変数に挿入します。



API_KEY = '<your_API_KEY_here>'


「/」パスのルートを記述します。



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


次に、results()関数。この関数では、プログラムのすべてのロジックが実装されます。



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はこれらの要件を満たしていますダウンロードして起動し、コンソールに「ngrokhttp5000」と入力します。httpsリンクが表示されます。これをコピーして、DialogFlowに配置する必要があります。コピーして、DialogFlowのフルフィルメントに移動し、Webhookを有効な状態にして、結果のフィールドにリンクを貼り付けます。ルートを追加します。「/ webhook」。次のような結果になるはずです。



画像



次に、Pythonアプリケーションを起動します。Telegramとの統合を接続するための残りはほとんどありません。[統合]タブに移動し、電報を選択してから、トークンを取得するための指示に従い、トークンを挿入すると、出来上がりです。アプリケーションの準備ができました。それをテストすることは残っています:



画像



この記事があなたに役立ち、この分野であなた自身で実験することを奨励することを願っています。プロジェクトコードはこちらから入手できます



All Articles