Ukudityaniswa kweAsterisk kunye neBitrix24

Ukudityaniswa kweAsterisk kunye neBitrix24
Inethiwekhi ineenketho ezahlukeneyo zokudibanisa i-IP-PBX Asterisk kunye neCRM Bitrix24, kodwa thina, nangona kunjalo, sagqiba ekubeni sibhale ezethu.

Ngokusebenzayo, yonke into isemgangathweni:

  • Ngokucofa ikhonkco kunye nenombolo yefowuni yomxhasi kwi-Bitrix24, i-Asterisk idibanisa inombolo yangaphakathi yomsebenzisi egameni lakhe oku nqakraza kunye nenombolo yefowuni yomxhasi. Kwi-Bitrix24, irekhodi lomnxeba liyarekhodwa, kwaye ekupheleni komnxeba, irekhodi lencoko liyatsalwa.
  • Umnxeba ufika kwi-Asterisk uvela ngaphandle-kwi-interface ye-Bitrix24, sibonisa ikhadi leklayenti kumqeshwa ekufike kuyo le nombolo yomnxeba.
    Ukuba akukho mthengi onjalo, vula ikhadi lokudala isikhokelo esitsha.
    Ngokukhawuleza ukuba umnxeba ugqityiwe, sibonakalisa oku kwikhadi kwaye sikhuphe ukurekhoda kwengxoxo.

Ngaphantsi kokusikwa, ndiya kukuxelela indlela yokumisela yonke into kwaye unike ikhonkco kwi-github - ewe, ewe, yithathe kwaye uyisebenzise!

Inkcazelo ngokubanzi

Sibize indibaniselwano yethu ebizwa ngokuba yiCallMe. I-CallMe sisicelo esincinci sewebhu esibhalwe kwi-PHP.

Ubuchwepheshe obusetyenzisiweyo kunye neenkonzo

  • PHP 5.6
  • PHP AMI Library
  • Umqambi
  • nginx + php fpm
  • umphathi
  • I-AMI (uMphathi weNdibaniselwano yeAsterisk)
  • I-Bitrix webhooks (ukuphunyezwa kwe-REST API eyenziwe lula)

ukusetha kwangaphambili

Kwiseva ene-Asterisk, kufuneka ufake iseva yewebhu (sine nginx + php-fpm), umphathi kunye ne-git.

Umyalelo wofakelo (CentOS):

yum install nginx php-fpm supervisor git

Sidlulisa uvimba weefayili okhoyo kwiseva yewebhu, tsala isicelo kwi-git kwaye usete amalungelo ayimfuneko kwifolda:


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

Emva koko, qwalasela i-nginx, uqwalaselo lwethu lukhona

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

Ndiya kushiya uhlalutyo lwe-config, imiba yokhuseleko, ukufumana isatifikethi, kunye nokukhetha umncedisi wewebhu ngaphandle kwendawo yenqaku - kuninzi kubhaliwe malunga nale nto. Isicelo asinazithintelo, sisebenza kuzo zombini i-http kunye ne-https.

Sine-https, masifihle isatifikethi.

Ukuba wenze yonke into ngokuchanekileyo, ngoko ngokucofa ikhonkco kufuneka ubone into enje

Ukudityaniswa kweAsterisk kunye neBitrix24

Ukuseta iBitrix24

Masenze ii-webhooks ezimbini.

I-webhook engenayo.

Ngaphantsi kweakhawunti yomlawuli (nge-id 1) hamba ngendlela: Izicelo -> IiWebhooks -> Yongeza i-webhook -> I-webhook engenayo

Ukudityaniswa kweAsterisk kunye neBitrix24

Gcwalisa iiparamitha zewebhu engenayo njengakwimifanekiso yesikrini:

Ukudityaniswa kweAsterisk kunye neBitrix24

Ukudityaniswa kweAsterisk kunye neBitrix24

Kwaye nqakraza ugcine.

Emva kokugcina, i-Bitrix24 iya kubonelela nge-URL yewebhu engenayo, umzekelo:

Ukudityaniswa kweAsterisk kunye neBitrix24

Gcina inguqulelo yakho ye-URL ngaphandle kokulandela / iprofayile/ - iya kusetyenziswa kwisicelo ukusebenza ngeefowuni ezingenayo.

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

I-webhook ephumayo.

Usetyenziso -> IiWebhooks -> Yongeza iWebhook -> IWebhook ephumayo

Iinkcukacha zikwisikrini:

Ukudityaniswa kweAsterisk kunye neBitrix24

Ukudityaniswa kweAsterisk kunye neBitrix24

Gcina kwaye ufumane ikhowudi yogunyaziso

Ukudityaniswa kweAsterisk kunye neBitrix24

ndinayo xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Kufuneka kwakhona uzikhuphele kuwe, iyafuneka ukwenza iminxeba ephumayo.

Kubalulekile!

Isatifikethi se-ssl kufuneka siqwalaselwe kumncedisi we-Bitrix24 (ungasebenzisa i-letsencrypt), kungenjalo i-BitrixXNUMX api ayiyi kusebenza. Ukuba unenguqulo yelifu, ungakhathazeki- i-ssl sele ikhona.

Kubalulekile!

Kwindawo ethi "Idilesi yeProcessor", idilesi efumaneka kwi-Intanethi kufuneka iboniswe!

Kwaye ngokucofa okokugqibela, masifake i-CallMeOut yethu njengesicelo sokufowuna (ukuze ngokucofa inombolo ekwi-PBX, umyalelo uya kubhabha ukuqalisa umnxeba).

Kwimenyu, khetha: Okuninzi -> Umnxeba -> Ngaphezulu -> Useto, beka "Inombolo yeefowuni eziphumayo ngokungagqibekanga" Isicelo: CallMeOut kwaye ucofe "Gcina"

Ukudityaniswa kweAsterisk kunye neBitrix24

ukuseta iinkwenkwezi

Kunxibelelwano oluyimpumelelo phakathi kweAsterisk kunye neBitrix24, kufuneka songeze i-callme AMI yomsebenzisi kumphathi.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

Emva koko, kukho amaqhinga ambalwa aya kufuneka aphunyezwe ngokusebenzisa i-diaplan (sine-extensions.ael).

Ndiza kucaphula yonke ifayile, kwaye ke ndiya kunika iingcaciso:

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

};

Masiqale ekuqaleni: isikhokelo Iiglobal.

Eyahlukileyo URLRECORDS igcina i-URL kwiifayile zokurekhoda incoko, ngokutsho kwe-Bitrix24 eya kuzitsalela kwikhadi loqhagamshelwano.

Emva koko, sinomdla kwi-macro macro ushicilelo.

Apha, ngaphezu kweengxoxo zokurekhoda, siya kusetha ukuguquguquka Igama elipheleleyo.

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

Igcina i-URL epheleleyo kwifayile ethile (i-macro ibizwa yonke indawo).

Makhe sihlalutye umnxeba ophumayo:

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

Masithi sibiza i-89991234567, into yokuqala esiyifumana apha:

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

abo. i-macro yokurekhoda umnxeba ibizwa kwaye iinguqu eziyimfuneko ziyasetwa.

Ngexesha elizayo

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

sirekhoda ukuba ngubani oqalise umnxeba kwaye sirekhode ixesha lokuqala lomnxeba.

Kwaye ekugqityweni kwayo, kwimeko ekhethekileyo 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});
}

cima ukungena kwitafile ye-CDR kolu lwandiso (alufunwa apho), cwangcisa ixesha lokuphela kwefowuni, ubale ubude bexesha, ukuba isiphumo socingo asaziwa - cwangcisa (i-variable). Ndibize DISPOSITION) kwaye, inyathelo lokugqibela, thumela yonke into kwi-Bitrix ngokusebenzisa i-curl yenkqubo.

Kwaye umlingo omncinci ngakumbi-umnxeba ongenayo:

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

Apha sinomdla kuphela kumgca omnye.

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

Uthi iPBX ifake I-CallerID(igama) iyaguquguquka CallMeCallerIDName.

ICallMeCallerIDName iyaguquguquka ngokwayo, ngokulandelayo, isetwe sisicelo seCallMe (ukuba iBitrix24 inegama elipheleleyo lenombolo yomfowuneli, siyakuyibeka njenge. I-CallerID(igama), hayi - asiyi kwenza nto).

Ukuseta isicelo

Ifayile yezicwangciso zesicelo - /var/www/pbx.vistep.ru/config.php

Inkcazo yeeparamitha zesicelo:

  • CallMeDEBUG - ukuba i-1, ke zonke iziganeko eziqhutywe ngesicelo ziya kubhalwa kwifayile yelog, 0 - asibhali nto
  • tech SIP/PJSIP/IAX/etc
  • authToken -Ithokheni yogunyaziso yeBitrix24, ikhowudi yogunyaziso yewebhu ephumayo
  • bitrixApiUrl -I-URL yewebhu engenayo, ngaphandle kweprofayile/
  • izandiso β€” uluhlu lwamanani angaphandle
  • umongo β€” umxholo wokuvela komnxeba
  • ixesha_lomphulaphuli -Isantya sokulungisa umcimbi kwiinkwenkwezi
  • i-asterisk -uluhlu olunesetingi zoqhagamshelwano kwiinkwenkwezi:
  • umkhosi - ip okanye igama lenginginya lomncedisi we asterisk
  • cwangciso β€” umzobo woqhagamshelo (tcp://, tls://)
  • izibuko - izibuko
  • lomsebenzisi -Igama lomsebenzisi
  • imfihlelo - inombolo yokuvula
  • connect_timeout -unxibelelwano luphelile
  • read_timeout - funda ixesha lokuvala

ifayile yemimiselo yomzekelo:

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

);

Ukusekwa komphathi

Umphathi usetyenziselwa ukuqalisa inkqubo yokusingatha umcimbi we-Asterisk CallMeIn.php, ebeka iliso kwiifowuni ezingenayo kunye nokusebenzisana ne-Bitrix24 (bonisa ikhadi, ufihle ikhadi, njl.).

Ifayile yemimiselo yokwenza:

/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

Ukuqala nokuphinda uqalise isicelo:

supervisorctl start callme
supervisorctl restart callme

Jonga imeko yesicelo:

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

isiphelo

Kwabonakala kunzima, kodwa ndiqinisekile ukuba umlawuli onamava uya kukwazi ukuphumeza kwaye akholise abasebenzisi bakhe.

Njengoko kuthenjisiwe, ikhonkco kwi-github.

Imibuzo, iingcebiso - nceda kumazwana. Kwakhona, ukuba unomdla kwindlela ukuphuhliswa kolu kuhlanganiswa kwahamba ngayo, bhala, kwaye kwinqaku elilandelayo ndiya kuzama ukutyhila yonke into ngokubanzi.

umthombo: www.habr.com

Yongeza izimvo