Kev sib xyaw ntawm Asterisk thiab Bitrix24

Kev sib xyaw ntawm Asterisk thiab Bitrix24
Muaj ntau txoj kev xaiv rau kev koom ua ke IP-PBX Asterisk thiab CRM Bitrix24 ntawm lub network, tab sis peb tseem txiav txim siab sau peb tus kheej.

Hais txog kev ua haujlwm, txhua yam yog tus qauv:

  • Los ntawm txhaj rau ntawm qhov txuas nrog tus neeg siv xov tooj hauv Bitrix24, Asterisk txuas tus lej sab hauv ntawm tus neeg siv uas nws sawv cev rau qhov nyem tau ua nrog tus neeg siv xov tooj. Hauv Bitrix24, cov ntaub ntawv ntawm kev hu raug kaw thiab, thaum kawg ntawm kev hu, cov ntaub ntawv kaw lus ntawm kev sib tham raug rub.
  • Asterisk tau txais kev hu xov tooj los ntawm sab nraud - hauv Bitrix24 interface peb qhia tus neeg siv daim npav rau tus neeg ua haujlwm rau tus lej xov tooj no tuaj txog.
    Yog tias tsis muaj cov neeg siv khoom zoo li no, peb yuav qhib daim npav rau kev tsim cov hlau lead tshiab.
    Thaum hu ua tiav, peb xav txog qhov no ntawm daim npav thiab rub cov ntaub ntawv kaw lus ntawm kev sib tham.

Hauv qab no qhov kev txiav kuv yuav qhia koj yuav ua li cas teeb tsa txhua yam rau koj tus kheej thiab muab koj txuas rau github - yog, yog, coj nws thiab siv nws!

Kev piav qhia dav dav

Peb hu peb kev koom ua ke CallMe. CallMe yog lub vev xaib me me sau hauv PHP.

Kev siv tshuab thiab kev pabcuam siv

  • PHP 5.6
  • PHP AMI qiv
  • Composer
  • Nginx + php-fpm
  • tus thawj coj
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (kev siv yooj yim REST API)

preseting

Ntawm lub server nrog Asterisk, koj yuav tsum nruab ib lub web server (rau peb nws yog nginx + php-fpm), tus saib xyuas thiab git.

Installation hais kom ua (CentOS):

yum install nginx php-fpm supervisor git

Peb mus rau cov ntawv teev npe nkag mus rau lub vev xaib server, rub daim ntawv thov los ntawm Git thiab teeb tsa cov cai tsim nyog rau daim nplaub tshev:


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

Tom ntej no, cia peb configure nginx, peb config nyob rau hauv

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

Kuv yuav tawm parsing lub config, teeb meem kev ruaj ntseg, tau txais ib daim ntawv pov thawj thiab txawm xaiv lub web server sab nraum lub scope ntawm tsab xov xwm - ntau tau sau txog qhov no. Daim ntawv thov tsis muaj kev txwv, nws ua haujlwm dhau ntawm http thiab https.

Peb siv https, cia peb encrypt daim ntawv pov thawj.

Yog tias koj ua txhua yam kom raug, tom qab ntawd los ntawm txhaj rau qhov txuas koj yuav tsum pom qee yam zoo li no

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Teeb tsa Bitrix24

Cia peb tsim ob lub webhooks.

Incoming webhook.

Nyob rau hauv tus thawj tswj account (nrog id 1), ua raws li txoj kev: Daim ntawv thov -> Webhooks -> Ntxiv webhook -> Nkag mus webhook

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Sau nyob rau hauv qhov tsis muaj qhov nkag webhook xws li hauv cov screenshots:

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Thiab nyem txuag.

Tom qab txuag, Bitrix24 yuav muab qhov URL ntawm lub webhook tuaj, piv txwv li:

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Txuag koj qhov version ntawm URL yam tsis muaj qhov kawg / profile / - nws yuav siv rau hauv daim ntawv thov ua haujlwm nrog kev hu tuaj.

Kuv muaj qhov no https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Outgoing webhook.

Cov ntawv thov -> Webhooks -> Ntxiv webhook -> Tawm webhook

Cov ntsiab lus yog dua ntawm cov screenshots:

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Txuag thiab tau txais cov cai tso cai

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Kuv muaj qhov no xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Koj kuj yuav tsum luam nws rau koj tus kheej; koj xav tau nws los hu xov tooj.

Tseem ceeb!

Daim ntawv pov thawj SSL yuav tsum tau teeb tsa ntawm Bitrix24 server (koj tuaj yeem siv letsencrypt), txwv tsis pub Bitrix api yuav tsis ua haujlwm. Yog tias koj muaj huab version, tsis txhob txhawj - nws twb muaj ssl.

Tseem ceeb!

Daim teb "Processor Chaw Nyob" yuav tsum muaj qhov chaw nyob nkag tau los ntawm Is Taws Nem!

Thiab raws li qhov kawg kov, cia peb nruab peb CallMeOut ua ib daim ntawv thov hu xov tooj (yog li ntawd thaum koj nyem rau ntawm tus lej ntawm PBX, cov lus txib kom pib hu yuav ya mus).

Hauv cov ntawv qhia zaub mov, xaiv: Ntau -> Xov tooj -> Ntau -> Chaw, teeb tsa hauv "Default outgoing call" Daim Ntawv Thov: CallMeOut thiab nyem "Txuag"

Kev sib xyaw ntawm Asterisk thiab Bitrix24

Teeb tsa lub hnub qub

Rau kev sib raug zoo ntawm Asterisk thiab Bitrix24, peb yuav tsum ntxiv AMI tus neeg siv hu rau 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

Tom ntej no, muaj ntau yam kev ua yuam kev uas yuav tsum tau ua los ntawm dialplan (rau peb qhov no yog extensions.ael).

Kuv yuav muab tag nrho cov ntaub ntawv, thiab tom qab ntawd kuv yuav piav qhia:

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

};

Cia peb pib los ntawm qhov pib: cov lus qhia thooj plawv.

Kuj tsis paub meej URLRECORDS khaws cov URL rau cov ntaub ntawv kaw lus sib tham, raws li Bitrix24 yuav rub lawv mus rau hauv daim npav tiv tauj.

Tom ntej no peb txaus siab rau macro macro cov ntaubntawv povthawj siv.

Ntawm no, ntxiv rau kev sau cov lus sib tham, peb yuav teeb tsa qhov sib txawv FullFname.

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

Nws khaws tag nrho URL rau cov ntaub ntawv tshwj xeeb (tus macro hu ua txhua qhov chaw).

Cia peb txheeb xyuas qhov kev hu tawm:

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

Wb hais tias peb hu rau 89991234567, ua ntej ntawm tag nrho peb tau txais ntawm no:

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

cov. Cov kev sib tham kaw macro hu ua thiab cov kev hloov pauv tsim nyog tau teeb tsa.

ntxiv

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

Peb sau tus neeg pib hu thiab sau lub sijhawm pib ntawm kev hu.

Thiab thaum nws ua tiav, nyob rau hauv cov ntsiab lus tshwj xeeb 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});
}

lov tes taw nkag mus rau CDR lub rooj rau qhov txuas ntxiv no (nws tsis xav tau nyob ntawd), teem sijhawm kawg ntawm kev hu, suav lub sijhawm, yog tias qhov tshwm sim ntawm kev hu tsis paub - teeb tsa (variable Hu rauMeDISPOSITION) thiab, cov kauj ruam kawg, xa txhua yam mus rau Bitrix ntawm qhov system curl.

Thiab me ntsis ntxiv khawv koob - kev hu tuaj:

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

Ntawm no peb tsuas yog txaus siab rau ib kab.

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

Nws qhia PBX rau nruab CallerID (npe) sib npaug rau variable Hu rauMeCallerIDName.

Lub CallMeCallerIDName hloov pauv nws tus kheej, dhau los, tau teeb tsa los ntawm CallMe daim ntawv thov (yog tias Bitrix24 muaj lub npe tag nrho rau tus neeg hu xov tooj, teeb tsa nws li CallerID (npe), tsis yog - peb yuav tsis ua dab tsi).

Kev teeb tsa daim ntawv thov

Daim ntawv teev cov ntaub ntawv - /var/www/pbx.vistep.ru/config.php

Kev piav qhia ntawm daim ntawv thov parameter:

  • CallMeDEBUG - yog tias 1, ces txhua yam xwm txheej ua tiav los ntawm daim ntawv thov yuav raug sau rau hauv cov ntaub ntawv teev cia, 0 - peb tsis sau dab tsi
  • tech - SIP / PJSIP / IAX / thiab lwm yam
  • authToken - Bitrix24 tso cai token, tawm webhook tso cai code
  • bitrixApiUrl - URL ntawm lub webhook tuaj, tsis muaj profile /
  • extentions - daim ntawv teev cov lej sab nraud
  • ntsiab lus - Cov ntsiab lus teb rau qhov pib hu
  • listener_timeout - ceev ntawm kev tshwm sim ua los ntawm lub hnub qub
  • asterisk - ib qho array nrog kev teeb tsa rau kev txuas rau lub hnub qub:
  • party - ip lossis hostname ntawm lub hnub qub server
  • tswvyim - daim duab kev sib txuas (tcp://, tls://)
  • qhov chaw nres nkoj - chaw nres nkoj
  • username - Tus neeg siv lub npe
  • tsis pub leejtwg paub - tus password
  • txuas_timeout - kev sib txuas ncua sij hawm
  • nyeem_timeout - nyeem lub sij hawm

piv txwv cov ntaub ntawv teeb tsa:

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

);

Kev teeb tsa tus thawj saib xyuas

Tus Thawj Saib Xyuas yog siv los tsim cov txheej txheem tswj hwm kev tshwm sim los ntawm Asterisk CallMeIn.php, uas saib xyuas kev hu xov tooj thiab cuam tshuam nrog Bitrix24 (qhia daim npav, zais daim npav, thiab lwm yam).

Cov ntaub ntawv yuav tsum tau tsim:

/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

Tua tawm thiab pib dua daim ntawv thov:

supervisorctl start callme
supervisorctl restart callme

Saib daim ntawv thov kev ua haujlwm raws li txoj cai:

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

xaus

Nws tau dhau los ua qhov nyuaj heev, tab sis kuv paub tseeb tias tus thawj coj paub txog yuav tuaj yeem siv nws thiab txaus siab rau nws cov neeg siv.

Raws li tau cog lus tseg, link to github.

Cov lus nug, cov lus qhia - thov tso lawv hauv cov lus. Tsis tas li ntawd, yog tias koj txaus siab rau qhov kev txhim kho ntawm kev sib koom ua ke no mus li cas, sau, thiab hauv tsab xov xwm tom ntej no kuv yuav sim qhia txhua yam kom ntxaws ntxiv.

Tau qhov twg los: www.hab.com

Ntxiv ib saib