История
• 2016 год. В чатботов додумались
запихнуть кнопки. Начинается
хайп
[email protected] 4
Slide 6
Slide 6 text
История
• 2016 год. В чатботов додумались
запихнуть кнопки. Начинается
хайп
• FB выкатывает Messenger API
[email protected] 4
Slide 7
Slide 7 text
История
• 2016 год. В чатботов додумались
запихнуть кнопки. Начинается
хайп
• FB выкатывает Messenger API
• Viber выкатывает Public Account
API
[email protected] 4
Slide 8
Slide 8 text
История
• 2016 год. В чатботов додумались
запихнуть кнопки. Начинается
хайп
• FB выкатывает Messenger API
• Viber выкатывает Public Account
API
• ... и мы пилим свой
конструктор
[email protected] 4
Как организовать выполнение команд?
Договориться о формате команд
• Что мы зашиваем в кнопки
пользователю?
Придумать, как их
маршрутизировать
• Когда эти команды прилетают к
нам: как их распознавать?
[email protected] 11
Slide 16
Slide 16 text
Как организовать выполнение команд?
# вьюха DRF
def receive_webhook(request, bot_uuid):
chat_id = request.data['chat_id']
payload = request.data['payload']
# вход в логику
def do_logic(bot_uuid, chat_id, payload):
...
[email protected] 12
Slide 17
Slide 17 text
Как организовать выполнение команд?
# Может быть, так?
# высылаем пейлоады типа "get_node_10",
# "answer_question_15", "choose_operator_3"
if payload.startswith('get_node'):
return get_node(payload)
elif payload.startswith('answer_question'):
return answer_question(payload)
elif ...
# еще 100 условий
[email protected] 13
Regular views vs. nested views
• Обычные вьюхи: резолвятся обычным urlconf, принимают Request и
возвращают Response.
• Вложенные вьюхи: резолвятся вложенным urlconf, принимают BotRequest и
возвращают BotResponse.
def get_node(botrequest, node_id):
node = Node.objects.get(pk=node_id)
response = build_response(botrequest, node)
return BotResponse(messages=response.messages)
[email protected] 19
Slide 24
Slide 24 text
Инсайт: скорость urlconf
Если у вас очень много урлов, то resolve по подмножеству
urlconf намного дешевле, чем по всему urlconf
resolve('/get_node/15/')
# 1000 runs: 2.3576704149367 s
resolve('/get_node/15/', urlconf='apps.routing.urls')
# 1000 runs: 0.0216069859853 s
[email protected] 20
Slide 25
Slide 25 text
Инсайт: скорость urlconf
То же самое с reverse и с template-тегом {% url %}.
{% for obj in objects %}
{% endfor %}
Если объектов objects много - это замедлит вам
рендер шаблона
[email protected] 21
Что мы говорим
клиентам
• "Чатбот за 5 минут!"
• "Без навыков
программирования!"
[email protected] 22
Slide 29
Slide 29 text
Что мы говорим
клиентам
• "Чатбот за 5 минут!"
• "Без навыков
программирования!"
• "Визуальный конструктор!"
[email protected] 22
Slide 30
Slide 30 text
Что мы говорим
клиентам
• "Чатбот за 5 минут!"
• "Без навыков
программирования!"
• "Визуальный конструктор!"
• ...это не совсем так.
[email protected] 23
Slide 31
Slide 31 text
Как отправить сообщение в ФБ
{
"payload": {
"text": "Выберите свою пиццу",
"buttons": [
{
"type": "postback",
"data": "pizza1",
"title": "Маргарита"
},
{
"type": "postback",
"data": "pizza2",
"title": "Четыре сыра"
}
]
}
}
[email protected] 24
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
[email protected] 31
Slide 43
Slide 43 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
[email protected] 31
Slide 44
Slide 44 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
[email protected] 31
Slide 45
Slide 45 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
• Переключиться на др.блок
[email protected] 31
Slide 46
Slide 46 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
• Переключиться на др.блок
• Отправить сообщение
[email protected] 31
Slide 47
Slide 47 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
• Переключиться на др.блок
• Отправить сообщение
• Отправить email
[email protected] 31
Slide 48
Slide 48 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
• Переключиться на др.блок
• Отправить сообщение
• Отправить email
• ...
[email protected] 31
Slide 49
Slide 49 text
Как настраивать бизнес-логику?
• Нужен способ писать логику на простом мета-языке
• Язык должен быть безопасным (rm -rf)
• Язык должен выполнять типовые команды
• Переключиться на др.блок
• Отправить сообщение
• Отправить email
• ...
• Язык должен быть легко тестируемым и расширяемым
[email protected] 31
Slide 50
Slide 50 text
Что если...
{% for item in objects %}
{% if item.expired %}
Срок истек
{% else %}
Срок: {% now %}
{% endif %}
{% endfor %}
[email protected] 32
Slide 51
Slide 51 text
Template tags
1. Собирается дерево нодов
{% for item in objects %}
{% if item.expired %}
Срок истек
{% else %}
Срок: {% now %}
{% endif %}
{% endfor %}
[email protected] 33
Slide 52
Slide 52 text
Template tags
2. Выполняется рекурсивный render()
{% for item in objects %}
{% if item.expired %}
Срок истек
{% else %}
Срок: {% now %}
{% endif %}
{% endfor %}
[email protected] 34
Slide 53
Slide 53 text
Что если...
Если мы засунем действия бота в
render(), то мы дадим
возможность юзерам писать
логику на DTL!
[email protected] 35
Каждый цикл "вопрос-
ответ" требует
препроцессинга
[email protected] 39
Slide 58
Slide 58 text
Каждый цикл "вопрос-
ответ" требует
препроцессинга
• Укорачиваем ссылки в
сообщениях
[email protected] 39
Slide 59
Slide 59 text
Каждый цикл "вопрос-
ответ" требует
препроцессинга
• Укорачиваем ссылки в
сообщениях
• Все PNG преобразуем в JPG
[email protected] 39
Slide 60
Slide 60 text
Каждый цикл "вопрос-
ответ" требует
препроцессинга
• Укорачиваем ссылки в
сообщениях
• Все PNG преобразуем в JPG
• Ограничиваем время ответа бота
[email protected] 39
Slide 61
Slide 61 text
Каждый цикл "вопрос-
ответ" требует
препроцессинга
• Укорачиваем ссылки в
сообщениях
• Все PNG преобразуем в JPG
• Ограничиваем время ответа бота
• Логируем вопросы и ответы
[email protected] 39
Slide 62
Slide 62 text
Каждый цикл "вопрос-
ответ" требует
препроцессинга
• Укорачиваем ссылки в
сообщениях
• Все PNG преобразуем в JPG
• Ограничиваем время ответа бота
• Логируем вопросы и ответы
• ...
[email protected] 39