Skip to content

Instantly share code, notes, and snippets.

@LevBravE
Last active May 3, 2020 22:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LevBravE/358b076d92a19a03bc48d847a59c89bc to your computer and use it in GitHub Desktop.
Save LevBravE/358b076d92a19a03bc48d847a59c89bc to your computer and use it in GitHub Desktop.
# импортируем библиотеки
from flask import Flask, request
import logging
# библиотека, которая нам понадобится для работы с JSON
import json
# создаем приложение
# мы передаем __name__, в нем содержится информация, в каком модуле мы находимся.
# В данном случае там содержится '__main__', так как мы обращаемся к переменной из запущенного модуля.
# если бы такое обращение, например, произошло внутри модуля logging, то мы бы получили 'logging'
app = Flask(__name__)
# Устанавливаем уровень логирования
logging.basicConfig(level=logging.INFO)
# Создадим словарь, чтобы для каждой сессии общения с навыком хранились подсказки, которые видел пользователь.
# Это поможет нам немного разнообразить подсказки ответов (buttons в JSON ответа).
# Когда новый пользователь напишет нашему навыку, то мы сохраним в этот словарь запись формата
# sessionStorage[user_id] = { 'suggests': ["Не хочу.", "Не буду.", "Отстань!" ] }
# Такая запись говорит, что мы показали пользователю эти три подсказки. Когда он откажется купить слона,
# то мы уберем одну подсказку. Как будто что-то меняется :)
sessionStorage = {}
@app.route('/post', methods=['POST'])
# Функция получает тело запроса и возвращает ответ.
# Внутри функции доступен request.json - это JSON, который отправила нам Алиса в запросе POST
def main():
logging.info('Request: %r', request.json)
# Начинаем формировать ответ, согласно документации
# мы собираем словарь, который потом при помощи библиотеки json преобразуем в JSON и отдадим Алисе
response = {
'session': request.json['session'],
'version': request.json['version'],
'response': {
'end_session': False
}
}
# Отправляем request.json и response в функцию handle_dialog. Она сформирует оставшиеся поля JSON, которые отвечают
# непосредственно за ведение диалога
handle_dialog(request.json, response)
logging.info('Response: %r', request.json)
# Преобразовываем в JSON и возвращаем
return json.dumps(response)
def handle_dialog(req, res):
user_id = req['session']['user_id']
if req['session']['new']:
# Это новый пользователь.
# Инициализируем сессию и поприветствуем его.
# Запишем подсказки, которые мы ему покажем в первый раз
sessionStorage[user_id] = {
'suggests': [
"Не хочу.",
"Не буду.",
"Отстань!",
]
}
# Заполняем текст ответа
res['response']['text'] = 'Привет! Купи слона!'
# Получим подсказки
res['response']['buttons'] = get_suggests(user_id)
return
# Сюда дойдем только, если пользователь не новый, и разговор с Алисой уже был начат
# Обрабатываем ответ пользователя.
# В req['request']['original_utterance'] лежит весь текст, что нам прислал пользователь
# Если он написал 'ладно', 'куплю', 'покупаю', 'хорошо', то мы считаем, что пользователь не согласился.
# Подумайте, все ли в этом фрагменте написано "красиво"?
if req['request']['original_utterance'].lower() in [
'ладно',
'куплю',
'покупаю',
'хорошо'
]:
# Пользователь согласился, прощаемся.
res['response']['text'] = 'Слона можно найти на Яндекс.Маркете!'
res['response']['end_session'] = True
return
# Если нет, то убеждаем его купить слона!
res['response']['text'] = 'Все говорят "%s", а ты купи слона!' % (
req['request']['original_utterance']
)
res['response']['buttons'] = get_suggests(user_id)
# Функция возвращает две подсказки для ответа.
def get_suggests(user_id):
session = sessionStorage[user_id]
# Выбираем две первые подсказки из массива.
suggests = [
{'title': suggest, 'hide': True}
for suggest in session['suggests'][:2]
]
# Убираем первую подсказку, чтобы подсказки менялись каждый раз.
session['suggests'] = session['suggests'][1:]
sessionStorage[user_id] = session
# Если осталась только одна подсказка, предлагаем подсказку
# со ссылкой на Яндекс.Маркет.
if len(suggests) < 2:
suggests.append({
"title": "Ладно",
"url": "https://market.yandex.ru/search?text=слон",
"hide": True
})
return suggests
if __name__ == '__main__':
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment