ááœááºáááºáá±á«áºááœáẠIP-PBX Asterisk ááŸáá·áº CRM Bitrix24 áá±á«ááºážá
ááºááŒááºážá¡ááœáẠááá°áá®áá±á¬ááœá±ážáá»ááºá
áá¬áá»á¬áž ááŸááá±á¬áºáááºáž áá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºáá±ážááẠáá¯á¶ážááŒááºáá¬ážáá²ááŒá
áºáááºá
áá¯ááºáá±á¬ááºááá¯ááºá áœááºážá¡áá á¡áá¬á¡á¬ážáá¯á¶ážááẠá á¶ááŸá¯ááºážááŒá áºáááºá
- Bitrix24 ááŸá áá¯á¶ážá áœá²áá°ááá¯ááºážáá¶áá«ááºááŸáá·áº ááá·áºááºáá áºáá¯ááᯠááŸáááºááŒááºážááŒáá·áºá Asterisk ááẠáá¯á¶ážá áœá²áá°ááá¯ááºážáá¶áá«ááºááŸáá·áº ááá áºááŸáááºááŒááºážááá¯ááºá á¬áž á¡áá¯á¶ážááŒá¯áá°á á¡ááœááºážáá¶áá«ááºááᯠáá»áááºáááºáá±ážáá«áááºá Bitrix24 ááœááºá áá±á«áºááá¯ááŸá¯ááŸááºáááºážááᯠááŸááºáááºážáááºáá¬ážááŒá®ážá áá±á«áºááá¯ááŸá¯á¡áá¯á¶ážááœááºá á áá¬ážááá¯ááºážá á¡áá¶ááœááºážááŒááºážááᯠááœá²áá¯ááºáá«áááºá
- Asterisk ááẠááŒááºáá០áá±á«áºááá¯ááŸá¯ááᯠáááºáá¶áááŸáááẠ- Bitrix24 áá»ááºááŸá¬ááŒááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠá€áá±á«áºááá¯ááŸá¯áá±á¬ááºááŸááá¬ááá·áº áá¶áá«ááºááᯠáááºáááºážá¡á¬áž áá±á¬ááºáááºáááºááᯠááŒááá«áááºá
ááá¯ááá¯á·áá±á¬áá±á¬ááºáááºáááŸááá«áá áŠážáá±á¬ááºááŸá¯á¡áá áºáááºáá®ážáááºá¡ááœáẠáááºááá¯ááœáá·áºáá«áááºá
áá¯ááºážáá±á«áºááá¯ááŸá¯ááŒá®ážáááºááŸáá·áºáááŒáá¯ááºááẠáááºážááᯠáááºáá±á«áºááœáẠáááºáááºááŒá®áž á áá¬ážááá¯ááºážá á¡áá¶ááœááºážáá»ááºááᯠááœá²áá¯ááºáá«á
ááŒááºáá±á¬ááºááŸá¯á¡á±á¬ááºááœáẠá¡áá¬á¡á¬ážáá¯á¶ážááᯠáááºááá¯ááºááá¯ááºááŒááºáááºááŒá®áž ááá·áºá¡á¬áž github ááá¯á· ááá·áºááºáá
áºáá¯áá±ážááááºááᯠááŒá±á¬ááŒáá«ááẠ- áá¯ááºáá²á·á áá¯ááºáá²á·á áááºážááá¯áá°á á¡áá¯á¶ážááŒá¯áá«á
áá±áá¯áá»áá±á¬áºááŒáá»ááº
áá»áœááºá¯ááºááá¯á·ááá±á«ááºážá ááºážááŸá¯ááᯠCallMe áá¯áá±á«áºáááºá CallMe ááẠPHP ááŒáá·áº áá±ážáá¬ážáá¬ážáá±á¬ áá±ážáááºáá±á¬ áááºá¡ááºááá®áá±ážááŸááºážáá áºáá¯ááŒá áºáááºá
áááºážááá¬áá»á¬ážááŸáá·áº áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá
- PHP ááᯠââ5.6
PHP AMI á á¬ááŒáá·áºááá¯áẠ- áá±ážáá±ážááá¬
- Nginx + php-fpm
- ááŒá®ážááŒááºáá°
- AMI (Asterisk Manager Interface)
- Bitrix webhooks (ááá¯ážááŸááºážáá±á¬ REST API á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯)
ááŒáá¯áááºááŒááºáááºááŒááºážá
Asterisk áá«áá±á¬ áá¬áá¬ááœááºá áááºááẠáááºáá¬áᬠ(áá»áœááºá¯ááºááá¯á·á¡ááœáẠnginx+php-fpm)á ááŒá®ážááŒááºáá°ááŸáá·áº 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 ááᯠconfigure áá¯ááºááŒáá·áºáá¡á±á¬ááºá áá»áœááºáá±á¬áºááá¯á·áá²á· config ááŸá¬ áááºááŸááá«áááºá
/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;
}
}
config ááá¯ááœá²ááŒááºážá áááºááŒá¬ááŒááºážá áá¯á¶ááŒá¯á¶áá±ážááŒá¿áá¬áá»á¬ážá áááºááŸááºáááŸáááŒááºážááŸáá·áºáá±á¬ááºážáá«ážááá±á¬ááºá¡ááŒááºáááºááŸááááºáá¬áá¬ááá¯ááœá±ážáá»ááºááŒááºážááẠ- á€á¡ááŒá±á¬ááºážááá¯á¡áá»á¬ážááŒá®ážáá±ážááŒá®ážáá«ááŒá®á á¡ááá®áá±ážááŸááºážááœááºááá·áºáááºáá»ááºáá»á¬ážáááŸááá«á áááºážááẠhttp ááŸáá·áº https ááŸá áºáá¯áá¯á¶ážááœááºá¡áá¯ááºáá¯ááºáááºá
áá»áœááºá¯ááºááá¯á·ááẠhttps ááá¯á¡áá¯á¶ážááŒá¯áááºá áááºááŸááºááᯠá á¬ááŸááºáá¬ážááŒáá«á áá¯á·á
á¡á¬ážáá¯á¶ážááᯠááŸááºáááºá áœá¬ áá¯ááºáá±á¬ááºáá²á·áá»áŸáẠááá·áºááºááᯠááŸáááºááŒááºážááŒáá·áº á€áá²á·ááá¯á·áá±á¬ á¡áá¬áá»á¬ážááᯠááŒááºááœá±á·ááááºááŒá áºáááºá
Bitrix24 ááá¯ááŒááºáááºáááºááŸááºááŒááºáž
webhooks ááŸá áºáá¯áááºáá®ážááŒáá·áºáá¡á±á¬ááºá
áááºáá¬áá±á¬ webhooká
á á®áá¶ááá·áºááœá²áá°á¡áá±á¬áá·áº (id 1 áá«áá±á¬) á¡á±á¬ááºááœááºá á¡ááá®áá±ážááŸááºážáá»á¬áž -> Webhooks -> Add webhook -> Incoming webhook áááºážááŒá±á¬ááºážááᯠááá¯ááºáá¬áá«á
á
ááááºááŸá±á¬á·áá¯á¶áá»á¬ážááœááºáá²á·ááá¯á· áááºáá¬áá±á¬ webhook á áá±á¬ááºáá»á¬ážááᯠááŒáá·áºáá«á
Save ááá¯ááŸáááºáá«á
ááááºážáááºážááŒá®ážáá±á¬ááºá Bitrix24 ááẠáááºáá¬áá±á¬ webhook á URL ááᯠáá±ážáááá·áºáááºá á¥ááá¬-
áá±á¬ááºáá¯á¶áž /profile/ ááá«áá² áááºá URL áá¬ážááŸááºážááᯠááááºážáááºážáá« - á¡áááºáá±á«áºááá¯ááŸá¯áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠáááºážááᯠá¡ááá®áá±ážááŸááºážááœáẠá¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá
áá«á·ááŸá¬ áá®ááá¯ááŸááááºá https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
á¡ááœáẠwebhook á
Applications -> Webhooks -> Add webhook -> Outgoing webhook
á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáááºáá¬ážááŒááºáá¬ááºáá¯á¶áá»á¬ážááœáẠáááºáá¶áá±á¬áºááŒáá¬ážáááº-
ááœáá·áºááŒá¯áá»ááºáá¯ááºááᯠááááºážáááºážááŒá®áž áááºáá¶ááá°áá«á
áá«á·ááŸá¬ áá®ááá¯ááŸááááºá xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6
. áááºááá¯ááºááá¯ááºáááºáž áááºážááᯠáá°ážáá°ááẠááá¯á¡ááºááŒá®áž á¡ááœááºáá±á«áºááá¯ááŸá¯áá»á¬áž ááŒá¯áá¯ááºááẠááá¯á¡ááºáá«áááºá
á¡áá±ážááŒá®áž!
SSL á¡ááá¡ááŸááºááŒá¯áááºááŸááºááᯠBitrix24 áá¬áá¬ááœáẠááŒááºáááºáááºááŸááºáá¬ážááá«ááẠ(áááºááẠletsencrypt ááá¯áá¯á¶ážááá¯ááºáááº) ááá¯ááºáá«á Bitrix api á¡áá¯ááºááá¯ááºáá«á ááá·áºááœáẠcloud áá¬ážááŸááºážááŸááá«á á áááºááá°áá«ááŸáá·áº - áááºážááœáẠssl ááŸáááŒá®ážáá¬ážááŒá áºáááºá
á¡áá±ážááŒá®áž!
âáááá¯áááºáá¬ááááºá á¬â á¡ááœááºááœáẠá¡ááºáá¬áááºá០áááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá±á¬ ááááºá á¬áá áºáᯠáá«ááŸáááá«áááºá
áá±á¬ááºáá¯á¶ážááááœá±á·ááŸá¯á¡áá±ááŒáá·áºá áá¯ááºážáá±á«áºááá¯ááŸá¯á¡ááœáẠáá»áœááºá¯ááºááá¯á·á CallMeOut ááᯠá¡ááá®áá±ážááŸááºážáá áºáá¯á¡ááŒá Ạááá·áºááœááºážááá¯ááºááŒáá«á áá¯á· (ááá¯á·ááŸáᬠPBX áá±á«áºááŸá áá¶áá«ááºááᯠááŸáááºááá¯ááºáá±á¬á¡áá«á áá±á«áºááá¯ááŸá¯á¡á ááŒá¯ááá·áº á¡áááá·áºááẠáá±ážááœá¬ááœá¬ážáááá·áºáááº)á
áá®áá°ážááœááºá More -> áááºáá®áá¯ááºáž -> More -> áááºáááºáá»á¬ážá âáá¯á¶ááŸááºá¡ááœááºáá±á«áºááá¯ááŸá¯áá¶áá«ááºâ á¡ááºááºáá®áá±ážááŸááºážááœáẠáááºááŸááºáá«- CallMeOut ááá¯ááŸáááºááŒá®áž âSaveâ ááá¯ááŸáááºáá«á
ááá±ááœáá·áºááᯠá áá áºááá·áºááœááºážááŒááºážá
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});
}
};
á¡á ááŸá ááŒáá«á áá¯á·- ááœáŸááºááŒá¬ážáá»áẠááá¹áá¬áá¯á¶ážááá¯ááºáá¬.
Variable URL ááŸááºáááºážáá»á¬áž Bitrix24 ááẠáááºážááá¯á·ááᯠáááºááœááºáááºáááºáá²ááá¯á· ááœá²áá°áááºááŸáá·áºá¡áá® URL ááᯠá áá¬ážááá¯ááºážááŸááºáááºážáááºááá¯ááºáá»á¬ážááœáẠááááºážáááºážáá¬ážáááºá
áá±á¬ááºáá áºáá¯ááá±á¬á· macro macro ááᯠá áááºáááºá á¬ážáááºá á¡áá¶ááœááºážáá»ááº.
á€ááœááºá á áá¬ážááá¯ááºážáá»á¬ážááᯠááŸááºáááºážáááºááŒááºážá¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠááááºážááŸááºááᯠáááºááŸááºáá«áááºá FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
áááºážááẠURL á¡ááŒáá·áºá¡á á¯á¶ááᯠáá®ážááŒá¬ážááá¯ááºáá áºáá¯ááá¯á· ááááºážáááºážáá¬ážáá«ááẠ(áááºáááá¯ááᯠáá±áá¬ááá¯ááºážááœáẠáá±á«áºáááº)á
á¡ááœááºáá±á«áºááá¯ááŸá¯ááᯠááá¯ááºážááŒá¬ážá áááºááŒá¬ááŒáá·áºááŒáá«á áá¯á·á
_. => {
&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 ááá¬ážááá¯á· áááºáá±á¬ááºááŸá¯ááᯠááááºáá« (ááá¯áá±áá¬ááœáẠáááá¯á¡ááºáá«)á áá±á«áºááá¯ááŸá¯á á¡áá¯á¶ážá¡áá»áááºááᯠáááºááŸááºáá«á áá±á«áºááá¯ááŸá¯áááááºááᯠááááá«á ááŒá¬áá»áááºááᯠááœááºáá»ááºáá« - áááºááŸááºáá« (ááŒá±á¬ááºážáá²ááá¯ááºááẠáá±á«áºááá¯áá«) ááŸáá·áº áá±á¬ááºáá¯á¶ážá¡ááá·áºá system curl ááŸáááá·áº á¡áá¬á¡á¬ážáá¯á¶ážááᯠ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());
áá°á PBX ááᯠinstall áá¯ááºáááºááŒá±á¬ááẠáá±á«áºááá¯áá° ID(á¡áááº) variable áá²á· áá®áááºá CallMeCallerIDName.
CallMeCallerIDName ááá¯ááºááá¯ááºááŒá±á¬ááºážáá²ááá¯ááºáá±á¬á¡ááŸáá·áºá¡ááŒá±á¬ááºážááᯠCallMe á¡ááá®áá±ážááŸááºážááŸáááºááŸááºáá¬ážáá«ááẠ(Bitrix24 ááœááºáá±á«áºááá¯áá°ááá¶áá«ááºá¡ááœááºá¡áááºá¡ááŒáá·áºá¡á á¯á¶ááŸááá«ááááºážááá¯áááºááŸááºáá«á áá±á«áºááá¯áá° ID(á¡áááº)ááá¯ááºáá°áž - áá«ááá¯á· áá¬ááŸáá¯ááºááŸá¬ááá¯ááºáá°ážá)
áá»áŸá±á¬ááºááœáŸá¬ááᯠáááºááŸááºááŒááºážá
áá»áŸá±á¬ááºááœáŸá¬áááºáááºááá¯áẠ- /var/www/pbx.vistep.ru/config.php
á¡ááá®áá±ážááŸááºáž ááá·áºáááºáá»ááºáá»á¬ážá áá±á¬áºááŒáá»ááº-
- áá¯ááºážáááºáMeDEBUG â á¡áááºá 1á á¡áááºá á¡ááá®áá±ážááŸááºážá០áá¯ááºáá±á¬ááºáá²á·áá±á¬ ááŒá áºáááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááŸááºáááºážááá¯ááºááœáẠáá±ážááŸááºáá¬ážáááá·áºáááºá 0 â áá»áœááºá¯ááºááá¯á· áá¬á០ááá±ážáá¬ážáá«á
- áááºážááᬠ- SIP/PJSIP/IAX/á áááºááŒáá·áº
- authToken - Bitrix24 ááœáá·áºááŒá¯áá»ááºááá¯áááºá ááœááºáá±áá±á¬ webhook ááœáá·áºááŒá¯áá»ááºáá¯ááº
- bitrixApiUrl â áááá¯ááá¯ááºážááá«áá² áááºáá¬áá±á¬ webhook á URL
- ááá¯ážáá»á²á·ááŸá¯áá»á¬áž - ááŒááºááá¶áá«ááºáá»á¬ážá á¬áááºáž
- á áá¬ážá áẠ- áá±á«áºááá¯ááŸá¯áá áºáá¯á áááºááŒááºážá¡ááœáẠá¡ááŒá±á¬ááºážá¡áá¬
- áá¬ážáá±á¬ááºáá°_á¡áá»áááºáá¯áẠ- ááá±ááœáá·áºá០ááŒá áºáááºáá¯ááºáá±á¬ááºááŒááºážá á¡ááŒááºááŸá¯ááºáž
- ááŒááºááŸáẠâ ááá±ááœáá·áºááá¯á·áá»áááºáááºáááºá¡ááœáẠáááºáááºáá»á¬ážáá«ááŸááá±á¬ array áá áºáá¯-
- á¡áááºááŸáẠâ ááá±ááœáá·áºáá¬áá¬á ip ááá¯á·ááá¯áẠhost á¡áááº
- á¡á á®á¡á áẠâ áá»áááºáááºááŸá¯ áá¯á¶ááŒááºáž (tcp://á tls://)
- ááááºáááºáž - ááááºáááºáž
- á¡áá¯á¶ážááŒá¯áá°á¡ááẠ- á¡áá¯á¶ážááŒá¯áá°á¡áááº
- áá»áŸáá¯á·ááŸááºáá»áẠ- á áá¬ážááŸááº
- áá»áááºáááº_á¡áá»áááºáá¯ááºááŒááºážá - áá»áááºáááºááŸá¯á¡áá»áááºáá¯ááºááœá¬ážáááºá
- read_timeout - á¡áá»áááºááœááºáááºáá«á
á¥ááᬠáááºáááºááá¯ááº
<?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
);
ááŒá®ážááŒááºáá±ážááŸá°áž á áá áºááá·áºááœááºážááŒááºážá
ááŒá®ážááŒááºáá°ááᯠAsterisk CallMeIn.php á០event handler áá¯ááºáááºážá ááºááᯠá áááºáááºá¡ááœáẠá¡áá¯á¶ážááŒá¯ááŒá®áž á¡áááºáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºáᬠ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
áá±á¬ááºáá»ááº
á¡áá±á¬áºáá±áž ááŸá¯ááºááœá±ážááœá¬ážáá±ááá·áº á¡ááœá±á·á¡ááŒá¯á¶ááŸááá²á· á á®áá¶ááá·áºááœá²áá°áá áºáŠážá áááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºááŒá®áž áá°á·áá²á·á¡áá¯á¶ážááŒá¯áá°ááœá±ááᯠááŸá áºáááºááŸá¬ áá±áá»á¬áá«áááºá
áááá¡ááá¯ááºážá
áá±ážááœááºážáá»á¬ážá á¡ááŒá¶ááŒá¯áá»ááºáá»á¬áž - áááºážááá¯á·ááᯠááŸááºáá»ááºáá»á¬ážááœáẠáá»ááºáá¬ážáá²á·áá«á ááá¯á·á¡ááŒááºá á€áá±á«ááºážá
ááºááŸá¯áááá¯ážáááºááŸá¯ááá¯áááºá
áááºáááºá
á¬ážáá«áá áá±ážáá«á áá±á¬ááºáá±á¬ááºážáá«ážááœááºá¡áá¬á¡á¬ážáá¯á¶ážááá¯á¡áá±ážá
áááºáá±á¬áºááŒáááºááŒáá¯ážá
á¬ážáá«áááºá
source: www.habr.com