[Python] Погода-бот: DialogFlow + OpenWeather + Python
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Постановка задачи
Задача ставилась следующим образом: написать телеграм-бота, который распознавал бы вопросы о том, какая сегодня погода в том или ином городе и выдавал информацию о погоде.
DialogFlow
Для распознавания человеческой речи как нельзя лучше подходит фреймворк DialogFlow, уже имеющий встроенный в него ML. Давайте приступим к работе.
Переходим по ссылке https://dialogflow.cloud.google.com/, авторизуемся в своем аккаунте гугл и переходим на страницу создания бота. Нажимаем на «Create new agent» и вводим имя агенту: «weather-bot». Выбираем дефолтный язык русский.
Основной объект, с которым работает DialogFlow — интенты или намерения. При взаимодействии с ботом всегда срабатывает то или иное намерение, и задача вас как разработчика — сопроводить каждое намерение разнообразными тренировочными фразами, чтобы бот каждый раз максимально правильно угадывал тот или иной интент.
Итак, переходим во вкладку «Intents». При создании бота автоматически создаются два интента: «Default Fallback Intent» и «Default Welcome Intent». Welcome Intent вызывается тогда, когда происходит запуск бота либо вы пишете ему приветственное сообщение. Fallback вызывается во всех случаях, когда бот не понимает, что вы ему пишете, т.е. во всех случаях, когда ни один другой интент не срабатывает. Оставляем дефолтные интенты без изменений и жмем на «Create intent», называя его «get-weather». Именно с этим намерением мы и продолжим работать в данной статье.
Переходим в наш интент «get-weather», затем — во вкладку «Training phrases» и создаем несколько тренировочных фраз, например, таких:
Заметим, что 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, jsonify
import requests
import json
from 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". Должно получиться что-то похожее на следующее:
Теперь запускаем наше Python-приложение. Осталось совсем немного — подключить интеграцию с Telegram. Переходим на вкладку «Integrations», выбираем телеграм, далее следуем инструкции по получению токена, вставляем токен, и вуаля — приложение готово! Остается его протестировать:
Надеюсь, данная статья была вам полезна и сподвигнет на собственные эксперименты в этой области. Код проекта доступен по ссылке.
===========
Источник:
habr.com
===========
Похожие новости:
- [Python, Алгоритмы, Машинное обучение, Обработка изображений] Код аудита: поиск дублей, face detection и аномальные изображения
- [Python, Программирование] Как я заработал 30$ на ставках на спорт
- [Python] Создание Discord-бота на Python. Часть 1
- Релиз JPype 1.0, библиотеки для доступа к Java-классам из Python
- [Node.JS, PHP, Perl, Python, Информационная безопасность] Трюки с переменными среды (перевод)
- [IT-компании, JavaScript, Python, Управление разработкой] Практики хорошего code review, или что такое code review за 15 минут. Доклад Никиты Соболева на DUMP в Казани
- [DevOps, Python, Анализ и проектирование систем, Искусственный интеллект, Машинное обучение] Общий обзор архитектуры сервиса для оценки внешности на основе нейронных сетей
- [PostgreSQL, Python, Администрирование баз данных] PgGraph — утилита для архивации и поиска зависимостей таблиц в PostgreSQL
- [JavaScript, Python, Программирование, Разработка веб-сайтов] Надоел JavaScript — используй браузерный Python (перевод)
- [Django, IT-инфраструктура, Разработка под Linux, Системное администрирование] Как мы автоматизировали весь жизненный цикл серверов
Теги для поиска: #_python, #_python, #_dialogflow, #_weather_api, #_flask, #_python
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:56
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Постановка задачи Задача ставилась следующим образом: написать телеграм-бота, который распознавал бы вопросы о том, какая сегодня погода в том или ином городе и выдавал информацию о погоде. DialogFlow Для распознавания человеческой речи как нельзя лучше подходит фреймворк DialogFlow, уже имеющий встроенный в него ML. Давайте приступим к работе. Переходим по ссылке https://dialogflow.cloud.google.com/, авторизуемся в своем аккаунте гугл и переходим на страницу создания бота. Нажимаем на «Create new agent» и вводим имя агенту: «weather-bot». Выбираем дефолтный язык русский. Основной объект, с которым работает DialogFlow — интенты или намерения. При взаимодействии с ботом всегда срабатывает то или иное намерение, и задача вас как разработчика — сопроводить каждое намерение разнообразными тренировочными фразами, чтобы бот каждый раз максимально правильно угадывал тот или иной интент. Итак, переходим во вкладку «Intents». При создании бота автоматически создаются два интента: «Default Fallback Intent» и «Default Welcome Intent». Welcome Intent вызывается тогда, когда происходит запуск бота либо вы пишете ему приветственное сообщение. Fallback вызывается во всех случаях, когда бот не понимает, что вы ему пишете, т.е. во всех случаях, когда ни один другой интент не срабатывает. Оставляем дефолтные интенты без изменений и жмем на «Create intent», называя его «get-weather». Именно с этим намерением мы и продолжим работать в данной статье. Переходим в наш интент «get-weather», затем — во вкладку «Training phrases» и создаем несколько тренировочных фраз, например, таких: Заметим, что 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, jsonify
import requests import json from 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". Должно получиться что-то похожее на следующее: Теперь запускаем наше Python-приложение. Осталось совсем немного — подключить интеграцию с Telegram. Переходим на вкладку «Integrations», выбираем телеграм, далее следуем инструкции по получению токена, вставляем токен, и вуаля — приложение готово! Остается его протестировать: Надеюсь, данная статья была вам полезна и сподвигнет на собственные эксперименты в этой области. Код проекта доступен по ссылке. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:56
Часовой пояс: UTC + 5