Asterisk ja Bitrix24 integreerimine

Asterisk ja Bitrix24 integreerimine
Internetis on erinevaid vÔimalusi IP-ATSi Asterisk ja CRM Bitrix24 integreerimiseks, kuid otsustasime siiski kirjutada oma lahenduse.

Funktsionaalsus on standardne:

  • KlĂ”psates Bitrix24 kliendi telefoninumbri lingile, ĂŒhendab Asterisk kasutaja sisemise numbri, kelle nimel see klikk tehti, kliendi telefoninumbriga. Bitrix24-s fikseeritakse kĂ”ne registreerimine ja kĂ”ne lĂ”ppedes tĂ”mmatakse kĂ”ne salvestus.
  • Asteriskile tuleb vĂ€liskĂ”ne — Bitrix24 liideses nĂ€itame klientide kaarti sellele töötajale, kellele kĂ”ne suunati.
    Kui sellist klienti ei ole, avame uue juhtumi kaardi.
    Kuna kÔne on lÔpetatud, kajastame seda kaardil ja tÔmbame kÔne salvestuse.

Allpool rÀÀgin, kuidas kĂ”ik enda juures seadistada ja jagan lingi githubi — jah, jah, vĂ”tke ja kasutage!

Üldine kirjeldus

Oma integreerimist oleme nimetanud CallMe. CallMe on vÀike veebirakendus, mis on kirjutatud PHP-s.

Kasutatud tehnoloogiad ja teenused

  • PHP 5.6
  • PHP AMI-raamatukogu
  • Composer
  • Nginx + php-fpm
  • supervisor
  • AMI (Asterisk Manager Interface)
  • Bitrixi veebihooked (lihtsustatud REST API rakendus)

EelsÀttimine

Asteriskiga serverisse tuleb installida veebiserver (meie puhul nginx+php-fpm), supervisor ja git.

Installeerimise kÀsk (CentOS):

yum install nginx php-fpm supervisor git

Liigume katalooge, mis on veebiserverile juurdepÀÀsetavad, tÔmbame git'ist rakenduse ja seadistame vajalikud Ôigused kaustale:


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

JĂ€tkame nginx'i seadistamisega, meie konfiguratsioon asub

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

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

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


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

    listen 443 ssl http2;
    server_name pbx.vistep.ee;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/pbx.vistep.ee/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ee/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; # keelatud peidetud failid
        }

        location ~* /(?:uploads|files)/.*.php$ {
                deny all; # keelatud ĂŒleslaaditud skriptid
        }

        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; # staatilise sisu vahemÀlu
        }

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

Konfiguratsiooni analĂŒĂŒs, turvakĂŒsimused, sertifikaadi saamine ja isegi veebiserveri valik jÀÀvad artiklist vĂ€lja — sellest on palju kirjutatud. Rakendusel ei ole piiranguid, see töötab nii http kui ka https.

Meil on https, Let's Encrypt sertifikaat.

Kui olete kÔik Ôigesti teinud, siis peaksite lingile minnes nÀgema midagi sarnast.

Asterisk ja Bitrix24 integreerimine

Bitrix24 seadistamine

Loome kaks veebihaki.

Sissetulev veebihakk.

Administratiivse konto alla (id 1) lÀheme jÀrgmist teed: Rakendused -> Veebihakid -> Lisa veebihakk -> Sissetulev veebihakk.

Asterisk ja Bitrix24 integreerimine

TĂ€idame sissetuleva veebihaki parameetrid nagu ekraanipiltidel:

Asterisk ja Bitrix24 integreerimine

Asterisk ja Bitrix24 integreerimine

Ja vajutame salvesta.

PÀrast salvestamist annab Bitrix24 sissetuleva veebihaki URL-i, nÀiteks:

Asterisk ja Bitrix24 integreerimine

Salvestage oma versioon URL-ist ilma lĂ”pposa /profile/ — seda kasutatakse rakenduses sissetulevate kĂ”nede haldamiseks.

Minu URL on https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

VĂ€ljuv veebihakk.

Rakendused -> Veebihakid -> Lisa veebihakk -> VĂ€ljuv veebihakk.

Kordame ĂŒksikasju ekraanipiltidel:

Asterisk ja Bitrix24 integreerimine

Asterisk ja Bitrix24 integreerimine

Salvestame ja saame autoriseerimiskoodi.

Asterisk ja Bitrix24 integreerimine

Minu URL on xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Selle peaksite samuti endale kopeerima, seda on vaja vÀljuvate kÔnede tegemiseks.

Oluline!

Bitrix24 serveril peab olema seadistatud ssl-sertifikaat (vĂ”ite kasutada letsencrypt'i), vastasel juhul ei tööta Bitrix API. Kui teil on pilveversioon, siis ei pea te muretsema — seal on juba ssl olemas.

Oluline!

VĂ€ljale „KĂ€sitleja aadress” peab olema mĂ€rgitud internetist ligipÀÀsetav aadress!

Ja viimasena seadistame meie CallMeOut'i rakenduseks helistamiseks (et klÔpsates numbril saadetaks telefonivÔrku kÀsk kÔne originaadorimiseks).

Valige menĂŒĂŒs: Veel -> Telefoniteenused -> Veel -> Seaded, seada „Vaikimisi vĂ€ljakutse number” Rakenduseks: CallMeOut ja vajutage „Salvesta”.

Asterisk ja Bitrix24 integreerimine

Asterisk seadistus

Asterisk'i ja Bitrix24 edukaks koostööks peame lisama AMI-kasutaja callme faili 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

SeejÀrel on mitmeid nippe, mida on vaja rakendada dialplani kaudu (meil on see extensions.ael).

TÔin vÀlja kogu faili, ja hiljem annan selgitused:

globals {
    WAV=/var/www/pbx.vistep.ru/callme/records/wav; //Ajutine kataloog WAV failidele
    MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //Siia laaditakse mp3 faile
    URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
    RECORDING=1; // Salvestamine, 1 - sisse lĂŒlitatud.
};

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()); // seame CallerID, kui teada Bitrix24 kaudu
        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});
}

};

Alustame algusest: direktiiv globals.

Muutuja URLRECORDS salvestab URL-i kÔnefailide jaoks, mille kaudu Bitrix24 toob need kontaktikaardile.

SeejÀrel on meil huvi makro " recording.

Siin, peale kÔnede salvestamise, mÀÀrame muutujaks FullFname.

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

See salvestab konkreetse faili tĂ€is-URL-i (makrot kutsutakse igal pool ĂŒles).

Vaatame vÀljakuulutatud kÔnet:

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

Oletame, et helistame numbrile 89991234567, kÔigepealt jÔuame siia:

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

st. kÀivitatakse kÔne salvestamise makro ja seadistatakse vajalikud muutujad.

SeejÀrel

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

salvestame, kes helistab ja fikseerime kÔne algusaja.

Ja lÔpetamisel, eritingimustes 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});
}

lĂŒlitame selle ekstensi jaoks CDR-i tabelisse salvestamise vĂ€lja (see pole seal vajalik), seame kĂ”ne lĂ”petamise aja, arvutame kestuse, kui kĂ”ne tulemus ei ole teada — paneme (muutuja CallMeDISPOSITION) ja viimasena saadame kĂ”ik Bitrixi kaudu sĂŒsteemse curl.

Ja veel natuke maagiat — sissetulev kĂ”ne:

888999 => {
	&recording(${CALLERID(number)},${EXTEN});
        Answer();
        ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // seame CallerID, kui saime selle Bitrix24-st
        Set(CallStart=${STRFTIME(epoch,,%s)}); // alustame kÔne aja arvestust
        Queue(Q1,tT);
        Set(CallMeDISPOSITION=${CDR(disposition)});
        Hangup();
        }

Siin huvitab meid ainult ĂŒks rida.

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

See ĂŒtleb ATS-ile seada CallerID(name) vĂ”rdseks muutuja CallMeCallerIDName.

Muutuja CallMeCallerIDName, omakorda, seadistatakse rakenduse CallMe poolt (kui Bitrix24-is on helistajale mÀÀratud nimi, seadistame selle CallerID(name), kui ei, siis ei tegele selle kĂŒsimusega).

Rakenduse seadistamine

Rakenduse seadete fail — /var/www/pbx.vistep.ru/config.php

Rakenduse parameetrite selgitus:

  • CallMeDEBUG — kui 1, siis kirjutatakse logifaili kĂ”ik sĂŒndmused, mida rakendus töötleb, 0 — midagi ei kirjuta
  • tech — SIP/PJSIP/IAX/ jne
  • authToken — Bitrix24 autoriseerimise token, vĂ€ljuva veebirakenduse autoriseerimise kood
  • bitrixApiUrl — sissetuleva veebirakenduse URL, ilma profile/
  • extentions — vĂ€liste numbrite loend
  • context — kontekst kĂ”ne algatamiseks
  • listener_timeout — sĂŒndmuste töötlemise kiirus asteriskilt
  • asterisk — massiiv seadistustega ĂŒhendamiseks asteriskiga:
  • host — asteriski serveri IP vĂ”i hostname
  • scheme — ĂŒhendusskeem (tcp://, tls://)
  • port — port
  • username — kasutajanimi
  • salajane — parool
  • connect_timeout — ĂŒhenduse ajutine katkestus
  • read_timeout — lugemise ajutine katkestus

seadete faili nÀide:

 1, // debug messages in the log: 1 - write, 0 - do not write
        'tech' => 'SIP',
        'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', // Bitrix authorization token
        'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', // URL to Bitrix API (incoming webhook)
        'extentions' => array('888999'), // list of external numbers, separated by commas
        'context' => 'dial_out', // outgoing context for call origination
        'asterisk' => array( // settings for connecting to Asterisk
                    'host' => '10.100.111.249',
                    'scheme' => 'tcp://',
                    'port' => 5038,
                    'username' => 'callme',
                    'secret' => 'JD3clEB8_f23r-3ry84gJ',
                    'connect_timeout' => 10000,
                    'read_timeout' => 10000
                ),
        'listener_timeout' => 300, // event processing speed from Asterisk

);

Supervisor seadistus

Supervisor kasutab Asterisk CallMeIn.php sĂŒndmuste töötlemise protsessi kĂ€ivitamiseks, mis jĂ€lgib sissetulevaid kĂ”nesid ja suhelda Bitrix24-ga (nĂ€idata kaarti, peita kaarti jne).

Tuleb luua seadistuse fail:

/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

Rakenduse kÀivitamine ja taaskÀivitamine:

supervisorctl start callme
supervisorctl restart callme

rakenduse töö staatuse vaatamine:

supervisorctl status callme
callme                           TÖÖTAB   pid 11729, tööaeg 17 pĂ€eva, 16:58:07

KokkuvÔte

See osutus piisavalt keeruliseks, kuid olen kindel, et kogenud administraator suudab selle enda jaoks rakendada ja oma kasutajaid rÔÔmustada.

Nagu lubatud, link githubis.

KĂŒsimused, soovitused — ootan kommentaaridesse. Samuti, kui teid huvitab, kuidas selle integratsiooni arendamine kĂ€is, kirjutage, ja jĂ€rgmises artiklis pĂŒĂŒan kĂ”ike ĂŒksikasjalikumalt avada.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster