Русский
Русский
English
Статистика
Реклама

Погода-бот DialogFlow OpenWeather Python

Постановка задачи


Задача ставилась следующим образом: написать телеграм-бота, который распознавал бы вопросы о том, какая сегодня погода в том или ином городе и выдавал информацию о погоде.

DialogFlow


Для распознавания человеческой речи как нельзя лучше подходит фреймворк DialogFlow, уже имеющий встроенный в него ML. Давайте приступим к работе.

Переходим по ссылке https://dialogflow.cloud.google.com/, авторизуемся в своем аккаунте гугл и переходим на страницу создания бота. Нажимаем на Create new agent и вводим имя агенту: weather-bot. Выбираем дефолтный язык русский.

image

Основной объект, с которым работает DialogFlow интенты или намерения. При взаимодействии с ботом всегда срабатывает то или иное намерение, и задача вас как разработчика сопроводить каждое намерение разнообразными тренировочными фразами, чтобы бот каждый раз максимально правильно угадывал тот или иной интент.

Итак, переходим во вкладку Intents. При создании бота автоматически создаются два интента: Default Fallback Intent и Default Welcome Intent. Welcome Intent вызывается тогда, когда происходит запуск бота либо вы пишете ему приветственное сообщение. Fallback вызывается во всех случаях, когда бот не понимает, что вы ему пишете, т.е. во всех случаях, когда ни один другой интент не срабатывает. Оставляем дефолтные интенты без изменений и жмем на Create intent, называя его get-weather. Именно с этим намерением мы и продолжим работать в данной статье.

image

Переходим в наш интент get-weather, затем во вкладку Training phrases и создаем несколько тренировочных фраз, например, таких:

image

Заметим, что DialogFlow автоматически определяет города как параметры location. Это очень удобно, поскольку мы будем передавать эти самые параметры в бэкенд нашего приложения.

В самом DialogFlow осталось сделать совсем немного разрешить ему вебхуки для взаимодействия с бэкендом нашего бота. Для этого листаем в самый низ, разворачиваем вкладку Fulfillment и ставим галочку на Enable webhook call for this intent.

Бэк


Приступим к написанию серверной части нашего бота. Писать будем на Python в связке с Flask. Для получения информации о погоде был выбран OpenWeather API. Зарегистрируйтесь на этом сайте, затем вам на почту придет API KEY он и понадобится в нашем приложении. Кроме того, поскольку информация о погоде в этом API выдается по параметрам latitude и longitude ширина и долгота нам необходимо как-то преобразовывать город в его ширину и долготу. В этом нам поможет Python-библиотека geopy.

Импортируем все необходимое:

from flask import Flask, request, make_response, jsonifyimport requestsimport jsonfrom geopy.geocoders import Nominatim

Создаем Flask application:

app = Flask(__name__)

и вставляем в переменную API_KEY свой 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. Скачиваем ее, запускаем и вводим в консоли следующее: ngrok http 5000. Появится https-ссылка, которую необходимо скопировать и поместить в DialogFlow. Копируем, переходим в Fulfillment в DialogFlow, ставим Webhook в состояние enabled и вставляем в получившееся поле ссылку. Дописываем роут, т.е. "/webhook". Должно получиться что-то похожее на следующее:

image

Теперь запускаем наше Python-приложение. Осталось совсем немного подключить интеграцию с Telegram. Переходим на вкладку Integrations, выбираем телеграм, далее следуем инструкции по получению токена, вставляем токен, и вуаля приложение готово! Остается его протестировать:

image

Надеюсь, данная статья была вам полезна и сподвигнет на собственные эксперименты в этой области. Код проекта доступен по ссылке.
Источник: habr.com
К списку статей
Опубликовано: 18.07.2020 00:05:02
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Dialogflow

Weather api

Flask

Категории

Последние комментарии

© 2006-2020, personeltest.ru