Приветствую, сообщество!
Кто занимался интеграциями asterisk и amocrm, тот знает, что инициировать звонок из AMO можно только оригинацией. Оригинация — это когда сначала сервер делает вызов на ваш внутренний номер, а когда вы взяли трубку — делается второй вызов на нужный номер клиента. Иногда такое решение в силу разных причин не устраивает клиентов или меня.
Попытки уговорить техподдержку AMO воткнуть возможность размещения ссылок вида «sip:» или «tel:» вместо вызова скрипта amocrm.php с оригинацией потерпели неудачу. Тогда и родился этот «костыль». Возможно, он будет полезен кому то.
Итак, находимся в карточке клиента, нажимаем на номер, в выпадающем списке выбираем «AsteriskNow». Браузер производит вызов скрипта amocrm.php на вашем сервере с action=call.
Открываем и правим:
Мы закомментировали происходящее по «умолчанию» (оригинация) и добавили свой код, начиная с //custom, который закидывает в таблицу «callout» в asteriskcdrdb данные, кто кому звонит. Теперь, по нажатию на «AsteriskNow» у нас в таблице появляется запись.
Далее рядом с amorcm.php кладем свой файлик gn.php, который будет возвращать по запросу номер, на который нужно позвонить:
Теперь, если мы запросим этот файл с параметром iid=внутренний_номер (например, 100) то ответ скрипт вернет первый номер, забитый в базу через меню в АМО, и подчистит все остальное.
Последний этап — опрос этого скрипта и передача в софтофон номера, который нужно набрать. Для этого хорошо подойдет autoIT:
Этот текст кладем в script.txt рядом с AutoIT.exe и делаем ярлык последнего, в котором прописываем «script.txt» как первый параметр. Далее ярлык можно закинуть в автозагрузку.
Рекомендую еще озаботится вопросом безопасности — прикрутить токен, либо проверку на ip, либо закрыть файл паролем через htaccess/htpasswd и подставлять его в url при вызове из autoIt.
Проверяем — автоматически запускается настроенный на обработку ссылок «sip:» софтофон и начинает звонить на указанный номер. В моем случае это был PhonerLite.
Спасибо за внимание!
Кто занимался интеграциями asterisk и amocrm, тот знает, что инициировать звонок из AMO можно только оригинацией. Оригинация — это когда сначала сервер делает вызов на ваш внутренний номер, а когда вы взяли трубку — делается второй вызов на нужный номер клиента. Иногда такое решение в силу разных причин не устраивает клиентов или меня.
Попытки уговорить техподдержку AMO воткнуть возможность размещения ссылок вида «sip:» или «tel:» вместо вызова скрипта amocrm.php с оригинацией потерпели неудачу. Тогда и родился этот «костыль». Возможно, он будет полезен кому то.
Итак, находимся в карточке клиента, нажимаем на номер, в выпадающем списке выбираем «AsteriskNow». Браузер производит вызов скрипта amocrm.php на вашем сервере с action=call.
Открываем и правим:
}elseif ($action==='call'){ // originate a call
/*$params=array(
'action'=>'Originate',
'channel'=>'SIP/'.intval($_GET['from']),
'Exten'=>strval($_GET['to']),
'Context'=>'from-internal',
'priority'=>'2',
'Callerid'=>'"'.strval($_GET['as']).'" <'.intval($_GET['from']).'>',
'Async'=>'Yes',
// Not Implemented:
//'Callernumber'=>'150',
//'CallerIDName'=>'155',
);
$resp=asterisk_req($params,true);
if ($resp[0]['response']!=='Success') answer(array('status'=>'error','data'=>$resp[0]));
answer(array('status'=>'ok','action'=>$action,'data'=>$resp[0]));
*/
//custom
/*CREATE TABLE IF NOT EXISTS `callout` (
`from` varchar(4) NOT NULL,
`to` varchar(12) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;*/
//mysql
mysql_connect("localhost","asteriskuser","asteriskuserpssword") or die("no connect to MySQL.");
mysql_select_db("asteriskcdrdb") or die("ERROR: ".mysql_error());
mysql_query('INSERT INTO `callout` (`from`,`to`) VALUES ("'.$_GET['from'].'","'.$_GET['to'].'")') or die("ERROR: ".mysql_error());
answer(array('status'=>'ok','action'=>$action,'data'=>''));
//end custom
Мы закомментировали происходящее по «умолчанию» (оригинация) и добавили свой код, начиная с //custom, который закидывает в таблицу «callout» в asteriskcdrdb данные, кто кому звонит. Теперь, по нажатию на «AsteriskNow» у нас в таблице появляется запись.
Далее рядом с amorcm.php кладем свой файлик gn.php, который будет возвращать по запросу номер, на который нужно позвонить:
<?php
//mysql
if(!isset($_GET['iid']) || empty($_GET['iid'])) die('NO PARAMS');
mysql_connect("localhost","asteriskuser","asteriskuserpassword") or die("no connect to MySQL.");
mysql_select_db("asteriskcdrdb") or die("ERROR: ".mysql_error());
$data = mysql_fetch_array(mysql_query('SELECT * FROM `callout` WHERE `from` = "'.$_GET['iid'].'" LIMIT 1'), MYSQL_ASSOC);
mysql_query('DELETE FROM `callout` WHERE `from` = "'.$_GET['iid'].'"') or die("ERROR: ".mysql_error());
print $data['to'];
?>
Теперь, если мы запросим этот файл с параметром iid=внутренний_номер (например, 100) то ответ скрипт вернет первый номер, забитый в базу через меню в АМО, и подчистит все остальное.
Последний этап — опрос этого скрипта и передача в софтофон номера, который нужно набрать. Для этого хорошо подойдет autoIT:
$phone = 100
$oHTTPError = ObjEvent("AutoIt.Error","oHTTPErrFunc")
Local $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://ip-or-url-of-your-asterisk-server/gn.php?iid="&$phone, False)
While 1
$oHTTP.Send()
If $oHTTP.Status == 200 And $oHTTP.ResponseText() <> "" Then
ShellExecute("sip:"&$oHTTP.ResponseText())
EndIf
Sleep(1000)
WEnd
Func oHTTPErrFunc()
$_eventerror = 1
Endfunc
Этот текст кладем в script.txt рядом с AutoIT.exe и делаем ярлык последнего, в котором прописываем «script.txt» как первый параметр. Далее ярлык можно закинуть в автозагрузку.
Рекомендую еще озаботится вопросом безопасности — прикрутить токен, либо проверку на ip, либо закрыть файл паролем через htaccess/htpasswd и подставлять его в url при вызове из autoIt.
Проверяем — автоматически запускается настроенный на обработку ссылок «sip:» софтофон и начинает звонить на указанный номер. В моем случае это был PhonerLite.
Спасибо за внимание!
Комментарии (5)
Shultz
26.05.2018 13:12Посмотрите интеграцию от SIPNET. Там нет ни одной строчки на PHP в самом плагине. При этом реализована полноценная звонилка на JS с переадресацией и прочим. К тому же развернулись они по полной, привязав это все к своей АТС. Там и автоматическое создание контактов, сделок и тп, интеграция с информацией о звонках, входящих и исходящих+ записи звонков, доступ к которым прямо из amoCRM. Там полный набор любых необходимых фишек.
whoim Автор
26.05.2018 13:29Все это есть и у меня, только настраиваемое в любых направлениях, кроме софтофона в браузере — за это ещё никто не платит )
Shultz
А почему бы сразу не сделать вызов через WebRTC? Что гораздо быстрее и удобнее? Пример реализации — недавно появившаяся интеграция от SIPNET. Отличное решение. Осуществляет исходящие и принимает входящие звонки, со всеми плюшками интеграции с amoCRM.
whoim Автор
А амо позволяет внедрить на своей стороне java-софтофон? Если расскажете и покажете, буду благодарен.
Сипнет не даст того простора, что даёт php при работе с api амо. А хотелки у всех заказчиков разные, от тегов и названий сущностей до их связей и прочего.