Делаю чат-бота для телеграм. На данный момент есть многомерное меню, которое работает на callback -ах инлайнкнопок. Все бы было хорошо, но есть проблема: к примеру, человек нажимает заказать , затем выбирает товар. Затем ему нужно ввести адрес и время доставки, а также телефон и тд. Скажите, пожалуйста, каким образом это можно сделать?
Т.е. если человек просто введет адрес доставки, то ему будет выдаваться «не выбран товар» или «ошибка», а если он выберет товар, то он пойдет по этому сценарию и так далее. Вопрос — как сделать сценарий? Мой код (на примере php , библиотека telegram-bot-sdk ):
getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя $keyboard = Keyboard::make() ->inline() ->row( Keyboard::inlineButton([‘text’ => ‘Показать меню’, ‘callback_data’ => ‘/show_menu’]), Keyboard::inlineButton([‘text’ => ‘Купить цветы’, ‘callback_data’ => ‘/buyflowers’]) ); $keyboard_flowers = Keyboard::make() ->inline() ->row( Keyboard::inlineButton([‘text’ => ‘Розы’, ‘callback_data’ => ‘/buyflowers_roses’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Пионы’, ‘callback_data’ => ‘/buyflowers_piony’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Шляпные коробки’, ‘callback_data’ => ‘/buyflowers_hatbox’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Коробочки со сладостями’, ‘callback_data’ => ‘/buyflowers_sweetbox’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Акции и спецпредложения’, ‘callback_data’ => ‘/buyflowers_sales’]) ); $keyboard_menu = Keyboard::make() ->inline() ->row( Keyboard::inlineButton([‘text’ => ‘Связаться с нами’, ‘callback_data’ => ‘/contact_us’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Купить цветы’, ‘callback_data’ => ‘/buyflowers’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Стать партнером’, ‘callback_data’ => ‘/partner’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Перейти на сайт’, ‘url’ => ‘https://kands.spb.ru/’]) ) ->row( Keyboard::inlineButton([‘text’ => ‘Акции и спецпредложения’, ‘callback_data’ => ‘/buyflowers_sales’]) ); $contact = $result[‘message’][‘contact’]; $text = $result[«message»][«text»]; //Текст сообщения $chat_id = $result[«message»][«chat»][«id»]; $name = $result[«message»][«from»][«username»]; //Юзернейм пользователя if ($result->isType(‘callback_query’)) < $data = $result[‘callback_query’][‘data’]; $chat = $result[‘callback_query’][‘message’][‘chat’][‘id’]; switch ($data) < case ‘/buyflowers’: $telegram->sendMessage([ ‘chat_id’ => $chat, ‘text’ => ‘Выберите категорию:’, ‘reply_markup’ => $keyboard_flowers ]); break; case ‘/show_menu’: $telegram->sendMessage([ ‘chat_id’ => $chat, ‘text’ => ‘Меню: ‘, ‘reply_markup’ => $keyboard_menu ]); break; default: # code. break; > > $telegram->sendMessage([ ‘chat_id’ => $chat_id, ‘text’ => ‘Стартовая страница. Выберите дальнейшие действия.’, ‘reply_markup’ => $keyboard ]); ?> `
Источник: ru.stackoverflow.com
Лёгкое создание чат-бота. Урок 3. Создание сценария.
Как создать сценарий чат-бота
От парсера афиши театра на Python до Telegram-бота. Часть 2
Продолжаем историю о разработке Telegram-бота для поиска билетов — HappyTicketsBot, начало можно почитать в первой части.
Во второй расскажу о самом боте, поделюсь кодом, а также идеями, которым скорее всего не суждено стать реальностью. Большая часть функционала к моменту создания бота уже была написана в формате скрипта, поэтому основной задачей стояло наладить интерфейс взаимодействия с пользователем через Telegram-messenger. Получилось не так болтологически, как в 1й части, так что attention — много кода.
Спойлер: HappyTicketsBot так и не улетел крутиться на иностранный сервер, он локальный и русский, но однажды запуск (верю) состоится =)
UPDATE: После расшаривания бота среди театральной публики о нем написали в СМИ. Резко нахлынул поток пользователей. Через пару дней игры «подними сразу, как упало» бот и на сервер улетел, и пережил ряд улучшений. Я довольна=)
1. Старт с нуля
Так как опыта в проектировании Telegram-ботов не было от слова совсем, то пришлось начать с базовых статей и tutorials, которых в сети очень много. Да, кстати, что такое back-end на тот момент я тоже плохо представляла)) Самым содержательным и прикладным стал вот этот набор уроков . Модуль, на котором велось взаимодействие с Telegram — pyTelegramBotAPI (github).
Дольше всего заняло освоение идеологии декораторов, про них читала в этой статье. Там в двух частях и очень понятно.
2. Сценарий взаимодействия бота с пользователем. Базовый поиск
Как уже упомянуто в предисловии и 1-й части статьи, почти весь код парсинга был готов. Оставалось изменить способ задания параметров поиска. Исходя из этого и был построен сценарий поведения бота. Команды, доступные для пользователя, ограничиваются следующим набором:
- /Find — начать новый поиск,
- /Reset — сбросить параметры поиска и начать новый,
- /LastSearch — выдает результаты, используя параметры последнего запроса,
- /addURL добавить URL спектакля в интересы для отслеживания снижения цены,
- /checkURL — обновить цены на интересующие спектакли,
- /showURL — вывести все URL, добавленные в список интересов
Для того, чтобы запоминать состояние пользователя, они сохраняются в базе. Для работы с ней используются модули Vedis (конфигуратор баз данных типа ключ-значение, почитать документацию) и Enum (работа с перечислениями, подробнее 1, 2).
В отдельном файле-конфигурации Myconfig.py задаем параметры бота (в том числе полученный от Telegram уникальный token) и перечисляем статусы, в которых может находиться пользователь. Их вышло немного.
from enum import Enum token = «4225555:AAGmfghjuGOI4sdfsdfs5656sdfsdf_c» #токен бота, тут приведён образец(не настоящий токен) db_file = «Mydatabase.vdb» class States(Enum): «»» в БД Vedis хранимые значения всегда строки, поэтому и тут будем использовать тоже строки (str) «»» S_START = «0» # Начало нового диалога S_ENTER_MONTH = «1» S_ENTER_PRICE = «2» S_ENTER_TYPE = «3» S_ENTER_PLACE = «4» S_ENTER_URL=»5″ #этот статус не входит в базовый поиск
В итоге получаем незамысловатую цепочку перехода статусов из одного в другой.
Для хранения используем БД Vedis. Инициализация пользователя, приславшего сообщение, всегда осуществляется через message.chat.id.
Код файла dbwoker.py, в котором описано взаимодействие с базой
from vedis import Vedis import Myconfig as config # Запрашиваем из базы статус пользователя def get_current_state(user_id): with Vedis(config.db_file) as db: try: return db[user_id] except KeyError: #Если такого ключа/пользователя в базе не оказалось return config.States.S_START.value #Значение по умолчанию-начало диалога # Сохраняем текущий статус пользователя в базу def set_state(user_id, value): with Vedis(config.db_file) as db: try: db[user_id] = value return True except: print(‘Проблемка с юзером!’) # тут желательно как-то обработать ситуацию return False
Ниже пример хендлера, который активизируется по команде /find.
Как можно заметить, в этом примере нет никакого ввода данных — есть только смена статуса на «S_ENTER_MONTH». Увидев сообщение о вводе номера, пользователь его вводит и отправляет сообщение. При получении сообщения со статусом S_ENTER_MONTH, инициируется следующий этап. В случае ошибок ввода статус не меняется.
Если бот получает сообщение от пользователя со статусом S_ENTER_MONTH, то запускается приведенный ниже хендлер. Идеалогически также происходит на других этапах сценария базового поиска.
Помимо стандартного поиска, есть возможность сохранять интересные спектакли.
3. Отслеживание изменения цен
Пользователь может добавить в список интересов URL, чтобы получить оповещение, когда цена снизится. Мы помним, что у нас остался незадейстованный в базовом поиске статус — S_ENTER_URL. В
Для хранения списка используем .csv файл. Для взаимодействия с ним нужна пара функций — записи и чтения с проверкой изменения цены. Если она изменяется-оповещаем пользователя.
def add_new_URL(user_id,perf_url): WAITING_FILE = «waiting_list.csv» with open(WAITING_FILE, «a», newline=»») as file: curent_url=’https://’+perf_url text=get_text(curent_url) #функция описана в 1й части статьи minPrice, name,date,typ,place=find_lowest(text) user = [str(user_id), perf_url,str(minPrice)] writer = csv.writer(file) writer.writerow(user)
Код функции обновления цены чуть более длинный
def update_prices(bot): WAITING_FILE = «waiting_list.csv» with open(WAITING_FILE, «r», newline=»») as file: reader = csv.reader(file) waitingList=[] for row in reader: waitingList.append(list(row)) L=len(waitingList) lowest=<> with open(WAITING_FILE, «w», newline=»») as fl: writer = csv.writer(fl) for i in range(L): lowest[waitingList[i][1]]=waitingList[i][2] #добавляем по ключу URL цену for k in lowest.keys(): text=get_text(‘https://’+k) minPrice, name,date,typ,place=find_lowest(text) #об этом говорилось в 1й части статьи if minPrice==0: #если билетов нет minPrice=100000 if int(minPrice)
В результате, по команде /checkURL пользователь может получить такой результат (сейчас понимаю, что надо бы название спектакля тоже выводить, но это вещи из серии «руки не дошли»).
Окей, ладно. Искать можем, отслеживать можем. Пара друзей начали пользоваться ботом, захотелось узнать кто они и что же они ищут. Эту информацию хорошо писать в логи.
4. Пишем активность и ошибки в логи
В этом нам поможет модуль Logging. Запись информации происходит только на этапе завершения базового поиска, в хендлере, в котором статус пользователя переходит из S_ENTER_PLACE в S_START. Запись ошибок, в свою очередь, происходит при их возникновении.
Много сказать о том, как модуль работает, я не смогу, поэтому лучше обратиться к информации вовне.
Описание логгера
def save_logs(str): loggerInfo.info(str) #добавляем строчку в лог logging.basicConfig(format = u’%(levelname)-8s [%(asctime)s] %(message)s’, level = logging.ERROR, filename = u’loggerErrors.log’) global loggerInfo loggerInfo = logging.getLogger(__name__) loggerInfo.setLevel(logging.INFO) handler = logging.FileHandler(‘loggerUsers.log’) handler.setLevel(logging.INFO) formatter = logging.Formatter(‘%(asctime)s — %(name)s — %(levelname)s — %(message)s’) handler.setFormatter(formatter) loggerInfo.addHandler(handler) log = logging.getLogger(«ex»)
Из-за разрыва соединения бот периодически падал, поэтому ошибка интернет соединения отлавливалась и бот перезапускался автоматом через 10 секунд. Но это не всегда спасало, поэтому держала запущенным TeamViewer, чтобы при необходимости поднять.
5. Нереализованное
У нас получился бот, заменяющий функционал скрипта, но позволяющий получать информацию в удобной форме внутри мессенджера. Основные мои потребности он закрыл.
Разборки с модулями и написание стройных хендлеров длились около месяца в режиме работы по выходным и иногда по вечерам. В конце этого периода интерес уже стал угасать и функционал застрял на начальной точке. Пробиться через принципы работы на webhook-ах с наскока не удалось, а потом и Telegram заблокировали. До этого был план запулить крутиться back-end на рабочий сервер, но… vpn ради этого там ставить не будут =)
Вот что осталось в планах, некоторые из которых может и реализуются однажды томным летним/зимним вечером:
- нагрузочное тестирование с большим потоком пользователей. Пока непонятно, будет ли бот работать стабильно и не путать пользователей;
- оповещение о появлении в расписании артиста нового спектакля. Любимых «белых кроликов» у меня много, за всеми не уследить (а хотелось бы);
- оповещении о появлении в продаже билетов определенной категории. Был один знакомый, любитель первого ряда партера, который словить сложно вручную;
- регулярная автоматическая проверка интересующих URL-ов на предмет снижения цены по таймеру. Сейчас это делается по команде, таймер не удалось наладить быстро, так что оставила по-простому;
- сохранение своей истории посещений спектаклей. Куда-нибудь в файлик .csv, дату-название-состав исполнителей-свой комментарий, чтобы не растерять;
- поиск заданной категории билетов. Задавать не только цену, но и сектор (партер-бенуар и т.д);
- перенести всё в навык для Алисы. why not?
- сделать мобильное приложение с тем же функционалом. why not?
ИТОГ
Лень оказалась двигателем прогресса и она же его остановила. До выгрузки бота на сторонний сервер дело не дошло, все-таки это требует более широких компетенций и знаний в области Web. Проект выдался интересным и позволил освоить чуть лучше Python, увидеть еще одну его грань (помимо привычного Machine learning-а), а также подарил много чудесных вечеров в театре по бросовой цене. Спасибо ему за это, поставленные задачи он закрывал на ура.
Как ни старалась, в статье всё равно получилось много кода и мало текста. Буду рада пояснить непонятное или мало описанное в комментариях =)
- Занимательные задачки
- Python
- Программирование
- HTML
Источник: habr.com
Как написать хороший
сценарий для бота
Совсем недавно мы говорили о возможностях чат-ботов: они могут принести пользу как клиентам компании, так и ее сотрудникам. В это же время, боты становятся эффективными только при условии грамотно составленных сценариев.
Совсем недавно мы говорили о возможностях чат-ботов: они могут принести пользу как клиентам компании, так и ее сотрудникам. В это же время, боты становятся эффективными только при условии грамотно составленных сценариев.
Что такое сценарии чат-ботов?
Что такое сценарии чат-ботов?
Для того, чтобы получить нужные данные из информационной системы, пользователю необходимо выполнить определенную последовательность действий — так происходит и в классических, и в разговорных интерфейсах.
Классические интерфейсы предполагают взаимодействие пользователя с графическими элементами — меню и пиктограммами. В разговорных интерфейсах им на замену приходит последовательность сообщений, которые бот отправляет пользователю и наоборот — это и называется сценарием.
Для того, чтобы получить нужные данные из информационной системы, пользователю необходимо выполнить определенную последовательность действий — так происходит и в классических, и в разговорных интерфейсах.
Классические интерфейсы предполагают взаимодействие пользователя с графическими элементами — меню и пиктограммами. В разговорных интерфейсах им на замену приходит последовательность сообщений, которые бот отправляет пользователю и наоборот — это и называется сценарием.
Что нужно для составления сценария?
Что нужно для составления сценария?
Специалисты, которые составляют сценарии для ботов, должны обладать не только навыками проектирования пользовательских интерфейсов, но и креативным подходом к написанию текстов. Важно заложить в бота простые, последовательные и логичные ответы, детально продумав вероятные реакции пользователя на разные фразы.
Специалисты, которые составляют сценарии для ботов, должны обладать не только навыками проектирования пользовательских интерфейсов, но и креативным подходом к написанию текстов. Важно заложить в бота простые, последовательные и логичные ответы, детально продумав вероятные реакции пользователя на разные фразы.
Ставим цель
Начать стоит с разбора процессов, которые должны быть автоматизированы с помощью чат-бота. Первый шаг — анализ аудитории, для которой разрабатывается сценарий. Это поможет выбрать правильный фокус при его составлении.
Далее необходимо определиться с типом сценария. Сценарии ботов могут выполнять следующие задачи :
Начать стоит с разбора процессов, которые должны быть автоматизированы с помощью чат-бота. Первый шаг — анализ аудитории, для которой разрабатывается сценарий. Это поможет выбрать правильный фокус при его составлении.
Далее необходимо определиться с типом сценария. Сценарии ботов могут выполнять следующие задачи :
Информирование
В бот закладывается определенная информация, структурированная в виде меню. Пользователь перемещается по меню и узнает что-то новое — от информации о компании до правил внутреннего распорядка .
Исполнение бизнес-процесса
Последовательность шагов, которые необходимо выполнить в рамках бизнес-процесса — от прохождения адаптации до согласования отпуска.
Запрос информации из IT-систем
Набор вопросов к пользователю для уточнения запроса и его отправки в IT-систему — от запроса расчётного листа до запроса остатков спецодежды .
Информирование
В бот закладывается определенная информация, структурированная в виде меню. Пользователь перемещается по меню и узнает что-то новое — от информации о компании до правил внутреннего распорядка.
Исполнение бизнес-процесса
Последовательность шагов, которые необходимо выполнить в рамках бизнес-процесса — от прохождения адаптации до согласования отпуска.
Запрос информации из IT-систем
Набор вопросов к пользователю для уточнения запроса и его отправки в IT-систему — от запроса расчётного листа до запроса остатков спецодежды.
Заранее определите канал , через который сценарий будет доступен пользователю. Это может быть публичный или корпоративный мессенджер, виджет на сайте, мобильное приложение.
Учитывайте, что разные каналы связи предоставляют разные возможности реализации сценариев : например, в виджете на сайте невозможно хранить историю взаимодействия с пользователем более одной сессии — то есть до обновления страницы. Мессенджер Viber предлагает удобную карусель для представления информационного материала, а Telegram — inline-клавиатуру, которая помогает при проведении опросов.
Заранее определите канал , через который сценарий будет доступен пользователю. Это может быть публичный или корпоративный мессенджер, виджет на сайте, мобильное приложение.
Учитывайте, что разные каналы связи предоставляют разные возможности реализации сценариев : например, в виджете на сайте невозможно хранить историю взаимодействия с пользователем более одной сессии — то есть до обновления страницы. Мессенджер Viber предлагает удобную карусель для представления информационного материала, а Telegram — inline-клавиатуру, которая помогает при проведении опросов.
Пример карусели в Viber
Собираем информацию и формируем последовательность шагов сценария
После того, как мы определили аудиторию и тип сценария, следует заняться сбором информации и подготовить последовательность шагов в сценарии. Ключевая задача данного этапа — построение последовательности сообщений, которые будут отправляться пользователю, а также проработка возможных реакций на них.
После того, как мы определили аудиторию и тип сценария, следует заняться сбором информации и подготовить последовательность шагов в сценарии. Ключевая задача данного этапа — построение последовательности сообщений, которые будут отправляться пользователю, а также проработка возможных реакций на них.
Несколько полезных правил, которыми стоит руководствоваться при построении последовательности сообщений:
Несколько полезных правил, которыми стоит руководствоваться при построении последовательности сообщений:
Пользователю должно быть очевидно, в какой части сценария он находится и куда он может перейти дальше
Число действий, выполняемых пользователем для достижения результата, должно быть небольшим — минимум уточняющих вопросов и движений «вглубь» по меню
Возможность вернуться в начало сценария должна быть простой и очевидной
Пользователь должен иметь возможность прервать выполнение сценария в любой момент (например, не нужно заполнять все поля справки перед отменой ее запроса)
Выбор ответа на вопрос стоит реализовать в виде кнопок-подсказок, а не в виде текстового ввода: например, в разделе «дата» предложите пользователю кнопки «сегодня», «завтра», «через неделю» и «другая дата» для ручного ввода, если прочие варианты не подошли
Разрабатываем «характер» и «голос» бота
Идентичность бота будет зависеть от его целевой аудитории и бренда компании. Обычно пользователи радуются виртуальному персонажу, с которым можно поговорить, и это поднимает их вовлечённость . Если вы хотите создать целого персонажа, то этим нужно заниматься и с точки зрения стилистики сообщений, и с точки зрения ответов в базе знаний.
Идентичность бота будет зависеть от его целевой аудитории и бренда компании. Обычно пользователи радуются виртуальному персонажу, с которым можно поговорить, и это поднимает их вовлечённость . Если вы хотите создать целого персонажа, то этим нужно заниматься и с точки зрения стилистики сообщений, и с точки зрения ответов в базе знаний.
Основные задачи чат-бота Верты — помощь новым сотрудникам в адаптации и предоставление необходимой информации о компании. Тем не менее, благодаря яркой идентичности Верта всё больше и больше интегрируется в корпоративную культуру — например, совсем недавно она снялась в главной роли фильма-экскурсии по производству «ВЕРТЕКСА».
Верта
Виртуальный помощник фармацевтической компании «ВЕРТЕКС»
Но есть и свои минусы: «очеловечивание» бота порождает определённые ожидания от взаимодействия с ним. Пользователь начинает воспринимать бота как человека, который сможет ответить на любой его вопрос, поймёт заложенную во фразе эмоцию. Для достижения такого уровня необходима очень глубокая проработка ба зы знаний бота , что во многих случаях достаточно дорого и требует привлечения лингвистов. Именно поэтому самых простых ботов лучше не наделять идентичностью.
Но есть и свои минусы: «очеловечивание» бота порождает определённые ожидания от взаимодействия с ним. Пользователь начинает воспринимать бота как человека, который сможет ответить на любой его вопрос, поймёт заложенную во фразе эмоцию. Для достижения такого уровня необходима очень глубокая проработка базы знаний бота, что во многих случаях достаточно дорого и требует привлечения лингвистов. Именно поэтому самых простых ботов лучше не наделять идентичностью.
Тестируем бот
Старайтесь смотреть на ответы бота с точки зрения пользователей: не усложняйте текст, согласовывайте реплики, хорошо продумывайте быстрые ответы и названия кнопок. Простой совет: представьте, что вы пишете для конкретного человека, а не для широкой аудитории — это поможет сделать бота максимально удобным для пользователей. А ещё скрипты можно читать вслух — так можно обнаружить незаметные ошибки, сделать диалог «сглаженным».
Перед передачей бота пользователям, необходимо протестировать его на фокус-группе, которая не участвовала в разработке. Это позволит найти не только простые опечатки, но и недостатки с точки зрения пользовательского опыта.
Старайтесь смотреть на ответы бота с точки зрения пользователей: не усложняйте текст, согласовывайте реплики, хорошо продумывайте быстрые ответы и названия кнопок. Простой совет: представьте, что вы пишете для конкретного человека, а не для широкой аудитории — это поможет сделать бота максимально удобным для пользователей. А ещё скрипты можно читать вслух — так можно обнаружить незаметные ошибки, сделать диалог «сглаженным».
Перед передачей бота пользователям, необходимо протестировать его на фокус-группе, которая не участвовала в разработке. Это позволит найти не только простые опечатки, но и недостатки с точки зрения пользовательского опыта.
Источник: personik.ai