Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24
Në rrjet ka mundësi të ndryshme për integrimin e IP-ATS Asterisk me CRM Bitrix24, por ne, megjithatë, vendosëm të shkruajmë tonën.

Për sa i përket funksionalitetit, gjithçka është standarde:

  • Duke klikuar nĂ« lidhjen me numrin e telefonit tĂ« klientit nĂ« Bitrix24, Asterisk lidh numrin e brendshĂ«m tĂ« pĂ«rdoruesit, me emrin e tĂ« cilit Ă«shtĂ« bĂ«rĂ« ky klik, me numrin e telefonit tĂ« klientit. NĂ« Bitrix24 regjistrohet njĂ« shĂ«nim pĂ«r telefonatĂ«n dhe pas pĂ«rfundimit tĂ« thirrjes shkarkohet regjistrimi i bisedĂ«s.
  • NĂ« Asterisk vjen njĂ« thirrje nga jashtĂ« — nĂ« ndĂ«rfaqen e Bitrix24 i tregojmĂ« kartelĂ«n e klientit atij punonjĂ«si, nĂ« numrin e tĂ« cilit ka ardhur kjo thirrje.
    Nëse klienti i tillë nuk ekziston, do të hapim kartelën për krijimin e një lidhi të re.
    Sapo thirrja të përfundojë, e reflektojmë këtë në kartelë dhe shkarkojmë regjistrimin e bisedës.

PoshtĂ« do tĂ« tregoj se si ta konfiguroni te vetja dhe do tĂ« jap njĂ« link nĂ« github — po, merrni dhe pĂ«rdorni!

Përshkrimi i përgjithshëm

Integrimin tonë e quajmë CallMe. CallMe është një aplikacion i vogël uebi, i shkruar në PHP.

Teknologjitë dhe shërbimet e përdorura

  • PHP 5.6
  • Biblioteka PHP AMI
  • Composer
  • Nginx + php-fpm
  • supervisor
  • AMI (Asterisk Manager Interface)
  • Webhook Bitrix (implementim i thjeshtuar i REST API)

Konfigurimi paraprak

Në serverin me Asterisk duhet të instaloni një server web (ne përdorim nginx+php-fpm), supervisor dhe git.

Komanda për instalim (CentOS):

yum install nginx php-fpm supervisor git

Kalojmë në direktorinë e aksesueshme nga serveri web, tërheqim aplikacionin nga giti dhe vendosim të drejtat e nevojshme për dosjen:


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

Më pas do të konfigurojmë nginx, konfigurimi ynë është vendosur në

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

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

server {
	access_log /var/log/nginx/pbx.vistep.al.access.log main;
        error_log /var/log/nginx/pbx.vistep.al.error.log;

    listen 443 ssl http2;
    server_name pbx.vistep.al;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/pbx.vistep.al/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.al/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; # ndalim për skedarë të fshehur
        }

        location ~* /(?:uploads|files)/.*.php$ {
                deny all; # ndalim për skriptet e ngarkuara
        }

        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; # caching for static files
        }

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

Analiza e konfigurimit, çështjet e sigurisĂ«, marrĂ«veshja e certifikatĂ«s dhe madje edhe zgjedhja e serverit web e lĂ« natyrisht jashtĂ« kĂ«tij artikulli — pĂ«r kĂ«tĂ« Ă«shtĂ« shkruar shumĂ«.

Kemi HTTPS, certifikatĂ«n Let’s Encrypt.

Nëse keni bërë gjithçka siç duhet, duke kaluar në link duhet të shihni diçka të tillë.

Integrimi i Asterisk dhe Bitrix24

Konfigurimi i Bitrix24

Do të krijojmë dy webhook.

Webhooki hyrës.

Nën llogarinë e administratorit (me id 1) shkojmë në: Aplikacione -> Webhook -> Shto webhook -> Webhook hyrës.

Integrimi i Asterisk dhe Bitrix24

Plotësojmë parametrat e webhookit hyrës siç është në screenshot:

Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24

Dhe bëjmë ruaj.

Pas ruajtjes, Bitrix24 do të ofrojë URL-në e webhookit hyrës, për shembull:

Integrimi i Asterisk dhe Bitrix24

Ruani variantin tuaj tĂ« URL-sĂ« pa pĂ«rfundimin /profile/ — ajo do tĂ« pĂ«rdoret nĂ« aplikacion pĂ«r tĂ« punuar me thirrjet hyrĂ«se.

Kjo është: https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhooki dalës.

Aplikacione -> Webhook -> Shto webhook -> Webhook dalës.

Detajet përsëri në screenshot:

Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24

Ruajmë dhe marrim kodin e autorizimit.

Integrimi i Asterisk dhe Bitrix24

Kjo është: xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Edhe ky duhet të kopjohet, është i nevojshëm për thirrjet dalëse.

Ë rĂ«ndĂ«sishme!

Në serverin Bitrix24 duhet të jetë i instaluar certifikata ssl (mund të përdoret letsencrypt), përndryshe API i Bitrix-it nuk do të funksionojë. Nëse keni versionin cloud, nuk keni pse të shqetësoheni - atje ka një ssl.

Ë rĂ«ndĂ«sishme!

Në fushën "Adresa e handlerit" duhet të jepet adresa e aksesueshme nga interneti!

Dhe si një përfundim do të vendosim CallMeOut si aplikacion për kryerjen e thirrjeve (që me klikimin mbi numrin të dërgohet një komandë për origjinimin e thirrjes në PBX).

Në menu zgjidhni: Më shumë -> Telefonia -> Më shumë -> Cilësimet, vendosni në "Numri për thirrjen e dalshme si parazgjedhje" Aplikacion: CallMeOut dhe klikoni "Ruaj"

Integrimi i Asterisk dhe Bitrix24

Cilësimi i asterisk

Për një bashkëpunim të suksesshëm mes Asterisk dhe Bitrix24, duhet të shtojmë përdoruesin AMI callme në 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

Pastaj ka disa truke që do të nevojiten të implementohen përmes dialplan (ne do ta quajmë extensions.ael).

Po jap të gjithë skedarin, dhe më pas do të jap shpjegime:

globals {
    WAV=\/var\/www\/pbx.vistep.ru\/callme\/records\/wav; \/\/Katalogu përkohshëm me WAV
    MP3=\/var\/www\/pbx.vistep.ru\/callme\/records\/mp3; \/\/Këtu do të ngarkohen skedarët mp3
    URLRECORDS=https:\/\/pbx.vistep.ru\/callme\/records\/mp3;
    RECORDING=1; \/\/ Regjistrimi, 1 - aktivizuar.
};

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()); \/\/ vendosim CallerID nëse e njohim nga Bitrix24
        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 tashmë është vendosur ===));  
}

}


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

};

Le të fillojmë nga fillimi: direktiva globals.

Variabli URLRECORDS ruan URL-në e skedareve të regjistrimeve të bisedave, përmes të cilës Bitrix24 do t'i tërheqë ato në kartelën e kontaktit.

Pastaj na intereson makroja recording.

Këtu, përveç regjistrimit të bisedave, ne do të vendosim variablin FullFname.

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

Ajo ruan URL-në e plotë për një skedar të caktuar (makroja thirret kudo).

Le të shqyrtojmë telefonat e jashtëm:

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

Duke mendo pobane 89991234567, e para fillimi arrijme këtu:

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

dmth. thirret makro i regjistrimit të bisedës dhe vendosen variablat e nevojshme.

Tjetër

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

regjistrojmë kush e iniciuara telefonatën dhe e regjistrojmë kohën e fillimit të telefonatës.

Dhe pas përfundimit të saj, në një kontekst të veçantë 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});
}

ndalojmĂ« regjistrimin nĂ« tabelĂ«n CDR pĂ«r kĂ«tĂ« ekstension (nuk Ă«shtĂ« e nevojshme aty), vendosim kohĂ«n e pĂ«rfundimit tĂ« telefonatĂ«s, llogarisim kohĂ«zgjatjen, nĂ«se rezultati i telefonatĂ«s nuk Ă«shtĂ« i njohur — vendosim (variabla CallMeDISPOSITION) dhe, si hapin e fundit, dĂ«rgojmĂ« gjithçka nĂ« Bitrix pĂ«rmes curl-it sistemor.

Dhe pak magji tjetĂ«r — thirrja e ardhshme:

888999 => {
	&recording(${CALLERID(number)},${EXTEN});
        Answer();
        ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // vendosim CallerID nëse e kemi njohur nga Bitrix24
        Set(CallStart=${STRFTIME(epoch,,%s)}); // fillojmë numërimin e kohës së thirrjes
        Queue(Q1,tT);
        Set(CallMeDISPOSITION=${CDR(disposition)});
        Hangup();
        }

Këtu na intereson vetëm një rresht.

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

Ajo thotë që ATS të vendosë CallerID(name) baraz me variablin CallMeCallerIDName.

Vlera e vetĂ« variablit CallMeCallerIDName, pĂ«rsĂ«ri, vendoset nga aplikacioni CallMe (nĂ«se nĂ« Bitrix24 ka emĂ«rtim pĂ«r numrin e telefonuesit — do ta vendosim si CallerID(name), nĂ«se jo — nuk do tĂ« bĂ«jmĂ« asgjĂ«).

Konfigurimi i aplikacionit

Skedari i konfigurimit tĂ« aplikacionit — /var/www/pbx.vistep.ru/config.php

Përshkrimi i parametrave të aplikacionit:

  • CallMeDEBUG — nĂ«se Ă«shtĂ« 1, do tĂ« shkruhen nĂ« skedarin e logut tĂ« gjitha ngjarjet qĂ« trajtohen nga aplikacioni, 0 — nuk shkruajmĂ« asgjĂ«
  • tech — SIP/PJSIP/IAX/etc
  • authToken — tokeni i autorizimit tĂ« Bitrix24, kodi i autorizimit tĂ« webhook-ut tĂ« daljes
  • bitrixApiUrl — URL i webhook-ut tĂ« hyrĂ«s, pa profile/
  • extentions — lista e numrave tĂ« jashtĂ«m
  • context — konteksti pĂ«r origjinimin e thirrjes
  • listener_timeout — shpejtĂ«sia e pĂ«rpunimit tĂ« ngjarjeve nga Asterisk
  • asterisk — array me konfigurimin e lidhjes me Asterisk-in:
  • host — ip ose emri i hostit tĂ« serverit Asterisk
  • scheme — skema e lidhjes (tcp://, tls://)
  • port — porta
  • username — emri i pĂ«rdoruesit
  • sekret — fjalĂ«kalimi
  • connect_timeout — kohĂ«zgjatja e lidhjes
  • read_timeout — kohĂ«zgjatja e leximit

shembulli i skedarit të konfigurimit:

 1, // mesazhet e debagut në log: 1 - shkruaj, 0 - mos shkruaj
        'tech' => 'SIP',
        'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', // tokeni i autorizimit të Bitrix-it
        'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', // url për api-në e Bitrix-it (webhook i hyrës)
        'extentions' => array('888999'), // lista e numrave të jashtëm, përmes presjes
        'context' => 'dial_out', // konteksti i daljes për origjinimin e thirrjes
        'asterisk' => array( // konfigurimet për lidhjen me Asterisk-in
                    'host' => '10.100.111.249',
                    'scheme' => 'tcp://',
                    'port' => 5038,
                    'username' => 'callme',
                    'secret' => 'JD3clEB8_f23r-3ry84gJ',
                    'connect_timeout' => 10000,
                    'read_timeout' => 10000
                ),
        'listener_timeout' => 300, // shpejtësia e përpunimit të ngjarjeve nga Asterisk

);

Konfigurimi i supervisor-it

Supervisor-i shërben për të nisur procesin e përpunimit të ngjarjeve nga Asterisk CallMeIn.php, i cili monitoron thirrjet e hyrëse dhe ndërvepron me Bitrix24 (tregon kartelën, fsheh kartelën etj.).

Skedari i konfigurimit që duhet të krijohet:

/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

Nisja dhe rivendosja e aplikacionit:

supervisorctl start callme
supervisorctl restart callme

shikimi i statusit të punës së aplikacionit:

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

Përfundim

Doli mjaft e komplikuar, por jam i sigurt se një administrator i aftë do të arrijë ta implementojë atë dhe do të bëjë të lumtur përdoruesit e tij.

Siç e premtova, linku në GitHub.

Pyetje, sugjerime - lutem në komente. Po ashtu, nëse jeni të interesuar si shkoi zhvillimi i këtij integrimi, shkruani, dhe në një artikull tjetër do të përpiqem të zbuloj gjithçka më në detaje.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster