ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24
ื™ืฉื ืŸ ืืคืฉืจื•ื™ื•ืช ืฉื•ื ื•ืช ืœืฉื™ืœื•ื‘ IP-PBX Asterisk ื•-CRM Bitrix24 ื‘ืจืฉืช, ืืš ื‘ื›ืœ ื–ืืช ื”ื—ืœื˜ื ื• ืœื›ืชื•ื‘ ืžืฉืœื ื•.

ืžื‘ื—ื™ื ืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช, ื”ื›ืœ ืกื˜ื ื“ืจื˜ื™:

  • ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ืงื™ืฉื•ืจ ืขื ืžืกืคืจ ื˜ืœืคื•ืŸ ืฉืœ ืœืงื•ื— ื‘-Bitrix24, Asterisk ืžื—ื‘ืจืช ืืช ื”ืžืกืคืจ ื”ืคื ื™ืžื™ ืฉืœ ื”ืžืฉืชืžืฉ ืฉื‘ืฉืžื• ื‘ื•ืฆืขื” ื”ืงืœื™ืง ืขื ืžืกืคืจ ื”ื˜ืœืคื•ืŸ ืฉืœ ื”ืœืงื•ื—. ื‘-Bitrix24 ืžื•ืงืœื˜ืช ืชื™ืขื•ื“ ื”ืฉื™ื—ื” ื•ื‘ืกื™ื•ื ื”ืฉื™ื—ื” ื ืฉืœืคืช ื”ืงืœื˜ื” ืฉืœ โ€‹โ€‹ื”ืฉื™ื—ื”.
  • ื›ื•ื›ื‘ื™ืช ืžืงื‘ืœืช ืฉื™ื—ื” ืžื‘ื—ื•ืฅ - ื‘ืžืžืฉืง Bitrix24 ืื ื• ืžืฆื™ื’ื™ื ืืช ื›ืจื˜ื™ืก ื”ืœืงื•ื— ืœืขื•ื‘ื“ ืฉืืœื™ื• ื”ื’ื™ืขื” ื”ืฉื™ื—ื” ื”ื–ื•.
    ืื ืื™ืŸ ืœืงื•ื— ื›ื–ื”, ื ืคืชื— ืืช ื”ื›ืจื˜ื™ืก ืœื™ืฆื™ืจืช ืœื™ื“ ื—ื“ืฉ.
    ืžื™ื“ ืขื ื”ืฉืœืžืช ื”ืฉื™ื—ื”, ืื ื• ืžืฉืงืคื™ื ื–ืืช ื‘ื›ืจื˜ื™ืก ื•ืฉื•ืœืคื™ื ื”ืงืœื˜ื” ืฉืœ โ€‹โ€‹ื”ืฉื™ื—ื”.

ืžืชื—ืช ืœื’ื–ืจื” ืื ื™ ืื’ื™ื“ ืœืš ืื™ืš ืœื”ื’ื“ื™ืจ ื”ื›ืœ ืœืขืฆืžืš ื•ืืชืŸ ืœืš ืงื™ืฉื•ืจ ืœ-github - ื›ืŸ, ื›ืŸ, ืงื— ืืช ื–ื” ื•ื”ืฉืชืžืฉ ื‘ื•!

ืชื™ืื•ืจ ื›ืœืœื™

ืงืจืื ื• ืœืื™ื ื˜ื’ืจืฆื™ื” ืฉืœื ื• CallMe. CallMe ื”ื•ื ื™ื™ืฉื•ื ืื™ื ื˜ืจื ื˜ ืงื˜ืŸ ืฉื ื›ืชื‘ ื‘-PHP.

ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื•ืฉื™ืจื•ืชื™ื ื‘ืฉื™ืžื•ืฉ

  • PHP 5.6
  • ืกืคืจื™ื™ืช PHP AMI
  • ืžืœื—ื™ืŸ
  • Nginx + php-fpm
  • ืžืคืงื—
  • AMI (ืžืžืฉืง ืžื ื”ืœ ื›ื•ื›ื‘ื™ื•ืช)
  • Bitrix webhooks (ื™ื™ืฉื•ื ืคืฉื•ื˜ ืฉืœ REST API)

ื”ื’ื“ืจื” ืžืจืืฉ

ื‘ืฉืจืช ืขื ื›ื•ื›ื‘ื™ืช ืฆืจื™ืš ืœื”ืชืงื™ืŸ ืฉืจืช ืื™ื ื˜ืจื ื˜ (ืืฆืœื ื• ื–ื” nginx+php-fpm), supervisor ื•-git.

ืคืงื•ื“ืช ื”ืชืงื ื” (CentOS):

yum install nginx php-fpm supervisor git

ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœืกืคืจื™ื™ื” ื”ื ื’ื™ืฉื” ืœืฉืจืช ื”ืื™ื ื˜ืจื ื˜, ืžื•ืฉื›ื™ื ืืช ื”ืืคืœื™ืงืฆื™ื” ืž-Git ื•ืžื’ื“ื™ืจื™ื ืืช ื”ื–ื›ื•ื™ื•ืช ื”ื“ืจื•ืฉื•ืช ืœืชื™ืงื™ื”:


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

ืœืื—ืจ ืžื›ืŸ, ื‘ื•ืื• ื ื’ื“ื™ืจ ืืช nginx, ื”ืชืฆื•ืจื” ืฉืœื ื• ืžืžื•ืงืžืช ื‘

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

ืืช ื ื™ืชื•ื— ื”ืชืฆื•ืจื”, ื‘ืขื™ื•ืช ืื‘ื˜ื—ื”, ืงื‘ืœืช ืื™ืฉื•ืจ ื•ืืคื™ืœื• ื‘ื—ื™ืจืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืืฉืื™ืจ ืžื—ื•ืฅ ืœืชื—ื•ื ื”ืžืืžืจ - ืขืœ ื›ืš ื ื›ืชื‘ ืจื‘ื•ืช. ืœืืคืœื™ืงืฆื™ื” ืื™ืŸ ื”ื’ื‘ืœื•ืช, ื”ื™ื ืคื•ืขืœืช ื’ื ืขืœ http ื•ื’ื ืขืœ https.

ืื ื• ืžืฉืชืžืฉื™ื ื‘-https, ื‘ื•ืื• ื ืฆืคื™ืŸ ืื™ืฉื•ืจ.

ืื ืขืฉื™ืช ื”ื›ืœ ื ื›ื•ืŸ, ืื– ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ื”ืงื™ืฉื•ืจ ืืชื” ืืžื•ืจ ืœืจืื•ืช ืžืฉื”ื• ื›ื–ื”

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ื”ื’ื“ืจืช Bitrix24

ื‘ื•ืื• ื ื™ืฆื•ืจ ืฉื ื™ webhooks.

Webhook ื ื›ื ืก.

ืชื—ืช ื—ืฉื‘ื•ืŸ ื”ืžื ื”ืœ (ืขื ืžื–ื”ื” 1), ืขืงื•ื‘ ืื—ืจ ื”ื ืชื™ื‘: Applications -> Webhooks -> Add webhook -> Incoming webhook

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืžืœื ืืช ื”ืคืจืžื˜ืจื™ื ืฉืœ ื”-webhook ื”ื ื›ื ืก ื›ืžื• ื‘ืฆื™ืœื•ืžื™ ื”ืžืกืš:

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ื•ืœื—ืฅ ืขืœ ืฉืžื•ืจ.

ืœืื—ืจ ื”ืฉืžื™ืจื”, Bitrix24 ืชืกืคืง ืืช ื›ืชื•ื‘ืช ื”ืืชืจ ืฉืœ ื”-webhook ื”ื ื›ื ืก, ืœื“ื•ื’ืžื”:

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืฉืžื•ืจ ืืช ื”ื’ืจืกื” ืฉืœืš ืฉืœ ื›ืชื•ื‘ืช ื”ืืชืจ ืœืœื /profile/ ื”ืกื•ืคื™ - ื”ื™ื ืชืฉืžืฉ ื‘ืืคืœื™ืงืฆื™ื” ืœืขื‘ื•ื“ื” ืขื ืฉื™ื—ื•ืช ื ื›ื ืกื•ืช.

ื™ืฉ ืœื™ ืืช ื–ื” https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook ื™ื•ืฆื.

ื™ื™ืฉื•ืžื™ื -> Webhooks -> ื”ื•ืกืฃ webhook -> Webhook ื™ื•ืฆื

ื”ืคืจื˜ื™ื ืžื•ืคื™ืขื™ื ืฉื•ื‘ ื‘ืฆื™ืœื•ืžื™ ื”ืžืกืš:

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ืฉืžื•ืจ ื•ืงื‘ืœ ืืช ืงื•ื“ ื”ื”ืจืฉืื”

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ื™ืฉ ืœื™ ืืช ื–ื” xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. ืืชื” ื’ื ืฆืจื™ืš ืœื”ืขืชื™ืง ืืช ื–ื” ืœืขืฆืžืš; ืืชื” ืฆืจื™ืš ืืช ื–ื” ื›ื“ื™ ืœื‘ืฆืข ืฉื™ื—ื•ืช ื™ื•ืฆืื•ืช.

ื—ืฉื•ื‘!

ื™ืฉ ืœื”ื’ื“ื™ืจ ืชืขื•ื“ืช SSL ื‘ืฉืจืช Bitrix24 (ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘-letsencrypt), ืื—ืจืช ื”-API ืฉืœ Bitrix ืœื ื™ืขื‘ื•ื“. ืื ื™ืฉ ืœืš ื’ืจืกืช ืขื ืŸ, ืืœ ืชื“ืื’ - ื›ื‘ืจ ื™ืฉ ืœื” ssl.

ื—ืฉื•ื‘!

ื”ืฉื“ื” "ื›ืชื•ื‘ืช ืžืขื‘ื“" ื—ื™ื™ื‘ ืœื”ื›ื™ืœ ื›ืชื•ื‘ืช ื”ื ื’ื™ืฉื” ืžื”ืื™ื ื˜ืจื ื˜!

ื•ื›ืžื’ืข ืื—ืจื•ืŸ, ื‘ื•ืื• ื ืชืงื™ืŸ ืืช CallMeOut ืฉืœื ื• ื›ืืคืœื™ืงืฆื™ื” ืœื‘ื™ืฆื•ืข ืฉื™ื—ื•ืช (ื›ืš ืฉื›ืืฉืจ ืชืœื—ืฆื• ืขืœ ื”ืžืกืคืจ ื‘ืžืจื›ื–ื™ื™ื”, ื”ืคืงื•ื“ื” ืœื™ืฆื™ืจืช ื”ืฉื™ื—ื” ืชืขื•ืฃ ืžืฉื).

ื‘ืชืคืจื™ื˜, ื‘ื—ืจ: ืขื•ื“ -> ื˜ืœืคื•ื ื™ื” -> ืขื•ื“ -> ื”ื’ื“ืจื•ืช, ื”ื’ื“ืจ ื‘"ืžืกืคืจ ืฉื™ื—ื” ื™ื•ืฆืืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ" ื™ื™ืฉื•ื: CallMeOut ื•ืœื—ืฅ ืขืœ "ืฉืžื•ืจ"

ืื™ื ื˜ื’ืจืฆื™ื” ืฉืœ Asterisk ื•-Bitrix24

ื”ื’ื“ืจืช ื›ื•ื›ื‘ื™ืช

ืœืื™ื ื˜ืจืืงืฆื™ื” ืžื•ืฆืœื—ืช ื‘ื™ืŸ Asterisk ืœ-Bitrix24, ืขืœื™ื ื• ืœื”ื•ืกื™ืฃ ืืช ืžืฉืชืžืฉ AMI callme ืœ-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

ืœืื—ืจ ืžื›ืŸ, ื™ืฉ ื›ืžื” ื˜ืจื™ืงื™ื ืฉื™ื”ื™ื” ืฆื•ืจืš ืœื™ื™ืฉื ื‘ืืžืฆืขื•ืช dialplan (ืขื‘ื•ืจื ื• ื–ื” extensions.ael).

ืื ื™ ืืกืคืง ืืช ื›ืœ ื”ืงื•ื‘ืฅ, ื•ืื– ืืชืŸ ื”ืกื‘ืจ:

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

};

ื ืชื—ื™ืœ ืžื”ื”ืชื—ืœื”: ื”ื”ื ื—ื™ื” ื’ืœื•ื‘ืœ.

ืžืฉืชื ื” URLRECORDS ืžืื—ืกืŸ ืืช ื›ืชื•ื‘ืช ื”ืืชืจ ืœืงื‘ืฆื™ ื”ืงืœื˜ืช ื”ืฉื™ื—ื”, ืœืคื™ื” Bitrix24 ืชืžืฉื•ืš ืื•ืชื ืœื›ืจื˜ื™ืก ืื™ืฉ ื”ืงืฉืจ.

ื‘ืฉืœื‘ ื”ื‘ื ืื ื• ืžืชืขื ื™ื™ื ื™ื ื‘ืžืืงืจื• ื”ืžืืงืจื• ื”ืงืœื˜ื”.

ื›ืืŸ, ื‘ื ื•ืกืฃ ืœื”ืงืœื˜ืช ืฉื™ื—ื•ืช, ื ื’ื“ื™ืจ ืืช ื”ืžืฉืชื ื” ืฉื ืžืœื.

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

ื”ื•ื ืžืื—ืกืŸ ืืช ื›ืชื•ื‘ืช ื”ืืชืจ ื”ืžืœืื” ืœืงื•ื‘ืฅ ืกืคืฆื™ืคื™ (ื”ืžืืงืจื• ื ืงืจื ื‘ื›ืœ ืžืงื•ื).

ื‘ื•ืื• ื ื ืชื— ืืช ื”ืฉื™ื—ื” ื”ื™ื•ืฆืืช:

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

ื ื ื™ื— ืฉืื ื• ืžืชืงืฉืจื™ื ืœืžืกืคืจ 89991234567, ืงื•ื“ื ื›ืœ ื ื’ื™ืข ืœื›ืืŸ:

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

ื”ึธื”ึตืŸ. ืžืืงืจื• ื”ืงืœื˜ืช ื”ืฉื™ื—ื” ื ืงืจื ื•ื”ืžืฉืชื ื™ื ื”ื“ืจื•ืฉื™ื ืžื•ื’ื“ืจื™ื.

ื”ืžืฉืš

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

ืื ื• ืžืงืœื™ื˜ื™ื ืžื™ ื™ื–ื ืืช ื”ืฉื™ื—ื” ื•ืžืชืขื“ื™ื ืืช ืฉืขืช ืชื—ื™ืœืช ื”ืฉื™ื—ื”.

ื•ืขื ื”ืฉืœืžืชื•, ื‘ื”ืงืฉืจ ืžื™ื•ื—ื“ 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});
}

ื”ืฉื‘ืช ื›ื ื™ืกื” ืœื˜ื‘ืœืช CDR ืขื‘ื•ืจ ืฉืœื•ื—ื” ื–ื• (ืื™ืŸ ืฆื•ืจืš ืฉื), ืงื‘ืข ืืช ืฉืขืช ื”ืกื™ื•ื ืฉืœ ื”ืฉื™ื—ื”, ื—ืฉื‘ ืืช ืžืฉืš ื”ื–ืžืŸ, ืื ืชื•ืฆืืช ื”ืฉื™ื—ื” ืœื ื™ื“ื•ืขื” - ื”ื’ื“ืจ (ืžืฉืชื ื” CallMeDISPOSITION) ื•ื‘ืฉืœื‘ ื”ืื—ืจื•ืŸ, ืฉืœื— ื”ื›ืœ ืœ-Bitrix ื“ืจืš ืกืœืกื•ืœ ื”ืžืขืจื›ืช.

ื•ืขื•ื“ ืงืฆืช ืงืกื - ืฉื™ื—ื” ื ื›ื ืกืช:

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

ื›ืืŸ ืžืขื ื™ื™ืŸ ืื•ืชื ื• ืจืง ืฉื•ืจื” ืื—ืช.

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

ื”ื™ื ืื•ืžืจืช ืœืžืจื›ื–ื™ื™ื” ืœื”ืชืงื™ืŸ ื–ื™ื”ื•ื™ ืžืชืงืฉืจ (ืฉื) ืฉื•ื•ื” ืœืžืฉืชื ื” CallMeCallerIDName.

ื”ืžืฉืชื ื” CallMeCallerIDName ืขืฆืžื•, ื‘ืชื•ืจื•, ื ืงื‘ืข ืขืœ ื™ื“ื™ ืืคืœื™ืงืฆื™ื™ืช CallMe (ืื ืœ-Bitrix24 ื™ืฉ ืฉื ืžืœื ืœืžืกืคืจ ืฉืœ ื”ืžืชืงืฉืจ, ื”ื’ื“ืจ ืื•ืชื• ื‘ืชื•ืจ ื–ื™ื”ื•ื™ ืžืชืงืฉืจ (ืฉื), ืœื - ืœื ื ืขืฉื” ื›ืœื•ื).

ื”ื’ื“ืจืช ื”ืืคืœื™ืงืฆื™ื”

ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ื”ื™ื™ืฉื•ื - /var/www/pbx.vistep.ru/config.php

ืชื™ืื•ืจ ืคืจืžื˜ืจื™ ื™ื™ืฉื•ื:

  • CallMeDEBUG - ืื 1, ืื– ื›ืœ ื”ืื™ืจื•ืขื™ื ืฉืขื•ื‘ื“ื• ืขืœ ื™ื“ื™ ื”ืืคืœื™ืงืฆื™ื” ื™ื™ื›ืชื‘ื• ืœืงื•ื‘ืฅ ื”ื™ื•ืžืŸ, 0 - ืื ื—ื ื• ืœื ื›ื•ืชื‘ื™ื ื›ืœื•ื
  • ื˜ืง - SIP/PJSIP/IAX/ื•ื›ื•'
  • authToken โ€” ืืกื™ืžื•ืŸ ื”ืจืฉืื” ืฉืœ Bitrix24, ืงื•ื“ ื”ืจืฉืืช webhook ื™ื•ืฆื
  • bitrixApiUrl - ื›ืชื•ื‘ืช ื”ืืชืจ ืฉืœ ื”-webhook ื”ื ื›ื ืก, ืœืœื ืคืจื•ืคื™ืœ/
  • ื”ืจื—ื‘ื•ืช - ืจืฉื™ืžื” ืฉืœ ืžืกืคืจื™ื ื—ื™ืฆื•ื ื™ื™ื
  • ื”ืงืฉืจ - ื”ืงืฉืจ ืœื™ืฆื™ืจืช ืฉื™ื—ื”
  • ืคืกืง ื–ืžืŸ_ืžืื–ื™ืŸ - ืžื”ื™ืจื•ืช ืขื™ื‘ื•ื“ ื”ืื™ืจื•ืขื™ื ืžื›ื•ื›ื‘ื™ืช
  • ื›ื•ื›ื‘ื™ืช โ€” ืžืขืจืš ืขื ื”ื’ื“ืจื•ืช ืœื—ื™ื‘ื•ืจ ืœื›ื•ื›ื‘ื™ืช:
  • ื”ืžืืจื— - ip ืื• ืฉื ืžืืจื— ืฉืœ ืฉืจืช ื”ื›ื•ื›ื‘ื™ื•ืช
  • ืชื›ื ื™ืช - ื“ื™ืื’ืจืžืช ื—ื™ื‘ื•ืจ (tcp://, tls://)
  • ื ืžืœ - ื ืžืœ
  • ืฉื ืžืฉืชืžืฉ - ืฉื ืžืฉืชืžืฉ
  • ืกื•ื“ - ืกื™ืกืžื”
  • ืคืกืง ื–ืžืŸ connect_ - ืคืกืง ื–ืžืŸ ืœื—ื™ื‘ื•ืจ
  • ื”ืคืกืงืช ืงืจื™ืื” - ื”ืคืกืงืช ืงืจื™ืื”

ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืœื“ื•ื’ืžื”:

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

);

ื”ื’ื“ืจืช ืžืคืงื—

Supervisor ืžืฉืžืฉ ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ืชื”ืœื™ืš ื”ืžื˜ืคืœ ื‘ืื™ืจื•ืขื™ื ืž-Asterisk CallMeIn.php, ื”ืžื ื˜ืจ ืฉื™ื—ื•ืช ื ื›ื ืกื•ืช ื•ืžืงื™ื™ื ืื™ื ื˜ืจืืงืฆื™ื” ืขื Bitrix24 (ื”ืฆื’ ื›ืจื˜ื™ืก, ื”ืกืชืจ ื›ืจื˜ื™ืก ื•ื›ื•').

ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช ืฉื™ื™ื•ื•ืฆืจ:

/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

ื”ืคืขืœ ื•ื”ืคืขืœ ืžื—ื“ืฉ ืืช ื”ื™ื™ืฉื•ื:

supervisorctl start callme
supervisorctl restart callme

ื”ืฆื’ืช ืžืฆื‘ ื”ื”ืคืขืœื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื”:

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

ืžืกืงื ื”

ื”ืชื‘ืจืจ ืฉื–ื” ื“ื™ ืžืกื•ื‘ืš, ืื‘ืœ ืื ื™ ื‘ื˜ื•ื— ืฉืžื ื”ืœ ืžื ื•ืกื” ื™ื•ื›ืœ ืœื™ื™ืฉื ืืช ื–ื” ื•ืœืจืฆื•ืช ืืช ื”ืžืฉืชืžืฉื™ื ืฉืœื•.

ื›ืžื• ืฉื”ื•ื‘ื˜ื—, ืงื™ืฉื•ืจ ืœ-github.

ืฉืืœื•ืช, ื”ืฆืขื•ืช - ื ื ืœื”ืฉืื™ืจ ืื•ืชื ื‘ืชื’ื•ื‘ื•ืช. ื›ืžื• ื›ืŸ, ืื ืืชื ืžืขื•ื ื™ื™ื ื™ื ื›ื™ืฆื“ ืขื‘ืจ ื”ืคื™ืชื•ื— ืฉืœ ื”ืื™ื ื˜ื’ืจืฆื™ื” ื”ื–ื•, ื›ืชื‘ื•, ื•ื‘ืžืืžืจ ื”ื‘ื ืื ืกื” ืœื—ืฉื•ืฃ ื”ื›ืœ ื‘ื™ืชืจ ืคื™ืจื•ื˜.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”