Обратный звонок

Помогаю сайтам продавать!
Разработка продающего сайта. Тюнинг текущего
Способы связи со мной:

Интеграция Asterisk (FreePBX) и Битрикс24


Инструкция собрана по крупицам со всего интернета. Т.к. те что имелись были либо неполные, либо неработоспособные. 

Автором модуля интеграции FreePBX и Битрикс 24 является Евгений Романенко https://habr.com/ru/users/FessAectan/

Модуль интеграции callme на GitHub https://github.com/ViStepRU/callme

Логика работы SIP-коннектора для Битрикс24

SIP коннектор для Битрикс24 и Asterisk, работает по средствам вебхук. Используются входящие и исходящие вебхуки.

По Входящему вебхуку по средствам REST Битрикс получает от Asterisk'a данные о входящих звонках. Затем всплывает карточка Входящего звонка в Битриксе.

По Исходящему вебхуку, Битрикс обращается к SIP-коннектору и происходит сначала звонок на внутренний номер сотрудника, затем набирается номер клиента.


Исходные данные

Скачана и установлена сборка FreePBX Distro (SNG7-PBX-64bit-1904), дата релиза май 2019г. 

В нее входит: FreePBX 14.0.11, CentOS 7.6, Asterisk 13/16, PHP 5.6.40, Python 2.7

В качестве примера: локальный IP АТС 192.168.0.87, + внешний домена pbx.a-ctroy.ru и внешний адрес 37.113.134.80

Телефонный номер 79320111675, он же транк для звонков.

Для удобства работы я использую SHH доступ: к консоли SecureCRT, к файлам WinSCP + редактор NotePad++.

Установка модулей

Первое что сделать, это рекомендую обновить все текущие модули:

yum update

Установим кодировщик WAV-MP3 lame

yum install lame

Устанавливаем PyPi (репозитарий Python’a)

yum install python-pip

Обновляем PyPi

pip install --upgrade pip

Устанавливаем последний (4.0.3) Supervisor из PyPi

pip install supervisor

Установим git

yum install git

Перейдем в папку где будет размещен модуль и скачаем его с GITa

cd /var/www/html
git clone https://github.com/ViStepRU/callme.git

Если проект на гитхабе будет прекращен, либо изменен, прилагаю ссылку с модулем https://smirnov-alexey.ru/callme.zip

wget https://smirnov-alexey.ru/callme.zip -O callme.zip

unzip callme.zip

Теперь наш модуль будет лежать по пути /var/www/html/callme

Если вы успешно его развернули, открываем в браузере http://192.168.0.87/callme и получаем ответ «silence is golden».

Настройка доступа извне к АТС

Далее необходимо сделать возможный доступ из интернета к нашему веб-серверу. Для этого необходимо разрешить порты 80, 5038 (если вы устанавливаете модуль на хостинг за пределами локальной сети), 443 (SSL доступ). Так же настроить NAT(проброс) для этих портов.
У каждого роутера свои настройки, в моем случае имею MikroTik RB2011UiAS.

Открываем IP => Firewall => Address List. Создадим список IP, который имеют внешний доступ к нашим портам.
Добавим в него IP адреса Битрикса:
/ip firewall address-list
add address=bitrix24.ru list=tel
add address=bitrix24.net list=tel
add address=bitrix24.com list=tel

И главное наш/ваш Битрикс24:

add address=a-ctroy.bitrix24.ru list=tel

В версии от 6.26. В качестве IP можно указывать доменное имя.

Открываем IP => Firewall => Filter Rules. Создаем правила доступа и запрета к портам 80,5038,443.

Разрешаем доступ к 80 порту. Создаем правило:
Вкладка General.
Chain: forward
Protocol: 6(TCP)
Dst. Port: 80
In. Interface: <Здесь указываем WAN интерфейс>, (в моем случае ether1-gateway)
Вкладка Advanced. 
Src. Adress List: <Указываем ранее созданный лист>, (в моем случае tel).
Вкладка Action.
Action: accept

Подымаем правило в самый вверх списка, чтобы был максимальный приоритет.

Создаем новое правило запрета к 80 порту.
Вкладка General.
Chain: forward
Protocol: 6(TCP)
Dst. Port: 80
In. Interface: <Здесь указываем WAN интерфейс>, (в моем случае ether1-gateway)
Вкладка Action.
Action: drop
Размещаем правило запрета под разрешающим.

Логика такая, разрешаем доступ тем кто из списка. Затем кто не в списке, всех дропаем.

Аналогично (самостоятельно) сделаем для 443 и 5038 порта.

Создаем правила проброса портов 80, 5038, 443.

Открываем IP => Firewall => NAT.
Вкладка General.
Chain: dsnat
Protocol: 6(TCP)
Dst. Port: 80
In. Interface: <Здесь указываем WAN интерфейс>, (в моем случае ether1-gateway)
Вкладка Action.
Action: dst-nat
To Address: 192.168.0.87 (IP нашей АТС)
To Port: 80

Аналогично (самостоятельно) сделаем для 443 и 5038 порта.

Все, мы настроили доступ к веб-интерфейсу АТС из вне, для ограниченного круга лиц.

Доступ к к веб-морде по доменному имени через SSL (Пункт не обязательный)

Дадим доменное имя нашей АТС, для этого открываем веб-морду FreePBX, далее Admin => System Admin => Hostname. Назовем pbx.a-ctroy.ru


Нажмем Update Hostname.

Теперь необходимо настроить DNS сервер, который подружит домен pbx.a-ctroy.ru и наш внешний IP 37.113.134.80. Сам домен a-ctroy.ru, расположен на хостинге SWEB.RU, там и буду настраивать DNS. Пройду в пункт DNS, далее Записи поддоменов, выберу домен a-ctroy.ru. В самом низу создам A запись.
 


Сразу после этого по pbx.a-ctroy.ru, должен открываться веб-морда. Если не открывается, вашего IP нет в списке доступа, либо вы открываете из локальной сети, в которой сейчас находиться IP АТС (читайте для общего развития «ip loopback mikrotk»).

Далее получаем SSL, открываем веб-морду FreePBX, далее Admin => Certificate Management => New Certificate => Generate Let’s Encrypt Certificate.
В появившемся окне заполняем поля Емаил, Страна и Регион. Жмем Генерировать сертификат. Перед этим действием рекомендую внести IP адреса серверов Let’s Encrypt в список разрешенных, на MiroTike (IP => Firewall => Address List. ) Я добавлю через консоль. Добавление доменов возможна на прошивках выше 6.36.
/ip firewall address-list
add address=outbound1.letsencrypt.org list=tel
add address=outbound2.letsencrypt.org list=tel
add address=mirror1.freepbx.org list=tel
add address=mirror2.freepbx.org list=tel

Вернемся в Certificate Management, удалим сертификат default (type Self Signet – само подписной), видим новый сертификат от Let’s Encrypt. В поле Default ставим напротив него галочку.
Затем перейдем Admin => System Admin => HTTPS Setup => Settings
В поле Certificate Manager берем наш сертификат и жмем Install.
На этом пункте мы указали сертификат для веб-сервера Apache и закончили установку SSL доступа.

Создадим AMI-пользователя в FreePBX

Откроем файл /etc/asterisk/manager.conf
Добавим секцию
[callme] ; Имя AMI-пользователя
secret = 123456789 ; Пароль для подключения, ставим посложней
deny = 0.0.0.0/0.0.0.0 ; Запрещаем подключение с любого адреса
permit = 127.0.0.1/255.255.255.0 ; И постепенно разрешаем нужные
permit = 192.168.0.87/255.255.255.0 ; Так разрешаем конкретный хост
permit = 192.168.0.0/255.255.255.0 ; А вот так можно разрешить подсеть
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

Настроем вебхуки в Битрикс24

Перейдем в пункт Приложения => Вебхуки.

Добавим вебхук Входящий.
Обзываем его, например CallMeIn, даем права:
  • CRM (crm)
  •  Телефония (telephony)
  •  Телефония (совершение звонков) (call)
  •  Диск (disk)
  •  Структура компании (department)
  •  Чат и уведомления (im)
  •  Создание и управление Чат-ботами (imbot)
  •  Задачи (task)
  •  Задачи (расширенные права) (tasks_extended)
  •  Пользователи (user)
  •  Мгновенные сообщения системы (без доступа к служебному каналу пользователя) (pull)
  •  Служебный канал для мгновенных сообщений системы (подписка на информацию об обновлении всех элементов системы доступных пользователю) (pull_channel)
  •  Списки (lists)
После сохранения получаем REST url https://ваше-имя.bitrix24.ru/rest/1/1s777vji3m123dhv/profile/
, для себя сохраняем в блокноте https://ваше-имя.bitrix24.ru/rest/1/1s777vji3m123dhv/

Добавим вебхук Исходящий.

Адрес обработчика: https://pbx.a-ctroy.ru/callme/CallMeOut.php (в вашем случае может быть просто http://ип-внешний/callme/CallMeOut.php)
Название: CallMeOut
Тип события: Инициация звонка через приложение (ONEXTERNALCALLSTART)

Сохраняем и получаем код авторизации: dtng3732h7777777777vmk524a4lvhj7


Настраиваем модуль интеграции Asterisk - Битрикс24

Открываем /var/www/html/callme/config.php


Пояснения:
tech – технология по которой работает теелфония (SIP, IAX, DAHDI, PJSIP и т.д.)
authToken — токен авторизации битрикс24, код авторизации исходящего вебхука
bitrixApiUrl — URL входящего вебхука, без profile/ (Вконце URL обязательно должен быть символ «/»)
extentions — список городских номеров подключенных к АТС. Номер должен быть указан строго в том формате, в котором он прописан в параметрах транка (ВАЖНО! Номера указываются в формате '123456789','1234567890' - по бокам номера одиночные кавычки.
context – контекст для осуществления исходящих вызовов (по умолчания это from-internal)

Вносим правки в /var/www/html/callme/CallMeIn.php
94, строчка. Меняем /^http.+$/ , на /mp3/
Получится: 
if(preg_match('/mp3/',$event->getValue())) $globalsObj->FullFnameUrls[$callUniqueid] = $event->getValue();

Для логирования работы модуля создадим папку и дадим права.
mkdir /var/www/html/callme/logs
mkdir /var/www/html/callme/records 
mkdir /var/www/html/callme/monitor/ 
mkdir /var/www/html/callme/records/wav 
mkdir /var/www/html/callme/records/mp3 
touch /var/www/html/callme/logs/CallMe.log
chown asterisk:asterisk /var/www/html/callme -R
chmod +x /var/www/html/callme/CallMeIn.php
chmod +x /var/www/html/callme/CallMeOut.php

Создадим маршруты звонков. Редактируем /etc/asterisk/extensions_override_freepbx.conf
globals {
    WAV=/var/www/html/callme/records/wav; //Временный каталог с WAV
    MP3=/var/www/html/callme/records/mp3; //Куда выгружать mp3 файлы
    URLRECORDS=https://pbx.a-ctroy.ru/records/mp3;
    RECORDING=0; // Запись, 1 - включена.
};
[macro-hangupcall]
 include => macro-hangupcall-custom
 exten => s,1,Set(CDR(userfield)=${CHANNEL(hangupsource)})
 exten => s,n,Set(FullFname=https://pbx.a-ctroy.ru/callme/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.mp3)
 exten => s,n,Set(CallStart=${UNIQUEID})
 exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
 exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
 exten => s,n,ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===))
 exten => s,n,System(/usr/bin/lame -h -b 192 /var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT} /var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.mp3)
 exten => s,n,System(/bin/rm -rf /var/spool/asterisk/monitor/${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT})
 exten => s,n,Set(CDR(recordingfile)=${CALLFILENAME}.mp3)
 exten => s,n,Hangup
 exten => s,n,MacroExit()
 
macro recording(calling,called) {
        if ("${RECORDING}" = "1"){
              Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
      Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
      System(mkdir -p ${MP3}/${datedir});
      System(mkdir -p ${WAV}/${datedir});
              Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${datedir}/${fname}.wav"  "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
      Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
              Set(CDR(filename)=${fname}.mp3);
      Set(CDR(recordingfile)=${fname}.wav);
              Set(CDR(realdst)=${called});
              MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});
       };
};

context incoming {
793230111000=> { //наш номер транка
&recording(${CALLERID(number)},${EXTEN});
        Answer();
        ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // выставляем CallerID если узнали его у Битрикс24
        Set(CallStart=${STRFTIME(epoch,,%s)});  
        Queue(Q1,tT);
        Set(CallMeDISPOSITION=${CDR(disposition)}); 
        Hangup();
        }
h => {
    Set(CDR_PROP(disable)=true); 
    Set(CallStop=${STRFTIME(epoch,,%s)}); 
    Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)}); 
    ExecIF(${ISNULL(${CallMeDISPOSITION})}?Set(CallMeDISPOSITION=${CDR(disposition)}):NoOP(=== CallMeDISPOSITION already was set ===));  
    System(curl -s https://pbx.a-ctroy.ru/callme/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});  
}
}
context default {
_X. => {
        Hangup();
        }
};
context dial_out {
_. => {
&recording(${CALLERID(number)},${EXTEN});
        Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Dial(SIP/${EXTEN}@toOurAster,,t);
Hangup();
        }
h => {
        Set(CDR_PROP(disable)=true);
        Set(CallStop=${STRFTIME(epoch,,%s)});
        Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)});
if(${ISNULL(${CallMeDISPOSITION})}) {
          Set(CallMeDISPOSITION=${CDR(disposition)});
        }
System(curl -s https://pbx.a-ctroy.ru/callme/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}
};

Сконфигурируем Supervisor

Для того чтобы наш модуль всегда отслеживал входящие звонки и взаимодействовал с Битрикс24.
Создадим папку supervisord и в ней файл /etc/supervisord/supervisord.conf:
[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
chmod=0777                 ; socket file mode (default 0700)
[inet_http_server]         ; inet (TCP) server disabled by default
port=*:9001        ; ip_address:port specifier, *:port for all iface
chmod=0777
chown=root:supervisor
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=debug                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=true               ; start in foreground if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
chmod=0777
chown=root:supervisor
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
chmod=0777
chown=root:supervisor
[program:callme]
command=/usr/bin/php CallMeIn.php
directory=/var/www/html/callme
autostart=true
autorestart=true
startretries=5
stderr_logfile=/var/www/html/callme/logs/daemon.log
stdout_logfile=/var/www/html/callme/logs/daemon.log

Создадим сервис-файл, который позволит Supervisor запускаться сразу в фоне при старте ПК /etc/systemd/system/supervisord.service:
[Unit]
Description=Supervisor daemon
Documentation=http://supervisord.org
After=network.target
[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisord/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
Alias=supervisord.service

Запустим сервис systemctl start supervisord.service
И проверим 2 способами:
Выполнив команду
ps aux | grep super


И проверив работу веб-консоли http://192.168.0.87:9001/



Нюансы

1) При клике на телефон клиента в Битрикс24, АТС сначала позвонит на ваш внутренний номер, затем наберет номер клиента.
Открываем https://ВашеИмя.bitrix24.ru/company/ или Сотрудники => Сотрудники
Далее у каждого сотрудника должен быть указан внутренний номер телефона, который соответствует внутреннему номеру на АТС.


2) Необходимо чтобы на АТС было прописано правило исходящего звонка, на номер который будет собираться звонить Битрикс24.
3) При входящем звонке, чтобы создавался новый лид либо всплывала карточка, необходимо: чтобы сотрудник был онлайн и его внутренний номер был зарегистрирован на АТС.

Обновление (для меня)

Для безопасности, вынес модуль на отдельный поддомен и сменил порт на 81. Итого callme.a-ctroy.ru:81
Для этого скопировал папку callme
из /var/www/html/callme
в /var/www/callme

Дал права на папку астериску:
chown asterisk:asterisk /var/www/html/callme -R

Создал конфигурационый файл виртуального хоста:
/etc/httpd/conf.d/callme.a-ctroy.ru.conf
<VirtualHost *:81>
    ServerName callme.a-ctroy.ru
    ServerAlias callme.a-ctroy.ru
    DocumentRoot /var/www/callme
    ErrorLog /var/www/callme/error.log
    CustomLog /var/www/callme/requests.log combined
</VirtualHost>
Перезапустим наш httpd:
systemctl restart httpd.service
На Микротик закрыл все прежние порты, создал 81 порт.
На хостинге добавил А запись к домену  callme.a-ctroy.ru
 25.06.2019
 (14557 просмотров)

Комментарии