+7(960) 250-82-68 spam@mirossa.ru


  MCU         C           1С         PHP       JAVA      разное 


Скрипты
 
 

Запрос на звонок через Битрикс. REST

Делаем запрос на звонок через webhook Битрикс. Получаем id запроса. Позже проверяем статус звонка по этому id.

<?
	$queryUrl = 'https://mirossa.bitrix24.ru/rest/190/c473xhf2qsfahmxy/voximplant.infocall.startwithtext.json';
	
	$queryData = http_build_query(array(
 
     'FROM_LINE' => "78123891111",
	 'TO_NUMBER' => "79111238765",
	 'TEXT_TO_PRONOUNCE' => "Ваша задолженность равна 999 рублей.",
	 'VOICE' => "ruinternalmale",
 ));
	
	$curl = curl_init();
 curl_setopt_array($curl, array(
 CURLOPT_SSL_VERIFYPEER => 0,
 CURLOPT_POST => 1,
 CURLOPT_HEADER => 0,
 CURLOPT_RETURNTRANSFER => 1,
 CURLOPT_URL => $queryUrl,
 CURLOPT_POSTFIELDS => $queryData,

 ));

 $result = curl_exec($curl);
 curl_close($curl);

  echo $result;

Проверка статусов звонков.

<?
	$queryUrl = 'https://mirossa.bitrix24.ru/rest/190/c473xhf2qsfahmxy/voximplant.statistic.get.json';
	
	
	$queryData = http_build_query(array( 
		'FILTER' => array("CALL_ID" => 
				array("infocall.7286eb453c009df2a0ef0f062ee7fb8a.1559036330",
					"infocall.f1241e3127e4d9139c56f68174a5e89b.1559036362")),
	));
	
	//примеры рабочих запросов:
	// (А) отбор по длительности звонка
	// 'FILTER' => "\">CALL_DURATION\":1000",
	 // 'SORT' => "CALL_DURATION",
	 // 'ORDER' => "DESC",
	 // или
	 // код 
	 // $queryData = http_build_query(array(
     // 'FILTER' => array(">CALL_DURATION" => 1000),
	 // 'SORT' => "CALL_DURATION",
	 // 'ORDER' => "DESC",))
	 // параметры 
	 // FILTER[>CALL_DURATION]=1000&SORT=CALL_DURATION&ORDER=DESC
	 
	 // (Б) отбор по длительности звонка (диапазон)
	 // код
	 // $queryData = http_build_query(array(
     // 'FILTER' => array(">CALL_DURATION" => 800, "<CALL_DURATION" => 1000),
	 // 'SORT' => "CALL_DURATION",
	 // 'ORDER' => "DESC",))
	 // параметры
	 // FILTER[>CALL_DURATION]=800&FILTER[<CALL_DURATION]=1000&SORT=CALL_DURATION&ORDER=DESC
	
	// (В)
	// отбор по одному CALL_ID
	// FILTER[CALL_ID]=infocall.7286eb453c009df2a0ef0f062ee7fb8a.1559036362&SORT=CALL_DURATION&ORDER=DESC
	
	// (Г)
	// отбор по массиву CALL_ID
	//код 
	//http_build_query(array( 
	//	'FILTER' => array("CALL_ID" => 
	//			array("infocall.7286eb453c009df2a0ef0f062ee7fb8a.1559036330",
	//				"infocall.f1241e3127e4d9139c56f68174a5e89b.1559036362")),
	//))
	// параметры
	// FILTER[CALL_ID][0]=infocall.7286eb453c009df2a0ef0f062ee7fb8a.1559036330&FILTER[CALL_ID][1]=infocall.f1241e3127e4d9139c56f68174a5e89b.1559036362&SORT=CALL_DURATION&ORDER=DESC
	
	//структура положительного ответа
	// {
    // "result" : [
        // +{ ... },  // вложенная информация
        // +{ ... }
        
    // ],
    // "total" : 2,
    // "time" : -{
        // "start" : 1559051955.6466,
        // "finish" : 1559051955.7037,
        // "duration" : 0.057098865509033,
        // "processing" : 0.030126094818115,
        // "date_start" : 2019-05-28T16:59:15+03:00,
        // "date_finish" : 2019-05-28T16:59:15+03:00
    // }
	// }
	
	
	
	//ответ на ошибочный запрос
	// {"error":100,"error_description":"Unknown field definition `SDF` (SDF) for Statistic Entity."}Unknown field definition `SDF` (SDF) for Statistic Entity.
	

 $curl = curl_init();
 curl_setopt_array($curl, array(
 CURLOPT_SSL_VERIFYPEER => 0,
 CURLOPT_POST => 1,
 CURLOPT_HEADER => 0,
 CURLOPT_RETURNTRANSFER => 1,
 CURLOPT_URL => $queryUrl,
 CURLOPT_POSTFIELDS => $queryData,

 ));

 $result = curl_exec($curl);

 curl_close($curl);

 echo $result;
  


?>

Аналог в 1С. Обзвон контрагентов.

Процедура ОбзвонКонтрагентовЧерезБитрикс24() 
	
	Голос = "ruinternalmale"; // "Русский (мужской)"  // получить список голосов voximplant.tts.voices.get
							// "ruinternalfemale" - "Русский (женский)"

	//
	результат = ЗапросНаЗвонок("79111238765", "Ваша задолженность равна 999 рублей.", Голос);
	Если результат = Истина Тогда
		// затем можно проверить статус звонка (Успешный звонок, Недозвон и другие) методом voximplant.statistic.get
	Иначе
		 //так как получен ответ от сервера, не содержащий "RESULT":true , 
		 // то пока сохраняем результат для визуального анализа
	КонецЕсли;
	
КонецПроцедуры

Функция ЗапросНаЗвонок(НомерКонтрагента, ПроговариваемыйТекст, Голос)
	
	соединение = новый HTTPСоединение("mirossa.bitrix24.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());
	
	// dev.1c-bitrix.ru/rest_help/scope_telephony/voximplant/voximplant_infocall_startwithtext.php
	
	//для формирования адреса ресурса создаём вэб хук в битриксе (даем нужные права) и прибавляем имя метода. 
	// .json(или .xml) в конце метода - формат возвращаемого ответа. 
	запрос = новый HTTPЗапрос("rest/190/c473xhf2qsfahmxy/voximplant.infocall.startwithtext.json");
	//доступные значения для параметра FROM_LINE можно получить методом voximplant.line.get
	текстЗапроса = "FROM_LINE=78123891111&TO_NUMBER=" + НомерКонтрагента + "&TEXT_TO_PRONOUNCE=" + ПроговариваемыйТекст + "&VOICE=" + Голос;
	
	запрос.УстановитьТелоИзСтроки(текстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	ответ = соединение.ОтправитьДляОбработки(запрос);
	текстОтвета = ответ.ПолучитьТелоКакСтроку();
	
	//пример ответа = "{""result"":{""RESULT"":true,""CALL_ID"":""infocall.45788ed4a3a5f5b6db2c7abd6ad4f143.1558688293""},
	//   ""time"":{""start"":1558688293.053,""finish"":1558688293.5643,""duration"":0.51134586334229,
	//   ""processing"":0.44696307182312,""date_start"":""2019-05-24T11:58:13+03:00"",
	//   ""date_finish"":""2019-05-24T11:58:13+03:00""}}";
	
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(текстОтвета);
	Пока ЧтениеJSON.Прочитать() Цикл
		
		Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
			Если ЧтениеJSON.ТекущееЗначение = "RESULT" Тогда
				 ЧтениеJSON.Прочитать();
				 Если ЧтениеJSON.ТекущееЗначение = Истина Тогда
					 ЧтениеJSON.Закрыть();
					 возврат Истина;             //
				 Иначе
					 ЧтениеJSON.Закрыть();
					 возврат текстОтвета;
				 КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
	КонецЦикла;
	
    ЧтениеJSON.Закрыть();
	возврат текстОтвета;
	
КонецФункции

// битрикс отдает порциями по 50 обработанных CALL_ID (если отправить запрос на большее кол-во).
// (как вариант: можно отдавать битриксу не более 50 за раз)

Функция ПроверкаСтатусовЗвонков(массивCALL_ID)
	
	соединение = новый HTTPСоединение("mirossa.bitrix24.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL());
	
	запрос = новый HTTPЗапрос("rest/190/c473xhf2qsfahmxy/voximplant.statistic.get.json");
	
	//формируем текст запроса
	текстЗапроса = "";
	сс = -1;
	для каждого эл из массивCALL_ID Цикл
		сс = сс + 1;
		текстЗапроса = текстЗапроса + "FILTER[CALL_ID][" + строка(сс) + "]=" + эл + "&";
	КонецЦикла;
	
	текстЗапроса = Сред(текстЗапроса, 1, СтрДлина(текстЗапроса) - 1);
	 
	                        
	запрос.УстановитьТелоИзСтроки(текстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
	ответ = соединение.ОтправитьДляОбработки(запрос);
	текстОтвета = ответ.ПолучитьТелоКакСтроку();
	
	// проверка ответа...   "CALL_FAILED_CODE" = 200
			
	возврат Истина;
	
КонецФункции

Список голосов:

"auenglishfemale" - "Австралийский английский (женский)"
"brportuguesefemale" - "Бразильский португальский (женский)"
"caenglishfemale" - "Канадский английский (женский)"
"cafrenchfemale" - "Канадский французский (женский)"
"cafrenchmale" - "Канадский французский (мужской)"
"chchinesefemale" - "Китайский (женский)"
"chchinesemale" - "Китайский (мужской)"
"eurcatalanfemale" - "Каталонский (женский)"
"eurczechfemale" - "Чешский (женский)"
"eurdanishfemale" - "Датский (женский)"
"eurdutchfemale" - "Голландский (женский)"
"eurfinnishfemale" - "Финский (женский)"
"eurfrenchfemale" - "Французский (женский)"
"eurfrenchmale" - "Французский (мужской)"
"eurgermanfemale" - "Немецкий (женский)"
"eurgermanmale" - "Немецкий (мужской)"
"euritalianfemale" - "Итальянский (женский)"
"euritalianmale" - "Итальянский (мужской)"
"eurnorwegianfemale" - "Норвежский (женский)"
"eurpolishfemale" - "Польский (женский)"
"eurportuguesefemale" - "Португальский (женский)"
"eurportuguesemale" - "Португальский (мужской)"
"eurspanishfemale" - "Испанский (женский)"
"eurspanishmale" - "Испанский (мужской)"
"eurturkishfemale" - "Турецкий (женский)"
"eurturkishmale" - "Турецкий (мужской)"
"hkchinesefemale" - "Гонконгский кантонский (женский)"
"huhungarianfemale" - "Венгерский (женский)"
"jpjapanesefemale" - "Японский (женский)"
"jpjapanesemale" - "Японский (мужской)"
"krkoreanfemale" - "Корейский (женский)"
"krkoreanmale" - "Корейский (мужской)"
"ruinternalfemale" - "Русский (женский)"
"ruinternalmale" - "Русский (мужской)"
"swswedishfemale" - "Шведский (женский)"
"twchinesefemale" - "Тайванский китайский (женский)"
"ukenglishfemale" - "Английский (женский)"
"ukenglishmale" - "Английский (мужской)"
"usenglishfemale" - "Американский английский (женский)"
"usenglishmale" - "Американский английский (мужской)"
"usspanishfemale" - "Американский испанский (женский)"
"usspanishmale" - "Американский испанский (мужской)"