Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24
Rrjeti ka opsione të ndryshme për integrimin e IP-PBX Asterisk dhe CRM Bitrix24, por ne, megjithatë, vendosëm të shkruajmë tonën.

Funksionalisht, 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 në emër të të cilit është bërë ky klikim me numrin e telefonit të klientit. Në Bitrix24, regjistrohet një regjistrim i thirrjes dhe në fund të telefonatës, regjistrimi i bisedës tërhiqet lart.
  • Një telefonatë arrin në Asterisk nga jashtë - në ndërfaqen Bitrix24, ne i tregojmë kartën e klientit punonjësit në numrin e të cilit mbërriti kjo telefonatë.
    Nëse nuk ka klient të tillë, hapni kartën për krijimin e një klienti të ri.
    Sapo telefonata të përfundojë, ne e pasqyrojmë këtë në kartë dhe e tërheqim regjistrimin e bisedës.

Nën prerjen, unë do t'ju tregoj se si të vendosni gjithçka për veten tuaj dhe të jepni një lidhje me github - po, po, merre dhe përdore!

Përshkrimi i përgjithshëm

Ne e quajtëm integrimin tonë CallMe. CallMe është një aplikacion i vogël ueb i shkruar në PHP.

Teknologjitë dhe shërbimet e përdorura

  • PHP 5.6
  • Biblioteka PHP AMI
  • Kompozitor
  • nginx + php fpm
  • mbikëqyrës
  • AMI (ndërfaqja e menaxherit të yjeve)
  • Uebhooks Bitrix (zbatimi i thjeshtuar REST API)

paravendosje

Në serverin me Asterisk, duhet të instaloni një server në internet (ne kemi nginx + php-fpm), mbikëqyrës dhe git.

Komanda e instalimit (CentOS):

yum install nginx php-fpm supervisor git

Ne kalojmë direktorinë e disponueshme për serverin në internet, e tërheqim aplikacionin nga git dhe vendosim të drejtat e nevojshme në dosje:


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

Tjetra, konfiguroni nginx, konfigurimi ynë ndodhet në

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

Unë do ta lë analizën e konfigurimit, çështjet e sigurisë, marrjen e një certifikate dhe madje edhe zgjedhjen e një serveri në internet jashtë fushës së artikullit - është shkruar shumë për këtë. Aplikacioni nuk ka kufizime, funksionon si në http ashtu edhe në https.

Ne kemi https, le të enkriptojmë certifikatën.

Nëse keni bërë gjithçka në mënyrë korrekte, atëherë duke klikuar në lidhjen duhet të shihni diçka të tillë

Integrimi i Asterisk dhe Bitrix24

Konfigurimi i Bitrix24

Le të krijojmë dy grepa në internet.

Ueb lidhëse hyrëse.

Nën llogarinë e administratorit (me id 1) shkoni përgjatë rrugës: Aplikimet -> Uebhooks -> Shto uebhook -> Uebhook hyrës

Integrimi i Asterisk dhe Bitrix24

Plotësoni parametrat e uebhook-ut në hyrje si në pamjet e ekranit:

Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24

Dhe klikoni ruaj.

Pas ruajtjes, Bitrix24 do të sigurojë URL-në e uebhook-ut në hyrje, për shembull:

Integrimi i Asterisk dhe Bitrix24

Ruani versionin tuaj të URL-së pa /profilin/ - do të përdoret në aplikacion për të punuar me thirrjet hyrëse.

e kam https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Ueb lidhëse dalëse.

Aplikacionet -> Uebhooks -> Shto Uebhook -> Uebhook dalës

Detajet janë në pamjet e ekranit:

Integrimi i Asterisk dhe Bitrix24

Integrimi i Asterisk dhe Bitrix24

Ruani dhe merrni kodin e autorizimit

Integrimi i Asterisk dhe Bitrix24

e kam xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Ju gjithashtu duhet ta kopjoni atë tek vetja, është e nevojshme për të bërë thirrje dalëse.

Rëndësishme!

Një certifikatë ssl duhet të konfigurohet në serverin Bitrix24 (mund të përdorni letsencrypt), përndryshe api BitrixXNUMX nuk do të funksionojë. Nëse keni një version cloud, mos u shqetësoni - ssl është tashmë atje.

Rëndësishme!

Në fushën "Adresa e procesorit" duhet të tregohet një adresë e aksesueshme nga Interneti!

Dhe me prekjen e fundit, le të instalojmë CallMeOut tonë si një aplikacion për kryerjen e telefonatave (në mënyrë që duke klikuar në numrin në PBX, të fluturojë një komandë për të nisur thirrjen).

Në meny, zgjidhni: Më shumë -> Telefonia -> Më shumë -> Cilësimet, vendosni në "Numrin për thirrjet dalëse si parazgjedhje" Aplikacionin: CallMeOut dhe klikoni "Ruaj"

Integrimi i Asterisk dhe Bitrix24

konfigurimi i yjeve

Për ndërveprim të suksesshëm midis Asterisk dhe Bitrix24, duhet të shtojmë përdoruesin callme AMI 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

Më pas, ka disa truke që do të duhet të zbatohen përmes planit të telefonit (ne kemi zgjerime.ael).

Do të citoj të gjithë dosjen dhe më pas do të jap shpjegime:

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

};

Le të fillojmë nga e para: direktiva Globals.

Ndryshore URLREKORDAT ruan URL-në e skedarëve të regjistrimit të bisedave, sipas të cilave Bitrix24 do t'i tërheqë ato në kartën e kontaktit.

Tjetra, ne jemi të interesuar për makro makro regjistrimi.

Këtu, përveç regjistrimit të bisedave, ne do të vendosim variablin Emri i plotë.

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

Ajo ruan URL-në e plotë në një skedar specifik (makro quhet kudo).

Le të analizojmë thirrjen dalëse:

_. => {
	&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ë themi se telefonojmë 89991234567, gjëja e parë që marrim këtu:

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

ato. thirret makroja e regjistrimit të thirrjeve dhe vendosen variablat e nevojshëm.

Më tej

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

ne regjistrojmë se kush e ka iniciuar thirrjen dhe regjistrojmë kohën e fillimit të telefonatës.

Dhe me përfundimin e tij, 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});
}

fikni hyrjen në tabelën CDR për këtë zgjatje (nuk është e nevojshme atje), vendosni kohën e përfundimit të telefonatës, llogaritni kohëzgjatjen, nëse rezultati i thirrjes nuk dihet - vendosni (ndryshueshme Më telefononi DISPOZITA) dhe, hapi i fundit, dërgoni gjithçka në Bitrix përmes curl-it të sistemit.

Dhe pak më shumë magji - një telefonatë hyrëse:

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

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

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

Ajo thotë se instaloni PBX ID e thirrësit (emri) e ndryshueshme CallMeCallerIDEmri.

Vetë ndryshorja CallMeCallerIDName, nga ana tjetër, vendoset nga aplikacioni CallMe (nëse Bitrix24 ka një emër të plotë për numrin e telefonuesit, ne do ta vendosim atë si ID e thirrësit (emri), jo - nuk do të bëjmë asgjë).

Konfigurimi i aplikacionit

Skedari i cilësimeve të aplikacionit - /var/www/pbx.vistep.ru/config.php

Përshkrimi i parametrave të aplikimit:

  • CallMeDEBUG - nëse 1, atëherë të gjitha ngjarjet e përpunuara nga aplikacioni do të shkruhen në skedarin log, 0 - ne nuk shkruajmë asgjë
  • tech SIP/PJSIP/IAX/etj
  • authToken — Shenja e autorizimit Bitrix24, kodi i autorizimit të uebhook-ut në dalje
  • bitrixApiUrl — URL-ja e uebgrepit në hyrje, pa profil/
  • shtrirjet — lista e numrave të jashtëm
  • kontekst — konteksti për fillimin e thirrjes
  • dëgjues_koha - shpejtësia e përpunimit të ngjarjeve nga ylli
  • yll - një grup me cilësimet e lidhjes me yll:
  • mikpritës - ip ose emri i hostit të serverit me yll
  • skemë — diagrami i lidhjes (tcp://, tls://)
  • port - port
  • Emri i përdoruesit - Emri i përdoruesit
  • sekret - fjalëkalimi
  • lidh_koha - skadimi i lidhjes
  • koha e leximit - lexoni kohëzgjatjen

shembull i skedarit të cilësimeve:

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

);

Vendosja e mbikëqyrësit

Mbikëqyrësi përdoret për të nisur procesin e mbajtësit të ngjarjeve Asterisk CallMeIn.php, i cili monitoron thirrjet në hyrje dhe ndërvepron me Bitrix24 (tregoni kartën, fshihni kartën, etj.).

Skedari i cilësimeve për të krijuar:

/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 rinisja e aplikacionit:

supervisorctl start callme
supervisorctl restart callme

shikoni statusin e aplikacionit:

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

Përfundim

Doli mjaft e vështirë, por jam i sigurt se një administrator me përvojë do të jetë në gjendje të zbatojë dhe kënaqë përdoruesit e tij.

Siç kishte premtuar, lidhje me github.

Pyetje, sugjerime - ju lutemi në komente. Gjithashtu, nëse jeni të interesuar se si shkoi zhvillimi i këtij integrimi, shkruani dhe në artikullin e ardhshëm do të përpiqem të zbuloj gjithçka në mënyrë më të detajuar.

Burimi: www.habr.com

Shto një koment