====== Интерактивное упраление АТС (пример) ======
[[faq:|Обратно к инструкциям]]
Опишием скрипт, который позволит сотрудникам позвонить на номер приложения или с мобильного на номер компании для настройки длительности звонка на внутренний номер перед переадресацией на мобильный.
Периодически каждая компания сталкивается с проблемой поступления «спам» звонков. В связи с этим возникает потребность блокировки определенных номеров, чтобы звонки с этих номеров не поступали.
- Создайте новое "[[:dialplan-applications|Приложение диалплан]]"
- Укажите произвольное название, к примеру **User settings**
- Выберите "**Тип кода**" - "**PHP AGI Скрипт**"
- На вкладке "**Программный код**" вставьте: voice);
$fullFileName = self::TTS_DIR .'/'. $speech_filename . $result_extension;
$fullFileNameFromService = self::TTS_DIR .'/'. $speech_filename . $speech_extension;
// Проверим вдург мы ранее уже генерировали такой файл.
if (file_exists($fullFileName) && filesize($fullFileName) > 0) {
return self::TTS_DIR .'/'. $speech_filename;
}
// Файла нет в кеше, будем генерировать новый.
$post_vars = [
'lang' => 'ru-RU',
'format' => 'lpcm',
'speed' => '1.0',
'sampleRateHertz' => '8000',
'voice' => $this->voice,
'text' => urldecode($text_to_speech),
];
$fp = fopen($fullFileNameFromService, 'wb');
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, ["Authorization: Api-Key ".self::API_KEY]);
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 4);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post_vars));
curl_setopt($curl, CURLOPT_URL, 'https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize');
curl_exec($curl);
$http_code = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
fclose($fp);
if (200 === $http_code && file_exists($fullFileNameFromService) && filesize($fullFileNameFromService) > 0) {
exec("sox -r 8000 -e signed-integer -b 16 -c 1 -t raw $fullFileNameFromService $fullFileName");
if (file_exists($fullFileName)) {
// Удалим raw файл.
@unlink($fullFileNameFromService);
// Файл успешно сгененрирован
return self::TTS_DIR.'/'.$speech_filename;
}
} elseif (file_exists($fullFileNameFromService)) {
@unlink($fullFileNameFromService);
}
return null;
}
}
$agi = new AGI();
$agi->set_variable('AGIEXITONHANGUP', 'yes');
$agi->set_variable('AGISIGHUP', 'yes');
$agi->set_variable('__ENDCALLONANSWER', 'yes');
$agi->answer();
$userPhone = $agi->request['agi_callerid'];
$userData = Extensions::findFirst("number='$userPhone'");
if(!$userData || !empty($userData->userid)){
exit(0);
}
$ys = new YandexSynthesize();
$filenameAlert = $ys->makeSpeechFromText('Добрый день ');
$agi->exec('Playback', $filenameAlert);
$filenameAlert = $ys->makeSpeechFromText($userData->callerid);
$agi->exec('Playback', $filenameAlert);
$filenameCheck = $ys->makeSpeechFromText('Нажмите 1, чтобы настроить длительность вызова на внутренний номер. Нажмите 0, если желаете продолжить вызов.');
$result = $agi->getData($filenameCheck, 3000, 1);
$selectedNum = $result['result']??'';
if($selectedNum !== '1'){
exit(0);
}
$filenameCheck = $ys->makeSpeechFromText('Укажитель длительность вызова, значение от 3 до 99');
$result = $agi->getData($filenameCheck, 3000, 2);
$selectedNum = $result['result']??'';
if(is_numeric($selectedNum)){
$selectedNum = max(3, (int)$selectedNum);
$filenameAlert = $ys->makeSpeechFromText('Устанавливаем значение '.$selectedNum);
$agi->exec('Playback', $filenameAlert);
$userData = Extensions::findFirst("userid='$userData->userid' AND type='SIP'");
if($userData){
$forward = ExtensionForwardingRights::findFirst("extension='$userData->number'");
if($forward){
$forward->ringlength = $selectedNum;
}
$forward->save();
$agi->hangup();
}else{
$filenameAlert = $ys->makeSpeechFromText('Ошибка, не найден внутренний номер');
$agi->exec('Playback', $filenameAlert);
}
}
- В скрипте задайте значение константы **API_KEY**, см. [[https://wiki.miko.ru/smartivr:yandextts|инструкции]]
- Сохраните изменения и скопируйте идентификатор приложения из адресной строки браузера
- Перейдите в раздел **Система** -> **Кастомизация системных файлов**, откройте для редактирования файл **extensions.conf** {{ :providers:2018-12-11_170112.png |}}
- Выберите режим **"Добавлять в конец файла"**, внизу в черное поле для редактирования вставьте следующие строки:
[add-trim-prefix-clid-custom]
exten => _[0-9*#+a-zA-Z][0-9*#+a-zA-Z]!,1,NoOp(start check blacklist)
same => n,AGI(DIALPLAN-APP-BE22D80F2A270C0020A1192B001A6653.php)
same => n,Return()
, где "**DIALPLAN-APP-BE22D80F2A270C0020A1192B001A665**" - это идентификатор приложения
- Сохраните изменения!
[[faq:|Обратно к инструкциям]]