Asteriskin ja Bitrix24:n integrointi

Asteriskin ja Bitrix24:n integrointi
IP-PBX Asteriskin ja CRM Bitrix24:n integroimiseen verkkoon on olemassa erilaisia ​​vaihtoehtoja, mutta päätimme silti kirjoittaa oman.

Toimivuuden suhteen kaikki on vakio:

  • Napsauttamalla asiakkaan puhelinnumeron sisältävää linkkiä Bitrix24:ssä Asterisk yhdistää sen käyttäjän sisäisen numeron, jonka puolesta klikkaus tehtiin, asiakkaan puhelinnumeroon. Bitrix24:ssä puhelu nauhoitetaan ja puhelun lopussa keskustelun tallenne vedetään esiin.
  • Asterisk saa puhelun ulkopuolelta - Bitrix24-rajapinnassa näytämme asiakaskortin työntekijälle, jonka numeroon tämä puhelu saapui.
    Jos tällaista asiakasta ei ole, avaamme kortin uuden liidin luomista varten.
    Heti kun puhelu on valmis, heijastamme tämän kortissa ja otamme keskustelun tallenteen.

Leikkauksen alapuolella kerron, kuinka asetat kaiken itsellesi ja annan sinulle linkin githubiin - kyllä, kyllä, ota ja käytä!

Yleinen kuvaus

Kutsuimme integraatiotamme CallMe:ksi. CallMe on pieni web-sovellus, joka on kirjoitettu PHP:llä.

Käytetyt tekniikat ja palvelut

  • PHP 5.6
  • PHP AMI -kirjasto
  • säveltää
  • Nginx + php-fpm
  • valvoja
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (yksinkertaistettu REST API -toteutus)

esiasetus

Palvelimelle, jossa on Asterisk, sinun on asennettava verkkopalvelin (meille se on nginx+php-fpm), supervisor ja git.

Asennuskomento (CentOS):

yum install nginx php-fpm supervisor git

Menemme verkkopalvelimen käytettävissä olevaan hakemistoon, vedämme sovelluksen Gitistä ja asetamme tarvittavat oikeudet kansioon:


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

Seuraavaksi määritetään nginx, kokoonpanomme sijaitsee

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

Jätän kokoonpanon jäsentämisen, tietoturvakysymykset, varmenteen hankkimisen ja jopa web-palvelimen valinnan artikkelin ulkopuolelle - tästä on kirjoitettu paljon. Sovelluksella ei ole rajoituksia, se toimii sekä http- että https-yhteydellä.

Käytämme https, salataan varmenne.

Jos teit kaiken oikein, napsauttamalla linkkiä sinun pitäisi nähdä jotain tällaista

Asteriskin ja Bitrix24:n integrointi

Asetetaan Bitrix24

Luodaan kaksi webhookia.

Saapuva webhook.

Seuraa järjestelmänvalvojan tilin (tunnuksella 1) alla olevaa polkua: Applications -> Webhooks -> Add webhook -> Incoming webhook

Asteriskin ja Bitrix24:n integrointi

Täytä saapuvan webhookin parametrit kuten kuvakaappauksissa:

Asteriskin ja Bitrix24:n integrointi

Asteriskin ja Bitrix24:n integrointi

Ja napsauta Tallenna.

Tallennuksen jälkeen Bitrix24 antaa saapuvan webhookin URL-osoitteen, esimerkiksi:

Asteriskin ja Bitrix24:n integrointi

Tallenna URL-versiosi ilman lopullista /profiilia/ - sitä käytetään sovelluksessa saapuvien puhelujen käsittelyyn.

minulla on tämä https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Lähtevä webhook.

Sovellukset -> Webhookit -> Lisää webhook -> Lähtevä webhook

Yksityiskohdat ovat jälleen kuvakaappauksissa:

Asteriskin ja Bitrix24:n integrointi

Asteriskin ja Bitrix24:n integrointi

Tallenna ja vastaanota valtuutuskoodi

Asteriskin ja Bitrix24:n integrointi

minulla on tämä xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Sinun on myös kopioitava se itsellesi; tarvitset sitä lähtevien puhelujen soittamiseen.

Tärkeää!

SSL-sertifikaatti on määritettävä Bitrix24-palvelimella (voit käyttää letsencryptiä), muuten Bitrix-sovellusliittymä ei toimi. Jos sinulla on pilviversio, älä huoli - siinä on jo ssl.

Tärkeää!

"Prosessorin osoite" -kentässä tulee olla Internetistä saatavilla oleva osoite!

Ja viimeisenä silauksena asennataan CallMeOut-sovelluksemme puheluiden soittamista varten (jotta kun napsautat PBX:n numeroa, puhelun aloittamiskomento lentää pois).

Valitse valikosta: Lisää -> Puhelu -> Lisää -> Asetukset, aseta "Lähtevän puhelun oletusnumero" Sovellus: CallMeOut ja napsauta "Tallenna".

Asteriskin ja Bitrix24:n integrointi

Asetetaan tähti

Jotta Asteriskin ja Bitrix24:n välinen vuorovaikutus onnistuisi, meidän on lisättävä AMI-käyttäjä callme hakemistoon 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

Seuraavaksi on useita temppuja, jotka on toteutettava dialplanin kautta (meille tämä on extensions.ael).

Toimitan koko tiedoston ja annan sitten selityksen:

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

};

Aloitetaan alusta: direktiivi global.

muuttuja URLRECORDS tallentaa keskustelun tallennustiedostojen URL-osoitteen, jonka mukaan Bitrix24 vetää ne yhteystietokorttiin.

Seuraavaksi olemme kiinnostuneita makromakrosta äänitys.

Tässä keskustelujen tallentamisen lisäksi asetamme muuttujan FullFname.

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

Se tallentaa tietyn tiedoston täydellisen URL-osoitteen (makroa kutsutaan kaikkialla).

Analysoidaan lähtevä puhelu:

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

Oletetaan, että soitamme numeroon 89991234567, ensinnäkin saamme tänne:

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

nuo. Keskustelun tallennusmakro kutsutaan ja tarvittavat muuttujat asetetaan.

Edelleen

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

Tallennamme puhelun aloittajan ja puhelun alkamisajan.

Ja sen valmistuttua erityisessä kontekstissa 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});
}

estää pääsyn tämän alaliittymän CDR-taulukkoon (ei sitä siellä tarvita), aseta puhelun lopetusaika, laske kesto, jos puhelun tulos ei ole tiedossa - aseta (muuttuja) CallMeDISPOSITION) ja viimeisessä vaiheessa lähetä kaikki Bitrixiin järjestelmän curlin kautta.

Ja vielä vähän taikuutta - saapuva puhelu:

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

Tässä meitä kiinnostaa vain yksi rivi.

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

Hän käskee PBX:ää asentamaan Soittajan tunnus (nimi) yhtä suuri kuin muuttuja CallMeCallerIDName.

Itse CallMeCallerIDName-muuttujan puolestaan ​​asettaa CallMe-sovellus (jos Bitrix24:llä on soittajan numerolle koko nimi, aseta se Soittajan tunnus (nimi), ei – emme tee mitään).

Sovelluksen määrittäminen

Sovellusasetustiedosto - /var/www/pbx.vistep.ru/config.php

Sovellusparametrien kuvaus:

  • CallMeDEBUG — jos 1, niin kaikki sovelluksen käsittelemät tapahtumat kirjoitetaan lokitiedostoon, 0 — emme kirjoita mitään
  • teknologia - SIP/PJSIP/IAX/jne
  • authToken — Bitrix24-valtuutustunnus, lähtevän webhook-valtuutuskoodi
  • bitrixApiUrl - saapuvan webhookin URL-osoite ilman profiilia/
  • laajennukset — ulkoisten numeroiden luettelo
  • tausta — konteksti puhelun aloittamiseen
  • kuuntelijan_aikakatkaisu — tapahtuman käsittelyn nopeus tähdestä
  • tähtimerkki — taulukko, jossa on asetukset tähdellä yhdistämistä varten:
  • isäntä — tähtipalvelimen IP-osoite tai isäntänimi
  • järjestelmä - kytkentäkaavio (tcp://, tls://)
  • portti - portti
  • käyttäjätunnus - Käyttäjätunnus
  • salaisuus - Salasana
  • connect_timeout - yhteyden aikakatkaisu
  • luku_aikakatkaisu - lukemisen aikakatkaisu

esimerkkiasetustiedosto:

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

);

Valvojan asetukset

Supervisoria käytetään tapahtumankäsittelyprosessin käynnistämiseen Asterisk CallMeIn.php:stä, joka valvoo saapuvia puheluita ja on vuorovaikutuksessa Bitrix24:n kanssa (näytä kortti, piilota kortti jne.).

Luotava asetustiedosto:

/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

Käynnistä ja käynnistä sovellus uudelleen:

supervisorctl start callme
supervisorctl restart callme

Sovelluksen toimintatilan tarkasteleminen:

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

Johtopäätös

Se osoittautui melko monimutkaiseksi, mutta olen varma, että kokenut järjestelmänvalvoja pystyy toteuttamaan sen ja miellyttää käyttäjiään.

Kuten luvattu, linkki githubiin.

Kysymyksiä, ehdotuksia - jätä ne kommentteihin. Lisäksi, jos olet kiinnostunut siitä, kuinka tämän integraation kehitys sujui, kirjoita, ja seuraavassa artikkelissa yritän paljastaa kaiken yksityiskohtaisemmin.

Lähde: will.com

Lisää kommentti