Bot cuaca: DialogFlow + OpenWeather + Python

Rumusan masalah



Tugasnya ditetapkan sebagai berikut: menulis bot telegram yang akan mengenali pertanyaan tentang cuaca di kota tertentu dan memberikan informasi tentang cuaca.



DialogFlow



Framework DialogFlow, yang sudah memiliki ML di dalamnya, paling sesuai untuk pengenalan ucapan manusia. Ayo mulai bekerja.



Ikuti tautan https://dialogflow.cloud.google.com/ , masuk ke akun Google Anda dan buka halaman pembuatan bot. Klik "Buat agen baru" dan masukkan nama untuk agen tersebut: "bot cuaca". Kami memilih bahasa default Rusia.



gambar



Objek utama yang bekerja dengan DialogFlow adalah maksud atau maksud. Saat berinteraksi dengan bot, niat ini atau itu selalu berhasil, dan tugas Anda sebagai pengembang adalah untuk menyertai setiap niat dengan berbagai frasa pelatihan sehingga bot dapat menebak maksud ini atau itu dengan benar setiap saat.



Jadi, buka tab "Intents". Saat membuat bot, dua maksud dibuat secara otomatis: "Maksud Pengembalian Default" dan "Maksud Selamat Datang Default". Intent Selamat Datang dipanggil saat bot dijalankan atau Anda menulis pesan selamat datang padanya. Fallback dipanggil dalam semua kasus ketika bot tidak memahami apa yang Anda tulis, yaitu. dalam semua kasus ketika tidak ada maksud lain yang berhasil. Biarkan maksud default tidak berubah dan klik "Buat maksud", beri nama "get-weather". Dengan niat inilah kami akan terus mengerjakan artikel ini.



gambar



Buka maksud "memahami cuaca", lalu ke tab "Frasa pelatihan" dan buat beberapa frasa pelatihan, misalnya, berikut ini:



gambar



Perhatikan bahwa DialogFlow secara otomatis mendeteksi kota sebagai parameter lokasi. Ini sangat mudah, karena kita akan meneruskan parameter ini ke backend aplikasi kita.



Ada sangat sedikit yang harus dilakukan di DialogFlow itu sendiri - untuk memungkinkan webhook berinteraksi dengan backend bot kita. Untuk melakukan ini, gulir ke bawah, luaskan tab "Fulfillment" dan centang kotak "Aktifkan panggilan webhook untuk maksud ini".



Kembali



Mari mulai menulis sisi server bot kita. Kami akan menulis dengan Python bersama dengan Flask. OpenWeather API dipilih untuk mendapatkan informasi cuaca . Daftarkan di situs ini, maka Anda akan menerima API KEY melalui surat - ini akan dibutuhkan dalam aplikasi kami. Selain itu, karena informasi tentang cuaca di API ini dikembalikan oleh parameter lintang dan bujur - lebar dan bujur - kita perlu mengubah kota menjadi lebar dan bujurnya. Library Geopy Python akan membantu kami dalam hal ini.



Kami mengimpor semua yang kami butuhkan:



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


Buat aplikasi Flask:



app = Flask(__name__)


dan masukkan API KEY kami ke dalam variabel API_KEY:



API_KEY = '<your_API_KEY_here>'


Kami menulis rute untuk jalur "/":



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


dan kemudian fungsi results (), di mana semua logika program akan diimplementasikan:



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))}


Tetap menambahkan rute yang akan dilalui transisi ke aplikasi kita, sebut saja webhook:



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


dan jalankan aplikasinya:



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


Kita berhasil!



Dan itu semua?



Tidak juga. Program ini ada di komputer lokal kami, tetapi DialogFlow tidak tahu apa-apa tentangnya. Untuk mengubah mesin kita menjadi server yang akan tersedia di Internet, kita memerlukan utilitas khusus. Ngrok memenuhi persyaratan ini . Unduh, luncurkan, dan masukkan yang berikut ini di konsol: "ngrok http 5000". Tautan https akan muncul, yang harus disalin dan ditempatkan di DialogFlow. Salin, buka Fulfillment in DialogFlow, atur Webhook ke aktif dan tempel link ke bidang yang dihasilkan. Kami menambahkan rute, mis. "/ webhook". Anda akan mendapatkan hasil yang mirip dengan berikut ini:



gambar



Sekarang kami meluncurkan aplikasi Python kami. Ada sangat sedikit yang tersisa - untuk menghubungkan integrasi dengan Telegram. Buka tab "Integrasi", pilih telegram, lalu ikuti petunjuk untuk mendapatkan token, masukkan token, dan voila - aplikasi sudah siap! Ini tetap untuk mengujinya:



gambar



Saya harap artikel ini bermanfaat bagi Anda dan akan mendorong Anda untuk bereksperimen sendiri di bidang ini. Kode proyek tersedia di sini .



All Articles