Integrazione di Asterisk è Bitrix24

Integrazione di Asterisk è Bitrix24
Ci sò diverse opzioni per integrà IP-PBX Asterisk è CRM Bitrix24 in a reta, ma avemu sempre decisu di scrive u nostru.

In termini di funziunalità, tuttu hè standard:

  • Cliccà nantu à un ligame cù u numeru di telefunu di u cliente in Bitrix24, Asterisk cunnetta u numeru internu di l'utilizatore per quale u clicu hè statu fattu cù u numeru di telefunu di u cliente. In Bitrix24, un registru di a chjama hè registratu è, à a fine di a chjama, un registru di a conversazione hè tiratu.
  • Asterisk riceve una chjama da l'esternu - in l'interfaccia Bitrix24 mostramu a carta di u cliente à l'impiigatu à u so numeru hè ghjuntu sta chjama.
    Se ùn ci hè micca un tali cliente, apremu a carta per creà un novu lead.
    Appena a chjama hè finita, riflettemu questu nantu à a carta è tirà una registrazione di a conversazione.

Sottu u cut vi dicu cumu fà tuttu per voi stessu è vi darà un ligame à github - iè, sì, pigliate è aduprate!

Descrizzione generale

Avemu chjamatu a nostra integrazione CallMe. CallMe hè una piccula applicazione web scritta in PHP.

Tecnulugie è servizii utilizati

  • PHP 5.6
  • Biblioteca PHP AMI
  • cumpusituri
  • Nginx + php-fpm
  • supervisore
  • AMI (Asterisk Manager Interface)
  • Webhook Bitrix (implementazione API REST simplificata)

Préréglage

In un servitore cù Asterisk, avete bisognu di installà un servitore web (per noi hè nginx + php-fpm), supervisore è git.

Cumanda d'installazione (CentOS):

yum install nginx php-fpm supervisor git

Andemu à u cartulare accessibile à u servitore web, tirà l'applicazione da Git è stabilisce i diritti necessarii à u cartulare:


cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/

Dopu, cunfiguremu nginx, a nostra cunfigurazione si trova in

/etc/nginx/conf.d/pbx.vistep.ru.conf

server {
	server_name www.pbx.vistep.ru pbx.vistep.ru;
	listen *:80;
	rewrite ^  https://pbx.vistep.ru$request_uri? permanent;
}

server {
#        listen *:80;
#	server_name pbx.vistep.ru;


	access_log /var/log/nginx/pbx.vistep.ru.access.log main;
        error_log /var/log/nginx/pbx.vistep.ru.error.log;

    listen 443 ssl http2;
    server_name pbx.vistep.ru;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/pbx.vistep.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ru/privkey.pem;
    ssl_dhparam /etc/nginx/certs/dhparam.pem;
    ssl_session_timeout 24h;
    ssl_session_cache shared:SSL:2m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000;";
    add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report";
	
	root /var/www/callme;
	index  index.php;
        location ~ /. {
                deny all; # запрет для скрытых файлов
        }

        location ~* /(?:uploads|files)/.*.php$ {
                deny all; # запрет для загруженных скриптов
        }

        location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
                expires max; # кеширование статики
        }

	location ~ .php {
		root /var/www/callme;
		index  index.php;
		fastcgi_pass unix:/run/php/php5.6-fpm.sock;
	#	fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
		include /etc/nginx/fastcgi_params;
		}
}

Lasciaraghju analizà a cunfigurazione, i prublemi di sicurità, ottene un certificatu è ancu sceglie un servitore web fora di u scopu di l'articulu - assai hè statu scrittu annantu à questu. L'applicazione ùn hà micca restrizioni, funziona nantu à http è https.

Usemu https, criptemu u certificatu.

Sè avete fattu tuttu bè, dopu clicchendu nantu à u ligame duvete vede qualcosa cusì

Integrazione di Asterisk è Bitrix24

Configurazione di Bitrix24

Creemu dui webhooks.

Webhook entrante.

Sottu u contu amministratore (cù id 1), seguitate u percorsu: Applicazioni -> Webhooks -> Add webhook -> Webhook entrante

Integrazione di Asterisk è Bitrix24

Inserite i paràmetri di u webhook entrante cum'è in i screenshots:

Integrazione di Asterisk è Bitrix24

Integrazione di Asterisk è Bitrix24

È cliccate salvà.

Dopu avè salvatu, Bitrix24 furnisce l'URL di u webhook entrante, per esempiu:

Integrazione di Asterisk è Bitrix24

Salvà a vostra versione di l'URL senza u /profile/ finali - serà utilizatu in l'applicazione per travaglià cù e chjama in entrata.

Aghju questu https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook in uscita.

Applicazioni -> Webhooks -> Aggiungi webhook -> Webhook in uscita

I dettagli sò di novu nantu à i screenshots:

Integrazione di Asterisk è Bitrix24

Integrazione di Asterisk è Bitrix24

Salvà è riceve u codice d'autorizazione

Integrazione di Asterisk è Bitrix24

Aghju questu xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Avete ancu bisognu di cupià per sè stessu; avete bisognu per fà e chjama in uscita.

Impurtante!

Un certificatu SSL deve esse cunfiguratu in u servitore Bitrix24 (pudete aduprà letsencrypt), altrimenti l'api Bitrix ùn funziona micca. Sì avete una versione in nuvola, ùn vi preoccupate - hà digià ssl.

Impurtante!

U campu "Indirizzu di u Processore" deve cuntene un indirizzu accessibile da Internet!

È cum'è un toccu finale, stallà u nostru CallMeOut cum'è una applicazione per fà chjamate (per chì quandu clicate nantu à u numeru nantu à u PBX, u cumandamentu per l'urighjini di a chjama vola via).

In u menù, selezziunate: More -> Telefonia -> More -> Settings, stabilisce in "Numeru di chiamata in uscita predeterminatu" Applicazione: CallMeOut è cliccate "Salvà".

Integrazione di Asterisk è Bitrix24

Mise en place de l'astérisque

Per una interazzione successu trà Asterisk è Bitrix24, avemu bisognu di aghjunghje l'utente AMI callme à manager.conf:

[callme]
secret = JD3clEB8_f23r-3ry84gJ
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
permit= 10.100.111.249/255.255.255.255
permit = 192.168.254.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

Dopu, ci sò parechji trucchi chì anu da esse implementati via dialplan (per noi questu hè extensions.ael).

Puderaghju tuttu u schedariu, è dopu daraghju una spiegazione:

globals {
    WAV=/var/www/pbx.vistep.ru/callme/records/wav; //Временный каталог с WAV
    MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //Куда выгружать mp3 файлы
    URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
    RECORDING=1; // Запись, 1 - включена.
};

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 {
888999 => {
	&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 ===));  
}

}


context default {

_X. => {
        Hangup();
        }
};


context dial_out {

_[1237]XX => {
	&recording(${CALLERID(number)},${EXTEN});
        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});
        Dial(SIP/${EXTEN},,tTr);
        Hangup();
        }

_11XXX => {
	&recording(${CALLERID(number)},${EXTEN});
	Set(CallStart=${STRFTIME(epoch,,%s)});
	Set(__CallIntNum=${CALLERID(num)});
        Dial(SIP/${EXTEN:2}@toOurAster,,t);
        Hangup();
        }

_. => {
	&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 http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

};

Partemu da u principiu : a direttiva globali.

Variable URLRECORDS almacenà l'URL à i schedarii di arregistramentu di cunversazione, secondu chì Bitrix24 li tirarà in a carta di cuntattu.

Dopu avemu interessatu in a macro macro Gravure.

Quì, in più di arregistrà e conversazioni, avemu da stabilisce a variabile FullFname.

Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);

Guarda l'URL sanu à un schedariu specificu (a macro hè chjamata in ogni locu).

Analizemu a chjama in uscita:

_. => {
	&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 http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

Diciamu chì chjamemu 89991234567, prima di tuttu ghjunghjemu quì:

&recording(${CALLERID(number)},${EXTEN});

quelli. A macro di registrazione di cunversazione hè chjamata è i variàbili necessarii sò stabiliti.

listing

        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});

Registramu quale hà iniziatu a chjama è registra l'ora di iniziu di a chjama.

È dopu a so cumpleta, in un cuntestu speciale h

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 http://pbx.vistep.ru/CallMeOut.php --data action=sendcall2b24 --data call_id=${CallMeCALL_ID} --data-urlencode FullFname=${FullFname} --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition=${CallMeDISPOSITION});
}

disattivà a registrazione in a tavola CDR per questa estensione (ùn hè micca necessariu quì), stabilisce l'ora di fine di a chjama, calculate a durata, se u risultatu di a chjama ùn hè micca cunnisciutu - set (variable) CallMeDISPOSITION) è, l'ultimu passu, mandate tuttu à Bitrix via u curl di u sistema.

È un pocu di più magia - una chjama entrata:

888999 => {
	&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();
        }

Quì ci interessa solu una linea.

ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());

Ella dice à u PBX per installà CallerID (nome) uguale à variabile CallMeCallerIDName.

A variàbbili CallMeCallerIDName stessu, à u turnu, hè stabilitu da l'applicazione CallMe (se Bitrix24 hà un nome cumpletu per u numeru di u chjamante, stabilisce cum'è CallerID (nome), no - ùn faremu nunda).

Configurazione di l'applicazione

File di paràmetri di l'applicazione - /var/www/pbx.vistep.ru/config.php

Descrizzione di i paràmetri di l'applicazione:

  • Chjama MeDEBUG - se 1, allora tutti l'avvenimenti processati da l'applicazione seranu scritti in u schedariu di log, 0 - ùn scrivemu nunda
  • tech, - SIP/PJSIP/IAX/etc
  • authToken - Token d'autorizazione Bitrix24, codice d'autorizazione webhook in uscita
  • bitrixApiUrl - URL di u webhook entrante, senza prufilu /
  • estensioni - lista di numeri esterni
  • u cuntestu - cuntestu per uriginale una chjama
  • listener_timeout - a rapidità di u prucessu di l'eventi da l'asteriscu
  • asterisc - un array cù paràmetri per a cunnessione à l'asteriscu:
  • òspite - ip o hostname di u servitore asterisk
  • schema - schema di cunnessione (tcp://, tls://)
  • portu - portu
  • gatti - Nome d'utilizatore
  • sicretu - codice
  • connect_timeout - timeout di cunnessione
  • read_timeout - leghje timeout

file di paràmetri di esempiu:

 <?php
return array(

        'CallMeDEBUG' => 1, // дебаг сообщения в логе: 1 - пишем, 0 - не пишем
        'tech' => 'SIP',
        'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', //токен авторизации битрикса
        'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', //url к api битрикса (входящий вебхук)
        'extentions' => array('888999'), // список внешних номеров, через запятую
        'context' => 'dial_out', //исходящий контекст для оригинации звонка
        'asterisk' => array( // настройки для подключения к астериску
                    'host' => '10.100.111.249',
                    'scheme' => 'tcp://',
                    'port' => 5038,
                    'username' => 'callme',
                    'secret' => 'JD3clEB8_f23r-3ry84gJ',
                    'connect_timeout' => 10000,
                    'read_timeout' => 10000
                ),
        'listener_timeout' => 300, //скорость обработки событий от asterisk

);

Configurazione di u supervisore

U supervisore hè utilizatu per lancià u prucessu di gestione di l'avvenimenti da Asterisk CallMeIn.php, chì monitorizza e chjama entranti è interagisce cù Bitrix24 (mostra a carta, oculte a carta, etc.).

File di paràmetri da creà:

/etc/supervisord.d/callme.conf

[program:callme]
command=/usr/bin/php CallMeIn.php
directory=/var/www/pbx.vistep.ru
autostart=true
autorestart=true
startretries=5
stderr_logfile=/var/www/pbx.vistep.ru/logs/daemon.log
stdout_logfile=/var/www/pbx.vistep.ru/logs/daemon.log

Lanciate è riavvia l'applicazione:

supervisorctl start callme
supervisorctl restart callme

Vede u statu di u funziunamentu di l'applicazione:

supervisorctl status callme
callme                           RUNNING   pid 11729, uptime 17 days, 16:58:07

cunchiusioni

Hè diventatu abbastanza cumplicatu, ma sò sicuru chì un amministratore espertu puderà implementà è piace à i so utilizatori.

Cum'è prumessu, ligame à github.

Domande, suggerimenti - per piacè lascialli in i cumenti. Inoltre, sè vo site interessatu à cumu u sviluppu di sta integrazione hè andatu, scrivite, è in u prossimu articulu pruvaraghju à revelà tuttu in più detail.

Source: www.habr.com

Add a comment