Integracija Asterisk in Bitrix24

Integracija Asterisk in Bitrix24
Obstajajo različne možnosti za integracijo IP-PBX Asterisk in CRM Bitrix24 v omrežje, vendar smo se vseeno odločili napisati svojo.

Kar zadeva funkcionalnost, je vse standardno:

  • S klikom na povezavo s telefonsko številko stranke v Bitrix24 Asterisk poveže interno številko uporabnika, v imenu katerega je bil opravljen klik, s telefonsko številko stranke. V Bitrix24 se snema zapis klica in ob koncu klica se potegne posnetek pogovora.
  • Asterisk prejme klic od zunaj - v vmesniku Bitrix24 kartico stranke pokažemo zaposlenemu, na katerega številko je ta klic prispel.
    Če te stranke ni, bomo odprli kartico za ustvarjanje novega potencialnega kupca.
    Takoj ko je klic končan, to prikažemo na kartici in prikažemo posnetek pogovora.

Spodaj vam bom povedal, kako vse nastaviti zase in vam dal povezavo do githuba - da, da, vzemite in uporabite!

Splošni opis

Našo integracijo smo poimenovali CallMe. CallMe je majhna spletna aplikacija, napisana v PHP.

Uporabljene tehnologije in storitve

  • PHP 5.6
  • Knjižnica PHP AMI
  • skladatelj
  • Nginx + php-fpm
  • Nadzornik
  • AMI (vmesnik upravitelja zvezdic)
  • Bitrix webhooks (poenostavljena implementacija REST API)

prednastavitev

Na strežnik z Asterisk je treba namestiti spletni strežnik (pri nas je to nginx+php-fpm), supervisor in git.

Namestitveni ukaz (CentOS):

yum install nginx php-fpm supervisor git

Gremo v imenik, ki je dostopen spletnemu strežniku, potegnemo aplikacijo iz Gita in nastavimo potrebne pravice za mapo:


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

Nato konfigurirajmo nginx, v katerem se nahaja naša konfiguracija

/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;
		}
}

Razčlenjevanje konfiguracije, varnostne težave, pridobivanje certifikata in celo izbiro spletnega strežnika bom pustil izven okvira članka - o tem je bilo že veliko napisanega. Aplikacija je brez omejitev, deluje tako preko http kot https.

Uporabljamo https, šifrirajmo potrdilo.

Če ste vse naredili pravilno, bi morali s klikom na povezavo videti nekaj takega

Integracija Asterisk in Bitrix24

Nastavitev Bitrix24

Ustvarimo dva webhooka.

Dohodni webhook.

Pod skrbniškim računom (z ID-jem 1) sledite poti: Aplikacije -> Webhooks -> Dodaj webhook -> Incoming webhook

Integracija Asterisk in Bitrix24

Izpolnite parametre dohodnega webhooka kot na posnetkih zaslona:

Integracija Asterisk in Bitrix24

Integracija Asterisk in Bitrix24

In kliknite shrani.

Po shranjevanju bo Bitrix24 zagotovil URL dohodnega webhooka, na primer:

Integracija Asterisk in Bitrix24

Shranite vašo različico URL-ja brez končnega /profila/ - ta bo uporabljen v aplikaciji za delo z dohodnimi klici.

tole imam https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Odhodni webhook.

Aplikacije -> Webhooks -> Add webhook -> Outgoing webhook

Podrobnosti spet na posnetkih zaslona:

Integracija Asterisk in Bitrix24

Integracija Asterisk in Bitrix24

Shranite in prejmite avtorizacijsko kodo

Integracija Asterisk in Bitrix24

tole imam xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Kopirati ga morate tudi zase, potrebujete ga za odhodne klice.

Pomembno!

SSL certifikat mora biti nastavljen na strežniku Bitrix24 (lahko uporabite letsencrypt), sicer Bitrix api ne bo deloval. Če imate različico v oblaku, ne skrbite - že ima ssl.

Pomembno!

Polje “Naslov procesorja” mora vsebovati naslov, ki je dostopen iz interneta!

In za konec še namestimo naš CallMeOut kot aplikacijo za klicanje (tako da ob kliku na številko na centrali odleti ukaz za vzpostavljanje klica).

V meniju izberite: Več -> Telefonija -> Več -> Nastavitve, nastavite v “Privzeta številka odhodnega klica” Aplikacija: CallMeOut in kliknite “Shrani”

Integracija Asterisk in Bitrix24

Nastavitev zvezdice

Za uspešno interakcijo med Asterisk in Bitrix24 moramo v manager.conf dodati uporabnik AMI callme:

[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

Nato je nekaj trikov, ki jih bo treba implementirati prek dialplan (za nas je to extensions.ael).

Posredoval bom celotno datoteko in nato podal razlago:

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});
}

};

Začnimo od začetka: direktiva globali.

Spremenljivka URLRECORDS shrani URL do datotek s posnetki pogovorov, po katerih jih bo Bitrix24 potegnil v kontaktno kartico.

Nato nas zanima makro makro Snemanje.

Tukaj bomo poleg snemanja pogovorov nastavili spremenljivko Polno ime.

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

Shrani celoten URL v določeno datoteko (makro se kliče povsod).

Analizirajmo odhodni klic:

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

Recimo, da pokličemo 89991234567, najprej pridemo sem:

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

tiste. Pokliče se makro za snemanje pogovora in nastavijo se potrebne spremenljivke.

Več

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

Zabeležimo, kdo je začel klic in zabeležimo čas začetka klica.

In po njegovem zaključku v posebnem kontekstu 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});
}

onemogočite vnos v tabelo CDR za to razširitev (tam ni potrebna), nastavite končni čas klica, izračunajte trajanje, če rezultat klica ni znan - nastavite (spremenljivka CallMeDISPOSITION) in zadnji korak vse pošljite v Bitrix prek sistemskega kodra.

In še malo čarovnije - dohodni klic:

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();
        }

Tukaj nas zanima le ena vrstica.

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

PBX pove, naj se namesti ID klicatelja (ime) enako spremenljivki CallMeCallerIDName.

Sama spremenljivka CallMeCallerIDName pa nastavi aplikacija CallMe (če ima Bitrix24 polno ime za številko klicatelja, ga nastavi kot ID klicatelja (ime), ne - ne bomo storili ničesar).

Nastavitev aplikacije

Datoteka z nastavitvami aplikacije - /var/www/pbx.vistep.ru/config.php

Opis parametrov aplikacije:

  • CallMeDEBUG — če je 1, bodo vsi dogodki, ki jih obdela aplikacija, zapisani v dnevniško datoteko, 0 — ne pišemo ničesar
  • tech - SIP/PJSIP/IAX/itd
  • authToken — avtorizacijski žeton Bitrix24, avtorizacijska koda za izhodni webhook
  • bitrixApiUrl — URL dohodnega webhooka, brez profila/
  • razširitve — seznam zunanjih številk
  • ozadje — kontekst za vzpostavljanje klica
  • poslušalec_timeout — hitrost obdelave dogodkov iz zvezdice
  • zvezdico — polje z nastavitvami za povezavo z zvezdico:
  • gostitelj — ip ali ime gostitelja strežnika z zvezdico
  • shema — povezovalni diagram (tcp://, tls://)
  • pristanišče - pristanišče
  • uporabniško ime - Uporabniško ime
  • Skrivnost - geslo
  • povezava_timeout — časovna omejitev povezave
  • read_timeout - časovna omejitev branja

primer nastavitvene datoteke:

 <?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

);

Nastavitev nadzornika

Supervisor se uporablja za zagon postopka obdelovalca dogodkov iz Asterisk CallMeIn.php, ki spremlja dohodne klice in komunicira z Bitrix24 (pokaži kartico, skrij kartico itd.).

Datoteka z nastavitvami, ki jo je treba ustvariti:

/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

Zaženite in znova zaženite aplikacijo:

supervisorctl start callme
supervisorctl restart callme

Ogled stanja delovanja aplikacije:

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

Zaključek

Izkazalo se je za precej zapleteno, vendar sem prepričan, da ga bo izkušen skrbnik lahko izvedel in zadovoljil svoje uporabnike.

Kot obljubljeno, povezava do github.

Vprašanja, predlogi - pustite jih v komentarjih. Tudi, če vas zanima, kako je potekal razvoj te integracije, pišite, v naslednjem članku bom poskušal vse podrobneje razkriti.

Vir: www.habr.com

Dodaj komentar