-
Notifications
You must be signed in to change notification settings - Fork 0
/
flask_app.py
122 lines (97 loc) · 6.12 KB
/
flask_app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# импортируем библиотеки
from flask import Flask, request
import logging
import os
from waitress import serve
# библиотека, которая нам понадобится для работы с JSON
import json
# создаем приложение
# мы передаем __name__, в нем содержится информация, в каком модуле мы находимся.
# В данном случае там содержится '__main__', так как мы обращаемся к переменной из запущенного модуля.
# если бы такое обращение, например, произошло внутри модуля logging, то мы бы получили 'logging'
app = Flask(__name__)
# Устанавливаем уровень логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(name)s %(message)s')
# Создадим словарь, чтобы для каждой сессии общения с навыком хранились подсказки, которые видел пользователь.
# Это поможет нам немного разнообразить подсказки ответов (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 any(word in req['request']['original_utterance'].lower() for word 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__':
port = int(os.environ.get('PORT', 5000))
serve(app, port=port, host="0.0.0.0")