В начало

Автоматическое обновление результата звонков

 

            Создаем новые объекты:

1)     Общий модуль «TWIN_ГолосовойБот»

2)     Регламентное задание «TWIN_ОбновлениеРезультатовЗвонковГолосовогоБота»

3)     Справочник «TWIN_РезультатыЗвонков»

4)     Независимый периодический регистр сведений «TWIN_ГолосовойБот»

 

Листинг. Общий модуль «TWIN_ГолосовойБот»

 

&НаСервере

Функция ПолучитьТокенTWIN()

    Адрес = "iam.twin24.ai";               

 

            Соединение = Новый HTTPСоединение(Адрес,443,,, ,30, Новый ЗащищенноеСоединениеOpenSSL);  

                       

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Запрос = Новый HTTPЗапрос("/api/v1/auth/login", Заголовки);

           

            ТелоЗапроса = "{

            | ""email"": ""123... "",

            | ""password"": ""123…"",

            | ""ttl"": ""3600""

            | }";

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

           

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);                      

                       

            Если Результат.КодСостояния = 200 Тогда

                       

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

                        ЧтениеJSON.Закрыть();

           

            Возврат РезСтруктура.token;                                         

            Иначе

                        Возврат "";

            КонецЕсли;   

 

КонецФункции

 

 

&НаСервере

Функция ПолучитьСтатистикуНаСервере(Токен)

            Адрес = "analyse.twin24.ai";

            Соединение = Новый HTTPСоединение(Адрес,443,,,,30, Новый ЗащищенноеСоединениеOpenSSL);  

           

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Заголовки.Вставить("Authorization", "Bearer " + Токен);

                       

            Запрос = Новый HTTPЗапрос("/api/v1/statistics/cis/outgoing/sessions", Заголовки);

           

            ТелоЗапроса = "{

            | ""fields"": """",

            | ""limit"": 1000

            | }";

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);      

 

            Результат2 = Соединение.ВызватьHTTPМетод("GET", Запрос);

           

                                              

            Если Результат2.КодСостояния = 200 Тогда

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Результат2.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);  

                        ЧтениеJSON.Закрыть();

                       

        ПроставитьРезультатОбзвонаВРегистре(РезСтруктура.items);

            Возврат РезСтруктура.items;//Массив телефонов

            Иначе

                        Возврат "";

            КонецЕсли;

           

КонецФункции

 

 

&НаСервере

Процедура ПроставитьРезультатОбзвонаВРегистре(Знач МассивСтатистики)

           

            Для Каждого Эл Из МассивСтатистики Цикл

                       

                        Если НЕ ЗначениеЗаполнено(Эл.nps) Тогда

                                   Продолжить;

                        КонецЕсли;

                       

                        НЗ = РегистрыСведений.TWIN_ГолосовойБот.СоздатьНаборЗаписей();

                        НЗ.Отбор.ИдентификаторЗадания.Установить(Эл.TaskId);

                        НЗ.Отбор.ТелефонИзЛС.Установить(Эл.Number);

                        НЗ.Прочитать();

                       

                        Для Каждого Запись Из НЗ Цикл

                                   Запись.НомерРезультата = Эл.nps;//Номер результата звонка

                                   Запись.РезультатСтрокой = Эл.resultsString;//Результат звонка строкой (иногда с параметрами)

                                   Запись.ИдентификаторКандидата = Эл.autoCallCandidateId;                 

                        КонецЦикла;                                           

                       

                        Если ЗначениеЗаполнено(Эл.TaskId) И

                                    ЗначениеЗаполнено(Эл.Number) Тогда

                                   НЗ.Записать(Истина);

                        КонецЕсли;   

            КонецЦикла;            

           

КонецПроцедуры

 

&НаСервере

Процедура ДляРегламентногоЗадания() Экспорт

            Токен = ПолучитьТокенTWIN();

            МассСтат = ПолучитьСтатистикуНаСервере(Токен);     

КонецПроцедуры    

 

 

 


Рис. Свойства регламентного задания «TWIN_ОбновлениеРезультатовЗвонковГолосовогоБота»

 

Листинг. Модуль формы, с которой создается задание для бота

 

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            МассивПартнеров.ЗагрузитьЗначения(ЭтаФорма.Параметры.МассивСсылок);

КонецПроцедуры

 

 

Функция ПолучитьТокенTWIN()

    Адрес = "iam.twin24.ai";               

            Соединение = Новый HTTPСоединение(Адрес,443,,, ,30, Новый ЗащищенноеСоединениеOpenSSL);  

                       

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Запрос = Новый HTTPЗапрос("/api/v1/auth/login", Заголовки);

           

            ТелоЗапроса = "{

            | ""email"": ""123…"",

            | ""password"": ""123…"",

            | ""ttl"": ""3600""

            | }";

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);                      

            Сообщить("Токен: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                       

                        ЧтениеJSON = Новый ЧтениеJSON();

                        ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8));

                        РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

                        ЧтениеJSON.Закрыть();

           

            Возврат РезСтруктура.token;                                         

            Иначе

                        Возврат "";

            КонецЕсли;   

 

КонецФункции

 

Функция СоздатьЗаданиеНаОбзвонВTWIN(Знач UuidСценария, Знач Токен)

            Адрес = "cis.twin24.ai"; 

            Соединение = Новый HTTPСоединение(Адрес,443,,,,30, Новый ЗащищенноеСоединениеOpenSSL);  

           

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Заголовки.Вставить("Authorization", "Bearer " + Токен);

            Запрос = Новый HTTPЗапрос("/api/v1/telephony/autoCall", Заголовки);

                                              

            ТелоЗапроса = "{

            | ""name"": ""Автотестовое задание"",

            | ""defaultExec"": ""robot"",

            | ""defaultExecData"": """ + UuidСценария + """,

            | ""secondExec"": ""end"",

            | ""secondExecData"": null,

            | ""cidType"": ""gornum"",

            | ""cidData"": ""efc1dea2-3ce6-4567-b089-18aff013ff20"",

            | ""startType"": ""manual"",

            | ""startMoment"": """",

            | ""cps"": ""1.01"",

            | ""taskComment"": ""ТестовоеЗадание1"",

            | ""webhookUrls"":[],

            | ""additionalOptions"":

            |           {""fullListMethod"":""external"",

            |            ""fullListTime"":""0"",

            |    ""useTr"":null,

            |    ""allowCallTimeFrom"":""36000"",

            |    ""allowCallTimeTo"":""61200"",

            |    ""recordCall"":""true"",

            |    ""recTrimLeft"":""1"",

            |    ""detectRobot"":""true"",

            |    ""detectRobotMode"":""block"",

            |    ""detectRobotGreeting"":null,

            |    ""providerId"":null

            |           },

            | ""redialStrategyOptions"":

            |   {""redialStrategyEn"":false,

            |    ""busy"":null,

            |    ""noAnswer"":null,

            |    ""answerMash"":null,

            |    ""congestion"":null,

            |    ""answerNoList"":null

            |   }

            | }"; 

 

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);

            Результат2 = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

           

            ЧтениеJSON = Новый ЧтениеJSON();

            ЧтениеJSON.УстановитьСтроку(Результат2);

            РезСтруктура = ПрочитатьJSON(ЧтениеJSON);

            ЧтениеJSON.Закрыть();

           

            Сообщить("Создание задания: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                        Возврат РезСтруктура.id.identity;

            Иначе

                        Возврат "";

            КонецЕсли;

 

КонецФункции

 

Процедура Пауза(Секунды) Экспорт

           

            ВремяОкончания = ТекущаяДата() + Секунды;

           

            Пока ТекущаяДата() <= ВремяОкончания Цикл   

            КонецЦикла;

           

КонецПроцедуры

 

Функция Заменить8на7вТелефонах(Знач М)//Заменяем первую [8] на [7] в номере телефона

            Индекс = 0;    

           

            Для Каждого Эл из М Цикл

                        Если Сред(Эл, 1, 1) = "8" Тогда

                                   М[Индекс] = "7" + Сред(Эл, 2, 10);

                        КонецЕсли;   

                        Индекс = Индекс + 1;

            КонецЦикла;                       

           

            Возврат М;

КонецФункции

 

&НаСервере

Процедура ДобавитьКандидатаВРегистр(Знач ИдЗадания, Знач МассивТелефонов, Знач СсылкаНаЛС)

           

            Для Каждого Эл Из МассивТелефонов Цикл

                        МЗ = РегистрыСведений.TWIN_ГолосовойБот.СоздатьМенеджерЗаписи();

                        МЗ.Период = ТекущаяДата();

                        МЗ.ИдентификаторЗадания = ИдЗадания;

                        МЗ.ТелефонИзЛС  = Эл;

                        МЗ.ЛС = СсылкаНаЛС;

                       

                        Если ЗначениеЗаполнено(МЗ.ИдентификаторЗадания) И

                                   ЗначениеЗаполнено(МЗ.ТелефонИзЛС) Тогда

                                   МЗ.Записать(Истина);

                        КонецЕсли;   

            КонецЦикла;  

 

КонецПроцедуры

 

&НаСервере

Функция СписокКандидатовВJSON(autoCallId)           

 

            Запрос = Новый Запрос;

            Запрос.Текст =

                        "ВЫБРАТЬ

                        |           Партнеры.Ссылка КАК СсылкаНаЛС,

                        |           Партнеры.УК_ФизЛицо.Имя КАК Имя,

                        |           Партнеры.F1_ТелефонСтрока КАК Телефоны

                        |ИЗ

                        |           Справочник.Партнеры КАК Партнеры

                        |ГДЕ

                        |           Партнеры.Ссылка В (&МассивПартнеров)";

           

            Запрос.УстановитьПараметр("МассивПартнеров", ЭтаФорма.МассивПартнеров);

            Результат = Запрос.Выполнить();

           

            Выгрузка = Результат.Выгрузить();

           

            batch = Новый Массив();

 

            Для Каждого Эл из Выгрузка Цикл

                       

            variables = Новый Структура();

            variables.Вставить("name", Эл.Имя);

            variables.Вставить("age", "22");

           

            Если СтрНайти(Эл.Телефоны, ";") <> 0 Тогда

                        phone = СтрРазделить(Эл.Телефоны, ";");

            Иначе                                                  

                        phone = Новый Массив();

                        phone.Добавить(Эл.Телефоны);     

            КонецЕсли;

           

            phone = Заменить8на7вТелефонах(phone);

           

            с1 = Новый Структура();

            с1.Вставить("id_debt", "");

            с1.Вставить("id_num", "");

           

            callbackData = Новый Массив();

            callbackData.Добавить(с1);

 

            Кандидат = Новый Структура();

            Кандидат.Вставить("phone", phone);

            Кандидат.Вставить("variables", variables);

            Кандидат.Вставить("callbackData", callbackData);

            Кандидат.Вставить("autoCallId", autoCallId);

                       

            batch.Добавить(Кандидат);

           

            ДобавитьКандидатаВРегистр(autoCallId, phone, Эл.СсылкаНаЛС);

           

            КонецЦикла;

           

            Данные = Новый Структура();

            Данные.Вставить("batch", batch);

           

            ЗаписьJSON = Новый ЗаписьJSON;                                

            ЗаписьJSON.УстановитьСтроку();

            ЗаписатьJSON(ЗаписьJSON, Данные);

           

            Возврат ЗаписьJSON.Закрыть();

КонецФункции

 

&НаСервере

Функция ДобавитьКандитатовНаОбзвонВTWIN(Знач Токен, Знач autoCallId)

            Адрес = "cis.twin24.ai";         

            Соединение = Новый HTTPСоединение(Адрес,443,,,,30, Новый ЗащищенноеСоединениеOpenSSL);  

           

            Заголовки = Новый Соответствие;             

            Заголовки.Вставить("Content-Type", "application/json");

            Заголовки.Вставить("Authorization", "Bearer " + Токен);

            Запрос = Новый HTTPЗапрос("/api/v1/telephony/autoCallCandidate/batch", Заголовки);

                                                                      

            ТелоЗапроса = СписокКандидатовВJSON(autoCallId);

            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8);

           

            Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);

            Результат2 = Результат.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

                       

            Сообщить("Добавление кандидатов на обзвон: " + Результат.КодСостояния);

                       

            Если Результат.КодСостояния = 200 Тогда

                        //При успешном выполнении метода придет ответ с кодом 200 без тела

                        Возврат Результат.КодСостояния;

            Иначе

                        Возврат "";

            КонецЕсли;   

КонецФункции

 

&НаКлиенте

Процедура СоздатьЗадание(Команда)

            //СоздатьЗаданиеНаСервере();

           

            UuidСценария = "1dbac234-567f-8c9c-9a01-21247934d602";//2023-11-13

            Токен = ПолучитьТокенTWIN();

           

            autoCallId = СоздатьЗаданиеНаОбзвонВTWIN(UuidСценария, Токен);

            Пауза(5);//Требование на сайте TWIN       

            ДобавитьКандитатовНаОбзвонВTWIN(Токен, autoCallId);

           

КонецПроцедуры