- Created by Denis Kiselev, last modified on Nov 22, 2022
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 10 Next »
Переписка с пользователями
Простые сценарии, включающие в себя общение с пользователем.
Короткий опрос пользователя и возврат ответов
Сценарий ведет небольшую переписку с пользователем и возвращает ответы в зависимости от реакции пользователя.
Во время работы сценария все реплики пользователя будут передаваться в этот сценарий. После завершения сценария сервис будет ждать ответную реакцию пользователя в течение определенного в настройках времени. Если пользователь напишет реплику - она будет передана в базы знаний. Если пользователь не напишет реплику в указанное время - сервис закроет диалог.
// // Сценарий простой переписки с пользователем // // Приветственное сообщение и первый вопрос сообщениеПользователю.сШаблоном("Добрый день! Сейчас я помогу!") + задатьПользователюВопрос("Я правильно понял, что вы заблудились в лесу?").сВариантамиОтвета("Да", "Нет").сохранитьРезультат("answer_1")+ // // Если пользователь выберет нет - сценарий завершается если("{answer_1} == Нет").то( сообщениеПользователю.сШаблоном("Ок, тогда я отключаюсь. Всего хорошего!") + завершить )+ // // Сообщения пользователю и начало опроса сообщениеПользователю.сШаблоном("Если вы заблудились в лесу - главное сохранять спокойствие!") + сообщениеПользователю.сШаблоном("Ваша главная задача - решить куда идти и выйти из леса.") + задатьПользователюВопрос("Посмотрите вокруг - вы видите деревья?").сВариантамиОтвета("Да", "Нет").сохранитьРезультат("answer_2")+ // // Пользователь ответил Нет - сценарий возвращает сообщение для этого случая и завершается если("{answer_2} == Нет").то( сообщениеПользователю.сШаблоном("Поздравляю! Вы не в лесу. Проблема решена. Всего хорошего") + завершить )+ // // Пользователь ответил Да - сценарий продолжает передавать сообщения пользователю сообщениеПользователю.сШаблоном("Посмотрите на мох на стволах деревьев. Мох зеленый, зеленый цвет успокаивает.") + сообщениеПользователю.сШаблоном("Обратите внимание на какой стороне дерева чаще всего встречается мох - это направление на север.") + сообщениеПользователю.сШаблоном("Теперь важно вспомнить как вы пришли сюда и идти обратно.") + задатьПользователюВопрос("Вы можете вспомнить откуда пришли?").сВариантамиОтвета("Да","Нет").сохранитьРезультат("answer_3") + // // Пользователь ответил Нет - сценарий возвращает сообщение для этого случая и завершается если("{answer_3} == Нет").то( сообщениеПользователю.сШаблоном("Тогда вам все равно куда идти. Идите на север, ориентируясь на мох. Всего хорошего и удачи!") + завершить ) + // // Пользователь выбрал вариант Да - сценарий возвращает сообщение для этого случая и завершается сообщениеПользователю.сШаблоном("Отлично! Идите обратно. Всего хорошего и удачи!") + завершить
Короткий опрос пользователя и передача запроса операторам
Сценарий проведет первичный опрос пользователя и передаст диалог операторам. Сценарий можно использовать в документах базы знаний для предметных опросов или в качестве приветственного сценарий для общих для всех опросов.
// // Сценарий первичного анкетирования и передачи запроса операторам // // Начинается опрос задатьПользователюВопрос("Уточните, пожалуйста, что для Вас является приоритетным?").сВариантамиОтвета("Получение максимальной суммы","Простота получения").сохранитьРезультат("UserSaid_Priority")+ задатьПользователюВопрос("Укажите, на какие цели предназначается займ?").сохранитьРезультат("UserSaid_Priority_2")+ сообщениеПользователю.сШаблоном("Пожалуйста не закрывайте окно чата оператор подберет для Вас наиболее выгодное предложение!")+ // // завершаем сценарий и передаем диалог операторам завершитьИПеревестиНаОператора
Анкетирование пользователя и сохранение результатов в данные о пользователе
// // Сценарий заполнения данных пользователя // установитьПеременную("enteredEmail", "") + установитьПеременную("enteredPhone", "") + установитьПеременную("enteredFIO", "") + установитьПеременную("enteredTall", "") + установитьПеременную("enteredRegion", "") + установитьПеременную("enteredLink", "") + установитьПеременную("enteredCheck", "") + // // Опрос если("{userFullName} == ").то( задатьПользователюВопрос("Укажите как вас зовут").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredFIO") ) + если("{userEmail} == ").то( задатьПользователюВопрос("Укажите адрес вашей электронной почты").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredEmail") ) + если("{userPhone} == ").то( задатьПользователюВопрос("Укажите номер вашего телефона").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredPhone") ) + если("{userPayload.рост} == ").то( задатьПользователюВопрос("Укажите ваш рост").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredTall") ) + если("{userPayload.регион} == ").то( задатьПользователюВопрос("Укажите ваш город").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredRegion") ) + если("{userPayload.ссылка} == ").то( задатьПользователюВопрос("Укажите ссылку на ваш профиль").сВариантамиОтвета("Пропустить").сохранитьРезультат("enteredLink") ) + // // Замена нажатой кнопки Пропустить на символ - если("{enteredFIO} == Пропустить").то( установитьПеременную("enteredFIO", "-") ) + если("{enteredEmail} == Пропустить").то( установитьПеременную("enteredEmail", "-") ) + если("{enteredPhone} == Пропустить").то( установитьПеременную("enteredPhone", "-") ) + если("{enteredTall} == Пропустить").то( установитьПеременную("enteredTall", "-") ) + если("{enteredRegion} == Пропустить").то( установитьПеременную("enteredRegion", "-") ) + если("{enteredLink} == Пропустить").то( установитьПеременную("enteredLink", "-") ) + // // Проверка данных и сохранение тех переменных пользователя для которых в опросе были указаны данные если("{enteredFIO} != ").то( установитьПеременнуюПользователю("userFullName", "{enteredFIO}") + установитьПеременную("enteredCheck", "1") ) + если("{enteredEmail} != ").то( установитьПеременнуюПользователю("userEmail", "{enteredEmail}") + установитьПеременную("enteredCheck", "1") ) + если("{enteredPhone} != ").то( установитьПеременнуюПользователю("userPhone", "{enteredPhone}") + установитьПеременную("enteredCheck", "1") ) + если("{enteredTall} != ").то( установитьПеременнуюПользователю("userPayload.рост", "{enteredTall}") + установитьПеременную("enteredCheck", "1") ) + если("{enteredRegion} != ").то( установитьПеременнуюПользователю("userPayload.регион", "{enteredRegion}") + установитьПеременную("enteredCheck", "1") ) + если("{enteredLink} != ").то( установитьПеременнуюПользователю("userPayload.ссылка", "{enteredLink}") + установитьПеременную("enteredCheck", "1") ) + // // Если хоть одно значение было указано сценарий сообщит со сохранении данных если("{enteredCheck} == 1").то( сообщениеПользователю.сШаблоном("Спасибо. Все записал.") ) + // завершить
Опрос пользователя и получение информации из внешнего сервиса
Приветственные сценарии
Сценарии вызываемые операторами
Работа с таблицами Google Sheets
Простой поиск в таблице
Сценарий запрашивает у пользователя данные для поиска, ищет указанный текст по всем строкам и колонкам таблицы и сообщает о результатах поиска в формате “Да” или “Нет”
// // Сценарий ищет текст в таблице Google Sheets по значению в любой колонке и возвращает сообщение "Да" если текст найден или "Нет" если не найден // // Укажите логин сервисного аккаунта Google установитьПеременную("email", "autofaqaccount@autofaqproject.iam.gserviceaccount.com") + // Укажите идентификатор таблицы Google Sheet установитьПеременную("sheetId", "1UyTG1ag6kb-tKCD0Wc5nD21zE38TvYSiMMQ_vzwxWbs")+ // Укажите название листа в таблице Google Sheet установитьПеременную("sheetName", "Sheet1")+ // // Настройка источника текста для поиска - спросить у пользователя или взять текст изначального запроса // запрос - изначальный запрос // вопрос - спросить у пользователя установитьПеременную("querySource", "вопрос")+ // // Основной код сценария // // Получение текста для поиска в таблице если("{querySource} == запрос").то( установитьПеременную("searchQuery", "{platformInMessageQuery}") )+ если("{querySource} == вопрос").то( задатьПользователюВопрос("Скажи номер").сохранитьРезультат("searchQuery") )+ // // Получение временного токена для работы с гугл таблицей вызвать.внешнийСервис("https://denisk.autofaq.ai/gtoken","GET").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сПараметрами(("email","{email}")).сохранитьРезультат(("message","message"),("token","token"),("status","status"))+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с Гугл.")+ завершить )+ если("{status} == error").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за опрос, но что-то сломалось и я не смог сохранить результаты.")+ завершить )+ // // Отправка данных в гугл таблицу вызвать.внешнийСервис("https://sheets.googleapis.com/v4/spreadsheets/{sheetId}/values/{sheetName}","GET").сЗаголовками(("Authorization", "Bearer {token}"),("Content-Type","application/json")).сПараметрами(("majorDimension", "COLUMNS")).сохранитьРезультатКакСтроку("result")+ если("{http_code} > 210").то( комментарий("Сценарий не смог отправить запрос на поиск в гугл таблице. Код {http_code}, ответ {result}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с Google.")+ завершить )+ // // Разбор ответа от гугл таблицы выполнитьJs(""" var error = 0; var message = ''; var rowIndex = 0; try { var parsedresult = JSON.parse(result); } catch(err) { var exit = {'error': 1, 'message':'Ошибка разбора ответа от Гугл'}; var parsedresult = {}; } if (parsedresult.hasOwnProperty('values')) { for (var i = 0; i < parsedresult.values.length; i++) { rowIndex = rowIndex + (parsedresult.values[i].indexOf(searchQuery) > -1 ? 1 : 0); } if (rowIndex > 0) { var exit = {'error': 0, 'message':'Да'}; } else { var exit = {'error': 0, 'message':'Нет'}; } } else { var exit = {'error': 1, 'message':'В ответе из таблицы не найдено данных'}; } exit; """) + // // В случае ошибки при поиске данных сценарий сообщит об ошибке и завершится если("{error} == 1").то( сообщениеПользователю.сШаблоном("При получении данных из таблицы возникла ошибка. {message}")+ завершить ) + // // Если при поиске данных ошибки не возникло, то сценарий сообщит о результате поиска и завершится сообщениеПользователю.сШаблоном("{message}")+ завершить
Поиск в таблице и возврашение всех данных из строки с заголовками
Сценарий запрашивает у пользователя данные для поиска, ищет указанный текст в первой колонке и возвращает данные из всей строки в формате “Заголовок колонки”: “Значение в строке”
// // Сценарий ищет строку в таблице Google Sheets по значению в первой колонке и возвращает данные из всей строки // // Укажите логин сервисного аккаунта Google установитьПеременную("email", "account_name@project_name.iam.gserviceaccount.com") + // Укажите идентификатор таблицы Google Sheet установитьПеременную("sheetId", "ХХХХХХ-ХХХХХХХХХХХХХ")+ // Укажите название листа в таблице Google Sheet установитьПеременную("sheetName", "Sheet1")+ // // Укажите источник текста для поиска - спросить у пользователя или взять текст изначального запроса // запрос - текст запроса, с которым пользователь пришел в сценария // вопрос - спросить у пользователя установитьПеременную("querySource", "вопрос")+ // // Основной код сценария // // Получение текста для поиска в таблице если("{querySource} == запрос").то( установитьПеременную("searchQuery", "{platformInMessageQuery}") )+ если("{querySource} == вопрос").то( задатьПользователюВопрос("Скажи номер").сохранитьРезультат("searchQuery") )+ // // Получение временного токена для работы с гугл таблицей вызвать.внешнийСервис("https://denisk.autofaq.ai/gtoken","GET").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сПараметрами(("email","{email}")).сохранитьРезультат(("message","message"),("token","token"),("status","status"))+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с Гугл.")+ завершить )+ если("{status} == error").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за опрос, но что-то сломалось и я не смог сохранить результаты.")+ завершить )+ // // Отправка запроса в Google Sheets вызвать.внешнийСервис("https://sheets.googleapis.com/v4/spreadsheets/{sheetId}/values/{sheetName}","GET").сЗаголовками(("Authorization", "Bearer {token}"),("Content-Type","application/json")).сПараметрами(("majorDimension", "COLUMNS")).сохранитьРезультатКакСтроку("result")+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог отправить запрос на поиск в гугл таблице. Код {http_code}, ответ {result}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с Google.")+ завершить )+ // // Разбор ответа от гугл таблицы выполнитьJs(""" var error = 0; var message = ''; var rowIndex = 0; try { var parsedresult = JSON.parse(result); } catch(err) { var exit = {'error': 1, 'message':'Ошибка разбора ответа от Гугл'}; var parsedresult = {}; } if (parsedresult.hasOwnProperty('values') && parsedresult.values[0].length > 1) { var rowIndex = parsedresult.values[0].indexOf(searchQuery); if (rowIndex > 0) { for (var i = 0; i < parsedresult.values.length; i++) { if (parsedresult.values[i].length > rowIndex) { message = message + parsedresult.values[i][0].toString() + ': ' + parsedresult.values[i][rowIndex] + '<br>'; } } var exit = {'error': 0, 'message':message}; } else { var exit = {'error': 1, 'message':'Значение не найдено в первой колонке таблицы'}; } } else { var exit = {'error': 1, 'message':'В ответе из таблицы не найдено данных'}; } exit; """) + // // В случае ошибки при поиске данных сценарий сообщит об ошибке и завершится если("{error} == 1").то( сообщениеПользователю.сШаблоном("При получении данных из таблицы возникла ошибка. {message}")+ завершить ) + // // Если при поиске данных ошибки не возникло, то сценарий сообщит найденные данные и завершится сообщениеПользователю.сШаблоном("Найдены следующие данные")+ сообщениеПользователю.сШаблоном("{message}")+ завершить
Опрос пользователя и запись данных в новую строку таблицы
Сценарий проверяет наличие данных о пользователе в таблце и если данных в таблице нет то проводит опрос и сохраняет полученную информацию в новой строке таблицы.
Сценарий получает адрес электронной почты из данных пользователя. Если адрес не указан - запрашивает его у пользователя. Сценарий ищет адрес в первой колонке таблицы. Если адрес электронной почты пользователя найден, то сценарий завершает работу. Если адрес не найден - проводит опрос и сохраняет данные в новую строку таблицы.
// // Сценарий ищет текст в таблице Google Sheets по значению в любой колонке и возвращает сообщение "Да" если текст найден или "Нет" если не найден // // Укажите логин сервисного аккаунта Google установитьПеременную("email", "account_name@project_name.iam.gserviceaccount.com") + // Укажите идентификатор таблицы Google Sheet установитьПеременную("sheetId", "ХХХХХХ-ХХХХХХХХХХХХХ")+ // Укажите название листа в таблице Google Sheet установитьПеременную("sheetName", "Sheet1")+ // // Основной код сценария // // // Получение временного токена для работы с гугл таблицей вызвать.внешнийСервис("https://denisk.autofaq.ai/gtoken","GET").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сПараметрами(("email","{email}")).сохранитьРезультат(("message","message"),("token","token"),("status","status"))+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с Гугл.")+ завершить )+ если("{status} == error").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за опрос, но что-то сломалось и я не смог сохранить результаты.")+ завершить )+ // // Получение адреса электронной почты установитьПеременную("enteredEmail", "{userEmail}") + если("{enteredEmail} == ").то( задатьПользователюВопрос("Укажите адрес вашей электронной почты").сохранитьРезультат("enteredEmail") + установитьПеременнуюПользователю("userEmail", "{enteredEmail}") ) + // // Отправка запроса на поиск адреса в гугл таблицу вызвать.внешнийСервис("https://sheets.googleapis.com/v4/spreadsheets/{sheetId}/values/{sheetName}","GET").сПараметрами(("majorDimension","COLUMNS")).сЗаголовками(("Authorization", "Bearer {token}"),("Content-Type","application/json")).сохранитьРезультатКакСтроку("checkLoginResult") + // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог отправить запрос на поиск в гугл таблице. Код ответа {http_code}, ответ {checkLoginResult}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с центром.")+ завершить )+ выполнитьJs(""" var checkLoginResultParsed = JSON.parse(checkLoginResult); if ("values" in checkLoginResultParsed) { if (checkLoginResultParsed['values'][0].indexOf(userLogin) != -1) { var checkLoginResultData = 1; } else { var checkLoginResultData = 0; } } else { var checkLoginResultData = 0; } var exit = {'checkLoginResultData':checkLoginResultData}; exit; """) + // // Если адрес почты пользователя найден в таблице то сценарий сообщает об этом пользователю и завершается если("{checkLoginResultData} == 1").то( комментарий("Логин пользователя {userLogin} уже найден в таблице, поэтому опрос останавливаю")+ сообщениеПользователю.сШаблоном("Вы уже проходили этот опрос. Второй раз спрашивать нет необходимости")+ завершить )+ // // Сценарий начинает опрос пользователя задатьПользователюВопрос("Пожалуйста назовите ваше ФИО").сохранитьРезультат("fio") + задатьПользователюВопрос("Пожалуйста назовите ваш отдел").сохранитьРезультат("otdel") + задатьПользователюВопрос("Пожалуйста назовите вашу должность").сохранитьРезультат("dolznost") + задатьПользователюВопрос("Оцените удобство нашего сервиса").сВариантамиОтвета("Все устраивает", "Возникают трудности", "Комментарий").сохранитьРезультат("udobstvo_main") + установитьПеременную("udobstvo_add", " ")+ если("{udobstvo_main} == Возникают трудности").то(задатьПользователюВопрос("Какие у вас трудности?").сохранитьРезультат("udobstvo_add")) + если("{udobstvo_main} == Комментарий").то(задатьПользователюВопрос("Напишите ваш комментарий").сохранитьРезультат("udobstvo_add")) + // Открытые вопросы задатьПользователюВопрос("Напишите какие дополнительные сервисы Вы хотели бы видеть").сохранитьРезультат("new_services") + задатьПользователюВопрос("Напишите Ваши предложения и пожелания").сохранитьРезультат("suggestions") + // выполнитьJs(""" var now = new Date(); var login = enteredEmail; var udobstvo = udobstvo_main + udobstvo_add; var requestBody = {"range": sheetName+"!A1:O1", "majorDimension": "ROWS", "values":[[now, login, fio, otdel, dolznost, udobstvo, new_services, suggestions]]}; var requestBodyJSON = JSON.stringify(requestBody); var exit = {'requestBodyJSON':requestBodyJSON}; exit; """) + // // Получение временного токена для работы с гугл таблицей вызвать.внешнийСервис("https://denisk.autofaq.ai/gtoken","GET").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сПараметрами(("email","{email}")).сохранитьРезультат(("message","message"),("token","token"),("status","status"))+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с центром.")+ завершить )+ если("{status} == error").то( комментарий("Сценарий не смог получить токен для работы с таблицей. {message}")+ сообщениеПользователю.сШаблоном("Спасибо за опрос, но что-то сломалось и я не смог сохранить результаты.")+ завершить )+ // // Отправка запроса на добавление строки в таблицу вызвать.внешнийСервис("https://sheets.googleapis.com/v4/spreadsheets/{sheetId}/values/Sheet1!A1:O1:append","POST").сПараметрами(("valueInputOption","USER_ENTERED")).сЗаголовками(("Authorization", "Bearer {token}"),("Content-Type","application/json")).сТеломСообщения("{requestBodyJSON}").сохранитьРезультатКакСтроку("result")+ // // Проверка результатов запроса, в случае ошибки сценарий сообщит об ошибке и завершится если("{http_code} > 210").то( комментарий("Сценарий не смог отправить запрос на добавление строчки в гугл таблице. Код ответа {http_code}")+ сообщениеПользователю.сШаблоном("Спасибо за участие, но что-то сломалось и я не могу связаться с центром.")+ завершить )+ комментарий("Добавил строчку в гугл таблицу.")+ сообщениеПользователю.сШаблоном("Все записал. Большое спасибо за участие!")+ завершить
- No labels