По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Привет! В статье расскажем о бесплатном способе передачи информации о звонящем в момент звонка из Битрикс24. Проверять мы будем лид и контакт. В качестве системы, куда мы будет отправлять данные будет уютный Telegram :) Погнали.
Создаем Вебхук в Битрикс24
Переходим в Битрикс24 и открываем раскрывающееся меню в верхнем левом углу. Далее, выбираем «Вебхуки»:
Добавляем Входящий вебхук, нажав на зеленую кнопку в правом верхнем углу Добавить вебхук. Делаем следующие настройки:
Название - дайте имя. Например «Внешний доступ к REST API»;
Описание - «cоответствие номера клиента и его имени»;
Права доступа - необходимо выбрать «CRM (crm)»;
Нажимаем «Сохранить». Для нас будет сгенерирован Вебхук. Переходим к настройке скрипта.
Telegram - бот
Перед продолжение настройки, вам необходимо создать Telegram – бота. О том, как это сделать читайте по кнопке:
Создание бота
Скрипт интеграции
Из предыдущего шага, у вас должен быть идентификатор чата в Telegram, токен бота, вебхук и доменное имя вашего Битрикс24. Все, остальное дело скрипта:
#!/usr/bin/php -q
<?php
#подключаем AGI - библиотеку;
require('phpagi.php');
$agi = new AGI();
$cid = $agi->request['agi_callerid'];
#от провайдера, номер на нашу АТС прилетает в формате 79ХХХХХХХХХ. В CRM номера записаны как 89ХХХХХХХХХ. Поэтому, мы стрипаем цифру спереди и подставлем 8ку;
$phone = substr($cid, 1);
$phone = "8$phone";
$phoneFieldset = "Коллеги, входящий звонок. Звонящий: ";
#укажите служебные параметры: токен бота, идентификатор чата, хостовое имя CRM (то, что между https:// и до .bitrix24.ru) и вебхук, который мы получили ранее;
$token = "333333333:MMMMMEEEEE_RRRIIIIOOOO_NNNNEEEETTTT";
$chat_id = "-1001001001001";
$crm_id = "имя_вашего_Битрикс24";
$webhook = "wblhahgytuwrnwer";
#проверяем существование лида по номеру;
$bitrix_lead_url = "https://$crm_id.bitrix24.ru/rest/2/$webhook/crm.lead.list.json?filter[PHONE]=$phone&select[]=TITLE&select[]=NAME&select[]=LAST_NAME";
$btl = curl_init();
curl_setopt ($btl, CURLOPT_URL,$bitrix_lead_url);
curl_setopt ($btl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($btl, CURLOPT_TIMEOUT, 60);
curl_setopt ($btl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($btl, CURLOPT_RETURNTRANSFER, 1);
$bitrix_lead = curl_exec ($btl);
curl_close($btl);
$bitrix_lead_o = json_decode($bitrix_lead, true);
$l_total = $bitrix_lead_o['total'];
#проверяем существование контакта по номеру;
$bitrix_contact_url = "https://$crm_id.bitrix24.ru/rest/2/$webhook/crm.contact.list.json?filter[PHONE]=$phone&select[]=TITLE&select[]=NAME&select[]=LAST_NAME";
$btc = curl_init();
curl_setopt ($btc, CURLOPT_URL,$bitrix_contact_url);
curl_setopt ($btc, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($btc, CURLOPT_TIMEOUT, 60);
curl_setopt ($btc, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($btc, CURLOPT_RETURNTRANSFER, 1);
$bitrix_contact = curl_exec ($btc);
curl_close($btc);
$bitrix_contact_o = json_decode($bitrix_contact, true);
$c_total = $bitrix_contact_o ['total'];
#если найден лид, то: формируем массив и кидаем в сторону Telegram: имя, фамилия и идентификатор лида;
if ($l_total >= 1) {
$l_name = $bitrix_lead_o['result'][0]['NAME'];
$l_title = $bitrix_lead_o['result'][0]['TITLE'];
$l_l_name = $bitrix_lead_o['result'][0]['LAST_NAME'];
$l_id = $bitrix_lead_o['result'][0]['ID'];
$l_titleFieldset = "Входящий звонок от лида - ";
$l_FnameFieldset = "Его имя - ";
$l_linkFieldset = "Ссылка на лид - ";
$l_fullname = "$l_name $l_l_name";
$l_link = "https://$crm_id.bitrix24.ru/crm/lead/show/$l_id/";
$arr = array(
$l_titleFieldset => $l_title,
$l_FnameFieldset => $l_fullname,
$l_linkFieldset => $l_link,
);
foreach($arr as $key => $value) {
$txt .= "".$key." ".$value."%0A";
};
fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");
}
#если найден контакт, то: формируем массив и кидаем в сторону Telegram: имя, фамилия и идентификатор контакта;
elseif ($c_total >= 1) {
$c_name = $bitrix_contact_o ['result'][0]['NAME'];
$c_c_name = $bitrix_contact_o ['result'][0]['LAST_NAME'];
$c_id = $bitrix_contact_o ['result'][0]['ID'];
$c_FnameFieldset = "Входящий звонок от контакта - ";
$c_linkFieldset = "Ссылка на контакт - ";
$c_fullname = "$c_name $c_c_name";
$c_link = "https://$crm_id.bitrix24.ru/crm/contact/show/$c_id/";
$arr = array(
$c_FnameFieldset => $c_fullname,
$c_linkFieldset => $c_link,
);
foreach($arr as $key => $value) {
$txt .= "".$key." ".$value."%0A";
};
fopen("https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&parse_mode=html&text={$txt}","r");
}
else {};
Скачать скрипт
По факту, от вас требуется изменить следующие переменные:
$token - токен вашего бота. Как его получить указано в стате по ссылке «Создание телеграм бота» выше;
$chat_id - идентификатор чата, в котором находится бот. Генерация так же указана в статье;
$crm_id - хостовая часть вашего Битрикс24. Если у вас URL CRM company.bitrix24.ru, то указать нужно company;
$webhook - вебхук. Мы показывали ранее, как его получить в Битрикс24 (у нас wblhahgytuwrnwer);
Сохраняем скрипт как b24.php закидываем его в директорию /var/lib/asterisk/agi-bin.
Адаптируем скрипт в unix – среде:
dos2unix /var/lib/asterisk/agi-bin/b24.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/b24.php
chmod 775 /var/lib/asterisk/agi-bin/b24.php
В диалплане (вставьте исполнение скрипта в транке, например):
exten => _.,n,AGI(b24.php)
Добавив в скрипт конструкцию вида $agi->set_variable("lookupcid", "$c_fullname"); для контакта или $agi->set_variable("lookupcid", "$l_fullname"); для лида, в диалплане мы сможем сделать следующее: Set(CALLERID(name)=${lookupcid}) мы получим имя звонящего в виде CallerID Name – например, на дисплее телефона.
Можете создать тестового лида (или контакт) со своим номером телефона или дождаться звонка клиента. Наслаждаемся :)
Сегодня хотим рассказать про любопытный сценарий, которой наверняка может быть полезен в сфере E-commerce. Речь пойдет про автоматизацию клиентского обслуживания, а именно:
/p>
Клиент звонит в интернет – магазин и ему предлагают ввести номер заказа;
Введенные абонентом значения по DTMF передаются в AGI скрипт;
По номеру заказа, мы формируем SQL – запрос к базе данных, где храним информацию о заказах. Из соответствующей таблицы мы получаем статус заказа и имя клиента;
Мы формируем строку, которую необходимо озвучить клиенту и отправляем ее на аудио-генерацию в сторону API Yandex.SpeechKit (TTS технология – text to speech);
Получаем аудио файл от Yandex, декодируем его в нужный нам формат (.wav, 8k) и воспроизводим клиенту;
Удаляем воспроизведенный файл и завершаем звонок клиента;
На наш взгляд это любопытная автоматизация. Приступаем к настройке? :)
Получение API - токена Yandex.SpeechKit
Для знакомства с технологией Яндекс предоставляет бесплатный тестовый период в 1 месяц с момента отправки первого запроса. После этого, чтобы продолжить использование Yandex. SpeechKit Cloud нужно заключить договор. Подробности условия использования можно прочитать здесь.
Первым делом перейдите в кабинет разработчика по ссылке https://developer.tech.yandex.ru и нажмите Получить ключ:
Имя ключа - введите имя для ключа. Например, Asterisk + TTS;
Подключение - выберите из списка SpeechKit Cloud;
Запоминаем значение, которое выделено красным на скриншоте выше – это и есть ваш токен. Переходим к настройке AGI – скрипта.
Создаем таблицу с заказами
Создадим SQL – таблицу, в которой будем хранить данные о заказах. В лабораторных целях, мы развернем ее на том же хосте, что и IP – АТС Asterisk (+ это снизит задержку и процессинг по времени). Итак, вводим следующие команды в консоли сервера (предварительно подключитесь по SSH):
use asteriskcdrdb;
CREATE TABLE zakazy(name varchar(20),phone varchar(20),nomerzakaza varchar(20),status varchar(20));
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Александр", "79257777777", 300388, "Отправлен");
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Иван", "79251111111", 476656, "Оплачен");
INSERT INTO zakazy (name, phone, nomerzakaza, status) VALUES ("Сергей", "79252222222", 0089822, "Доставлен");
Мы создали и наполнили таблицу. Теперь необходимо создать пользователя, который сможет иметь SELECT – доступ к таблице:
CREATE USER 'логин_mysql'@'localhost' IDENTIFIED BY 'пароль_mysql';
GRANT SELECT ON asteriskcdrdb.zakazy TO 'логин_mysql';
Запомните ваш логин и пароль и переходите к следующему шагу – адаптации скрипта AGI. Традиционно, комментарии к коду после двойного слеша //:
AGI - скрипт
Ниже представлена структура скрипта:
#!/usr/bin/php -q
<?php
error_reporting(0);
require('phpagi.php');
$agi = new AGI();
$result = $agi->get_data('custom/generate', 6000, 10); //принимаем DTMF от клиента;
$number= $result['result']; //записываем в переменную введенный клиентом номер заказа;
$hostname = "localhost"; // у нас localhost. У вас может быть IP адрес сервера, на котором хранится БД с заказами (настройте предварительно pg_hba.conf на удаленном хосте);
$username = "логин_mysql"; // логин, который вы создали этапом ранее;
$password = "пароль_mysql"; // пароль, который вы создали этапом ранее;
$dbName = "asteriskcdrdb";
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение ");
mysql_select_db($dbName) or die(mysql_error());
$query = "SELECT * FROM zakazy WHERE `nomerzakaza`='$number';"; // подключаемся и парсим данные по номеру заказа;
$res=mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($res)) {
$status = $row['status'];
$name = $row['name']; // имя и статус, полученные из SQL пишем в переменные;
};
$str = 'Дорогой '.$name.'! Статус вашего заказа '.$status.' Спасибо за обращение, всего доброго!'; // формируем строку, которую необходимо синтезировать;
$qs = http_build_query(array("format" => "wav","lang" => "ru-RU","speaker" => "jane","key" => "ваш_токен","emotion" => "good", "text" => $str)); //описываем переменные, которые будем отправлять в сторону API Яндекса. Вы можете регулировать формат файла, локаль, спикера (мужской или женский голоса) и эмоциональный окрас. Заменить "ваш_токен" на ключ, полученный от API Yandex. SpeechKit Cloud;
$ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer:
")));
$soundfile = file_get_contents("https://tts.voicetech.yandex.net/generate?".$qs, false, $ctx);
$file = fopen("file1.wav", "w");
fwrite($file, $soundfile);
fclose($file); // получаем аудио файл (сохраняем его как file1.wav);
shell_exec('sox -t raw -r 48k -e signed-integer -b 16 -c 1 file1.wav -t wav -r 8k -c 1 /var/lib/asterisk/sounds/ru/custom/output1.wav'); // выполняем преобразование аудио в нужный для Asterisk аудио-формат и копируем его в директорию /var/lib/asterisk/sounds/ru/custom/;
shell_exec('chown asterisk:asterisk /var/lib/asterisk/sounds/ru/custom/output1.wav');
shell_exec('chmod 775 /var/lib/asterisk/sounds/ru/custom/output1.wav'); // даем файлу нужные пермишны;
$agi->exec('Playback',"custom/output1"); // передаем в AGI команду проиграть полученный аудио – файл;
shell_exec('rm -f /var/lib/asterisk/sounds/ru/custom/output1.wav');
shell_exec('rm -f file1.wav'); // удаляем оба файла;
Скачать скрипт AGI
После загрузки файла, сохраните его с расширением .php
Сохраните скрипт под именем tts.php в директории /var/lib/asterisk/agi-bin и дайте следующие команды в консоль сервера:
dos2unix /var/lib/asterisk/agi-bin/tts.php
chown asterisk:asterisk /var/lib/asterisk/agi-bin/tts.php
chmod 775 /var/lib/asterisk/agi-bin/tts.php
Адаптируем функционал в «продакшн»
Итак, первым делом, открываем файл /etc/asterisk/extensions_custom.conf для редактирования и добавляем в него следующую запись:
[tts_menu]
exten => s,1,Answer()
exten => s,2,AGI(tts.php)
Очень хорошо. Сделаем вызов кастомного контекста из FreePBX. Для этого воспользуемся модулем Custom Destinations. Переходим по пути Admin → Custom Destinations и нажимаем Add Destination:
Нажимаем Submit и Apply Config. Мы хотим чтобы из главного IVR – меню клиент при нажатии 4 мог бы узнать статус своего заказа. Переходим в главный IVR и в секции IVR Entries добавляем следующее:
Готово. Если что – либо не получилось, напишите нам в комментариях, постараемся помочь :)
Порой, например, при подключении аналогового телефона через FXS шлюз, на котором отсутствует регулировка громкости, необходимо отрегулировать громкость при разговоре. Предположим, что на FXS шлюзе отсутствует регулировка на порту, к которому подключен телефон. Давайте разберемся:
Данная регулировка реализуется на базе VOLUME(TX|RX). Информацию по ней можно посмотреть через консоль Asterisk:
asterisk*CLI> core show function VOLUME
-= Info about function 'VOLUME' =-
[Synopsis]
Set the TX or RX volume of a channel. \ можно настроить громкость для канала
[Description]
The VOLUME function can be used to increase or decrease the 'tx' or 'rx' gain
of any channel.
For example:
Set(VOLUME(TX)=3)
Set(VOLUME(RX)=2)
Set(VOLUME(TX,p)=3)
Set(VOLUME(RX,p)=3)
[Syntax]
VOLUME(direction[,options])
[Arguments]
direction
Must be 'TX' or 'RX'.
options
p: Enable DTMF volume control
[See Also]
Not available
Данная функция имеет 2 параметра:
Направление, т.е TX – отправка, RX – прием.
Дополнительная опция p, которая активирует контроль над звуком по DTMF
На данном этапе мы разобрались с функцией VOLUME. Теперь открываем файл extensions_customs.conf и производим следующие настройки нового контекста:
[root@asterisk ~]# vim /etc/asterisk/extensions_custom.conf
[volume-set]
exten => _X.,1,NoOp(Volume settings)
same => n,Set(VOLUME(TX)=5)
same => n,Set(VOLUME(RX)=5)
same => n,Goto(from-internal,${EXTEN},1)
Теперь открываем необходимый нам Extension, и в поле Context, вносим название созданного нами выше контекста - volume-set.
Теперь можно регулировать громкость в настройках контекста, изменяя значение с 5 на другое, параллельно проверяя громкость в трубке