Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleНажмите здесь, чтобы развернуть пример сценария

Code Block
// Сценарий отправляет на указанный адрес текст переписки с пользователем.
// Дополнительно к пистму прикладываются все файлы в переписке меньше установленного размера.
// Сценарий может быть использован как для отправки переписки самому пользователю так и для отправки письма в сторонний сервис. 
//
// Настройки сценария
// 
// Формат текста письма. Установите true для HTML и false для обычного текста.
установитьПеременную("formated_text", "true") +
// Максимальный размер файлов для отправки в качестве вложения. Сценарий сообщит о пропущенных файлах и оператору и получателю письма.
установитьПеременную("maximumFileSize", "10000") +
// Предустановка адреса email пользователя в качестве получателя для быстрой отправки переписки пользователю на его почту.
установитьПеременную("useUserEmail", "true") +
// Адрес отправителя 
установитьПеременную("from_email", "noreply@autofaq.ai") +
// Предустановленная тема письма. Оператор сможет сменить тему перед отправкой письма.
установитьПеременную("subject", "Переписка с пользователем {userFullName}")+
//
// Адрес сервиса по отправке писем, встроенного в AutoFAQ
установитьПеременную("host", "http://porter/api/postman/mail") +
//
// Основной код сценария
//
// Сценарий предустанавливает адрес получателя из данных пользователя или оставляет поле пустым
если("{useUserEmail} == true").то(
  установитьПеременную("_email", "{userEmail}") 
)+
// Сценарий собирает форму для сбора данных у пользователя - адрес и комментарий к письму
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "formName",
  название = "",
  значение = "Сценарий отправит электронное письмо с текстом переписки на указанный адрес. Все файлы в переписке будут приложены к письму.",
  тип = "Нередактируемый текст",
  описание = "",
  обязательное = false
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "email",
  значение = "{_email}",
  название = "Укажите адрес email",
  тип = "Однострочный редактируемый текст",
  обязательное = true
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "subject",
  значение = "{subject}",
  название = "Укажите тему писма",
  тип = "Однострочный редактируемый текст",
  обязательное = true
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "comment",
  значение = "",
  название = "Комментарий к письму",
  тип = "Многострочный редактируемый текст",
  обязательное = false
) +
//  
// Сценарий отображает форму для опроса оператора
показатьФормуОператору(имя = "Отправка текста переписки на электронную почт") +
//
// Сценарий проверяет файлы в переписке и формирует ссылки для отправки файлов
выполнитьJs("""
try {
  var parsedExtFiles = JSON.parse(externalFiles);
} catch(e) {
  var parsedExtFiles = [];
}

var numOfFiles = parsedExtFiles.length;
var filesMessage = '';
var filesUrls = [];
var sentFilesNum = 0;

if (numOfFiles > 0) {
  for (var f = 0; f < numOfFiles; f++) {
    if (parseInt(JSON.parse(parsedExtFiles[f])["size"]) < parseInt(maximumFileSize)) {      
      filesUrls.push( 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[f])['id'] );
      sentFilesNum += 1;
    } else {
      filesMessage = filesMessage + (JSON.parse(parsedExtFiles[f])['name']) + ', ';      
    }
  }
}

if (filesMessage != '') {
  filesMessage = 'При вложении были пропущены файлы ' + filesMessage.slice(0,filesMessage.length-2) + ' из-за ограничения по размеру вложений ' + maximumFileSize + ' байт';
} 
if (sentFilesNum > 0) {
    filesMessage = 'К письму были приложены файлы - ' + sentFilesNum.toString() + ' шт. ' + filesMessage;
} else {
  filesMessage = 'К письму нет вложенных файлов. ' + filesMessage;
}

var exit = {'filesMessage': filesMessage, 'filesUrls': filesUrls};
exit;
""") +
//
// Сценарий сообщает оператору о вложенных и пропущенных файлах
комментарий("{filesMessage}") +
//
// Сценарий получает историю сообщений и формирует запрос на отправку письма
выполнитьJs("""
var rawText = '';

var msgTypes = ['Question', 'AnswerOperator', 'AnswerChatterbox','AnswerOperatorWithBot','AnswerOperator', 'AnswerBot']; 
var labelMap = {
    'Question': 'Пользователь:',
    'AnswerOperator': 'Оператор:',
    'AnswerBot': 'Бот:',
    'AnswerChatterbox': 'Бот:',
    'AnswerOperatorWithBot': 'Оператор:'
  }

if (conversation.channelUser.fullName) {
  if (conversation.channelUser.email) {
    var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (' + conversation.channelUser.email + ')</div>';
  } else {
    var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (адрес EMAIL не зарегистрирован)</div>';
  }
} else {
  if (conversation.channelUser.email) {
    var line_1 = '<div>Переписка с пользователем ' + conversation.channelUser.email + ' (ФИО не указано)</div>';
  } else {
    var line_1 = '<div>Переписка с неизвестным пользователем</div>'
  }
}

if (conversation.messages.length > 0) {
  var first_event = conversation.messages[0];
  var line_2 = '<div>Дата начала диалога ' + first_event.ts.slice(8,10) + '.' + first_event.ts.slice(5,7) + '.' + first_event.ts.slice(0,4);
  line_2 = line_2 + ' ' + first_event.ts.slice(11,13) + ':' + first_event.ts.slice(14,16) + '</div><br>';
} else {
  var line_2 = '<div>Дата начала диалога не указана</div><br>';
}

if (comment == '' || comment == 'NaN') {
  var line_3 = '<div>Оператор не оставил комментарий к переписке.</div>';  
} else {
  var line_3 = '<div><b>Комментарий оператора к переписке:</b> ' + comment + '</div>';
}
line_3 = line_3 + '<div>' + filesMessage + '</div><br>';

var messages = conversation.messages.filter(function (str) {return  msgTypes.indexOf(str.tpe) > -1;});
for (var i = 0; i < messages.length; i++) {
  var message = messages[i];
  var label = labelMap[message.tpe] || '';
  if (label) {
    if (formated_text != 'true') {
      clean_txt = message.txt.replace(/<a[^>]*href="([^"]+)"[^>]*>(?:.*?<\/a>)?/g, '$1').replace(/<\/?[^>]+(>|$)/g, "").replace(/(\r\n|\n|\r)/gm, '\n');
      rawText = rawText + '\n' + message.ts.slice(11,16) + ' ' + label + '\n' + clean_txt;
    } else {
      clean_txt = message.txt.replace(/(\r\n|\n|\r)/gm, '');
      rawText = rawText + '<div>' + message.ts.slice(11,16) + ' ' + label + '</div><div>' + clean_txt + '</div>';
    }
    
  }
}
if (rawText == '') {
  var line_4 = '<div><b>Содержание переписки недоступно.</b></div>'
} else {
  var line_4 = '<div><b>Содержание переписки</b></div>';
}

if (formated_text == 'true') {
  var final_text = '<html><head></head><body>' + line_1 + line_2 + line_3 + line_4 + rawText + '</body></html>';
} else {
  var final_text = line_1 + '\n' + line_2 + '\n' + line_3 + '\n\n' + line_4;
  final_text = final_text.replace(/<\/?[^>]+(>|$)/g, "") + '\n' + rawText;
}

var request = {
  from: from_email,
  to: email,
  subject: subject,
  body: final_text,
  files: JSON.parse(filesUrls)
}

var exit = {'request': JSON.stringify(request)};
exit;
""")+
// 
// Сценарий отправляет запрос на формирование письма
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type","application/json")).сТеломСообщения("{request}").сохранитьРезультатКакСтроку("answer")+
// 
// Если сервис по отправке писем ответил ошибкой сценарий сообщает об этом пользователю и завершает работу
если("{http_code} > 202").то(
  //если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
  комментарий("При отправке письма возникла ошибка {http_code} - {answer}")+
  завершить
)+
//
// Если сервис по отправке писем успешно отправляет письмо то сценарий сообщает об отправке и завершает свою работу
комментарий("Письмо с перепиской отправлено на адрес {email}") + 
завершить

Сценарий позволяет оператору отправить текст переписки и выбранные файлы из переписки на электронную почту.

Expand
titleНажмите здесь, чтобы развернуть пример сценария
Image Added
Code Block
// Сценарий отправляет на указанный адрес текст переписки с пользователем.
// Дополнительно к письму прикладываются файлы, выбранные оператором.
// Сценарий может быть использован как для отправки переписки самому пользователю так и для отправки письма в сторонний сервис. 
//
// Настройки сценария
// 
// Формат текста письма. Установите true для HTML и false для обычного текста.
установитьПеременную("formated_text", "true") +
// Максимальный размер файлов для отправки в качестве вложения. Сценарий сообщит о пропущенных файлах и оператору и получателю письма.
установитьПеременную("useUserEmail", "true") +
// Адрес отправителя 
установитьПеременную("from_email", "noreply@autofaq.ai") +
// Предустановленная тема письма. Оператор сможет сменить тему перед отправкой письма.
установитьПеременную("subject", "Переписка с пользователем {userFullName}")+
//
// Адрес сервиса по отправке писем, встроенного в AutoFAQ
установитьПеременную("host", "http://porter/api/postman/mail") +
//дополнительные переменные
установитьПеременную("t1","false")+
установитьПеременную("t2","false")+
установитьПеременную("t3","false")+
установитьПеременную("t4","false")+
установитьПеременную("t5","false")+
//
// Основной код сценария
//
// Сценарий проверяет файлы в переписке
выполнитьJs("""
try {
  var parsedExtFiles = JSON.parse(externalFiles);
} catch(e) {
  var parsedExtFiles = [];
}
var numOfFiles = parsedExtFiles.length;
var filesUrl_01 = ''; var filesUrl_name_01 = '';var filesUrl_size_01 = '';
var filesUrl_02 = ''; var filesUrl_name_02 = '';var filesUrl_size_02 = '';
var filesUrl_03 = ''; var filesUrl_name_03 = '';var filesUrl_size_03 = '';
var filesUrl_04 = ''; var filesUrl_name_04 = '';var filesUrl_size_04 = '';
var filesUrl_05 = ''; var filesUrl_name_05 = '';var filesUrl_size_05 = '';
var idx = 0;
var contentIndex = 0;
if (numOfFiles > 5) {
  numOfFiles = 5;
}
if (numOfFiles > 0) {
  for (var i = 0; i < numOfFiles; i++) {
      idx = idx + 1;
      if (idx == 1) {filesUrl_01 = 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[i])['id'];filesUrl_name_01 =JSON.parse(parsedExtFiles[i])['name'];contentIndex = 1;filesUrl_size_01 = JSON.parse(parsedExtFiles[i])['size'];}
      if (idx == 2) {filesUrl_02 = 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[i])['id'];filesUrl_name_02 =JSON.parse(parsedExtFiles[i])['name'];contentIndex = 2;filesUrl_size_02 = JSON.parse(parsedExtFiles[i])['size'];}
      if (idx == 3) {filesUrl_03 = 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[i])['id'];filesUrl_name_03 =JSON.parse(parsedExtFiles[i])['name'];contentIndex = 3;filesUrl_size_03 = JSON.parse(parsedExtFiles[i])['size'];}
      if (idx == 4) {filesUrl_04 = 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[i])['id'];filesUrl_name_04 =JSON.parse(parsedExtFiles[i])['name'];contentIndex = 4;filesUrl_size_04 = JSON.parse(parsedExtFiles[i])['size'];}
      if (idx == 5) {filesUrl_05 = 'http://bot-platform-back:8090/api/files/' + JSON.parse(parsedExtFiles[i])['id'];filesUrl_name_05 =JSON.parse(parsedExtFiles[i])['name'];contentIndex = 5;filesUrl_size_05 = JSON.parse(parsedExtFiles[i])['size'];}
    }
}
var exit = {'contentIndex': contentIndex, 'filesUrl_01':filesUrl_01, 'filesUrl_02':filesUrl_02, 'filesUrl_03':filesUrl_03, 'filesUrl_04':filesUrl_04, 'filesUrl_05':filesUrl_05, 'filesUrl_name_01':filesUrl_name_01, 'filesUrl_name_02':filesUrl_name_02, 'filesUrl_name_03':filesUrl_name_03, 'filesUrl_name_04':filesUrl_name_04, 'filesUrl_name_05':filesUrl_name_05, 'filesUrl_size_01': filesUrl_size_01, 'filesUrl_size_02':filesUrl_size_02,'filesUrl_size_03':filesUrl_size_03,'filesUrl_size_04':filesUrl_size_04,'filesUrl_size_05':filesUrl_size_05};
exit;
""") +
//отображаем список файлов для выбора
если("{contentIndex} > 0").то(
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t1_txt",
  значение = "{filesUrl_name_01} размер {filesUrl_size_01} b",
  название = "",
  тип = "Однострочный нередактируемый текст",
  обязательное = false
) +
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t1",
  название = "",
  тип = "Переключатель",
  описание = "",
  обязательное = false
)
)+
если("{contentIndex} > 1").то(
  
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t2_txt",
  значение = "{filesUrl_name_02} размер {filesUrl_size_02} b",
  название = "",
  тип = "Однострочный нередактируемый текст",
  обязательное = false
) +
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t2",
  название = "",
  тип = "Переключатель",
  описание = "",
  обязательное = false
)
)+
если("{contentIndex} > 2").то(
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t3_txt",
  значение = "{filesUrl_name_03} размер {filesUrl_size_03} b",
  название = "",
  тип = "Однострочный нередактируемый текст",
  обязательное = false
) +
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t3",
  название = "",
  тип = "Переключатель",
  описание = "",
  обязательное = false
)
)+
если("{contentIndex} > 3").то(
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t4_txt",
  значение = "{filesUrl_name_04} размер {filesUrl_size_04} b",
  название = "",
  тип = "Однострочный нередактируемый текст",
  обязательное = false
) +
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t4",
  название = "",
  тип = "Переключатель",
  описание = "",
  обязательное = false
)
)+
если("{contentIndex} == 5").то(
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t5_txt",
  значение = "{filesUrl_name_05} размер {filesUrl_size_05} b",
  название = "",
  тип = "Однострочный нередактируемый текст",
  обязательное = false
) +
  добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "t5",
  название = "",
  тип = "Переключатель",
  описание = "",
  обязательное = false
)
)+
// Сценарий предустанавливает адрес получателя из данных пользователя или оставляет поле пустым
если("{useUserEmail} == true").то(
  установитьПеременную("_email", "{userEmail}") 
)+
// Сценарий собирает форму для сбора данных у пользователя - адрес и комментарий к письму
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "formName",
  название = "",
  значение = "Сценарий отправит электронное письмо с текстом переписки на указанный адрес. Выбранные файлы в переписке будут приложены к письму.",
  тип = "Нередактируемый текст",
  описание = "",
  обязательное = false
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "email",
  значение = "{_email}",
  название = "Укажите адрес email",
  тип = "Однострочный редактируемый текст",
  обязательное = true
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "subject",
  значение = "{subject}",
  название = "Укажите тему письма",
  тип = "Однострочный редактируемый текст",
  обязательное = true
) +
добавитьПолеВФормуОператора(
  форма = "Отправка текста переписки на электронную почт",
  переменная = "comment",
  значение = "",
  название = "Комментарий к письму",
  тип = "Многострочный редактируемый текст",
  обязательное = false
) +
//  
// Сценарий отображает форму для опроса оператора
показатьФормуОператору(имя = "Отправка текста переписки на электронную почт") +
//
//собирает выбранные вложения для отправки в письме
комментарий("{filesUrl_01}")+
выполнитьJs("""
var filesUrls = [];
if (t1 == 'true'){
filesUrls.push(filesUrl_01);
}
if (t2 == 'true'){
filesUrls.push(filesUrl_02);
}
if (t3 == 'true'){
filesUrls.push(filesUrl_03);
}
if (t4 == 'true'){
filesUrls.push(filesUrl_04);
}
if (t5 == 'true'){
filesUrls.push(filesUrl_05);
}
var exit = {'filesUrls' : filesUrls};
exit;
""")+
//
// Сценарий получает историю сообщений и формирует запрос на отправку письма
выполнитьJs("""
var rawText = '';

var msgTypes = ['Question', 'AnswerOperator', 'AnswerChatterbox','AnswerOperatorWithBot','AnswerOperator', 'AnswerBot']; 
var labelMap = {
    'Question': 'Пользователь:',
    'AnswerOperator': 'Оператор:',
    'AnswerBot': 'Бот:',
    'AnswerChatterbox': 'Бот:',
    'AnswerOperatorWithBot': 'Оператор:'
  }

if (conversation.channelUser.fullName) {
  if (conversation.channelUser.email) {
    var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (' + conversation.channelUser.email + ')</div>';
  } else {
    var line_1 = '<div>Переписка с пользователем <b>' + conversation.channelUser.fullName + '</b> (адрес EMAIL не зарегистрирован)</div>';
  }
} else {
  if (conversation.channelUser.email) {
    var line_1 = '<div>Переписка с пользователем ' + conversation.channelUser.email + ' (ФИО не указано)</div>';
  } else {
    var line_1 = '<div>Переписка с неизвестным пользователем</div>'
  }
}

if (conversation.messages.length > 0) {
  var first_event = conversation.messages[0];
  var line_2 = '<div>Дата начала диалога ' + first_event.ts.slice(8,10) + '.' + first_event.ts.slice(5,7) + '.' + first_event.ts.slice(0,4);
  line_2 = line_2 + ' ' + first_event.ts.slice(11,13) + ':' + first_event.ts.slice(14,16) + '</div><br>';
} else {
  var line_2 = '<div>Дата начала диалога не указана</div><br>';
}

if (comment == '' || comment == 'NaN') {
  var line_3 = '<div>Оператор не оставил комментарий к переписке.</div>';  
} else {
  var line_3 = '<div><b>Комментарий оператора к переписке:</b> ' + comment + '</div>';
}
line_3 = line_3 + '<br>';

var messages = conversation.messages.filter(function (str) {return  msgTypes.indexOf(str.tpe) > -1;});
for (var i = 0; i < messages.length; i++) {
  var message = messages[i];
  var label = labelMap[message.tpe] || '';
  if (label) {
    if (formated_text != 'true') {
      clean_txt = message.txt.replace(/<a[^>]*href="([^"]+)"[^>]*>(?:.*?<\/a>)?/g, '$1').replace(/<\/?[^>]+(>|$)/g, "").replace(/(\r\n|\n|\r)/gm, '\n');
      rawText = rawText + '\n' + message.ts.slice(11,16) + ' ' + label + '\n' + clean_txt;
    } else {
      clean_txt = message.txt.replace(/(\r\n|\n|\r)/gm, '');
      rawText = rawText + '<div>' + message.ts.slice(11,16) + ' ' + label + '</div><div>' + clean_txt + '</div>';
    }
    
  }
}
if (rawText == '') {
  var line_4 = '<div><b>Содержание переписки недоступно.</b></div>'
} else {
  var line_4 = '<div><b>Содержание переписки</b></div>';
}

if (formated_text == 'true') {
  var final_text = '<html><head></head><body>' + line_1 + line_2 + line_3 + line_4 + rawText + '</body></html>';
} else {
  var final_text = line_1 + '\n' + line_2 + '\n' + line_3 + '\n\n' + line_4;
  final_text = final_text.replace(/<\/?[^>]+(>|$)/g, "") + '\n' + rawText;
}

var request = {
  from: from_email,
  to: email,
  subject: subject,
  body: final_text,
  files: JSON.parse(filesUrls)
}

var exit = {'request': JSON.stringify(request)};
exit;
""")+
// 
// Сценарий отправляет запрос на формирование письма
вызвать.внешнийСервис("{host}", "POST").сЗаголовками(("Content-Type","application/json")).сТеломСообщения("{request}").сохранитьРезультатКакСтроку("answer")+
// 
// Если сервис по отправке писем ответил ошибкой сценарий сообщает об этом пользователю и завершает работу
если("{http_code} > 202").то(
  //если запрос завершен с ошибкой сценарий помещает в диалог соответствующий комментарий и завершает свою работу
  комментарий("При отправке письма возникла ошибка {http_code} - {answer}")+
  завершить
)+
//
// Если сервис по отправке писем успешно отправляет письмо то сценарий сообщает об отправке и завершает свою работу
комментарий("Письмо с перепиской отправлено на адрес {email}") + 
завершить

Работа со спамом

Эти сценарии позволяют оператору установить признак “спам” пользователю, для закрытия всех следующих диалогов пользователя диалогов.

...