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}") + 
завершить

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

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

1. Пометить как “СПАМ”

Необходимо добавить сценарий интеграцию на событие “Нажатие кнопки оператором”, добавить кнопку в настройках оператора для выполнения интеграции.

Данный сценарий позволяет оператору установить признак “СПАМ” пользователю

Expand
Code Block
установитьПеременнуюПользователю("userPayload.SPAM", "1")+
комментарий("Пользователь отмечен как СПАМ, можно закрывать диалог. Все последующие обращения будут закрываться автоматически")+
завершить

2. Закрыть “СПАМ”

Необходимо добавить сценарий интеграцию на событие Поступление диалога в систему.

При поступлении диалога будет выполняться проверка наличия признака “СПАМ” у пользователя. При наличии признака диалог будет закрываться.

Expand
Code Block
если("{userPayload.SPAM} == 1").то(
завершитьИЗакрытьДиалог()
)+
завершить

3. Снять признак “СПАМ”

Необходимо добавить сценарий интеграцию на событие “Нажатие кнопки оператором”, добавить кнопку в настройках оператора для выполнения интеграции.

Для снятия признака “СПАМ” оператору необходимо будет инициировать диалог с пользователем, отмеченным как “СПАМ”, и выбрать действие “Снять признак СПАМ”

Expand
Code Block
установитьПеременнуюПользователю("userPayload.SPAM", "")+
комментарий("С пользователя снята пометка СПАМ")+
завершить

Работа с таблицами Google Sheets

...