
Internetis on erinevaid vÔimalusi IP-ATSi Asterisk ja CRM Bitrix24 integreerimiseks, kuid otsustasime siiski kirjutada oma lahenduse.
Funktsionaalsus on standardne:
- KlĂ”psates Bitrix24 kliendi telefoninumbri lingile, ĂŒhendab Asterisk kasutaja sisemise numbri, kelle nimel see klikk tehti, kliendi telefoninumbriga. Bitrix24-s fikseeritakse kĂ”ne registreerimine ja kĂ”ne lĂ”ppedes tĂ”mmatakse kĂ”ne salvestus.
- Asteriskile tuleb vĂ€liskĂ”ne â Bitrix24 liideses nĂ€itame klientide kaarti sellele töötajale, kellele kĂ”ne suunati.
Kui sellist klienti ei ole, avame uue juhtumi kaardi.
Kuna kÔne on lÔpetatud, kajastame seda kaardil ja tÔmbame kÔne salvestuse.
Allpool rÀÀgin, kuidas kĂ”ik enda juures seadistada ja jagan lingi githubi â jah, jah, vĂ”tke ja kasutage!
Ăldine kirjeldus
Oma integreerimist oleme nimetanud CallMe. CallMe on vÀike veebirakendus, mis on kirjutatud PHP-s.
Kasutatud tehnoloogiad ja teenused
- PHP 5.6
- Composer
- Nginx + php-fpm
- supervisor
- AMI (Asterisk Manager Interface)
- Bitrixi veebihooked (lihtsustatud REST API rakendus)
EelsÀttimine
Asteriskiga serverisse tuleb installida veebiserver (meie puhul nginx+php-fpm), supervisor ja git.
Installeerimise kÀsk (CentOS):
yum install nginx php-fpm supervisor gitLiigume katalooge, mis on veebiserverile juurdepÀÀsetavad, tÔmbame git'ist rakenduse ja seadistame vajalikud Ôigused kaustale:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
JĂ€tkame nginx'i seadistamisega, meie konfiguratsioon asub
/etc/nginx/conf.d/pbx.vistep.ru.confserver {
server_name www.pbx.vistep.ee pbx.vistep.ee;
listen *:80;
rewrite ^ https://pbx.vistep.ee$request_uri? permanent;
}
server {
# listen *:80;
# server_name pbx.vistep.ee;
access_log /var/log/nginx/pbx.vistep.ee.access.log main;
error_log /var/log/nginx/pbx.vistep.ee.error.log;
listen 443 ssl http2;
server_name pbx.vistep.ee;
resolver 8.8.8.8;
ssl_stapling on;
ssl on;
ssl_certificate /etc/letsencrypt/live/pbx.vistep.ee/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pbx.vistep.ee/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; # keelatud peidetud failid
}
location ~* /(?:uploads|files)/.*.php$ {
deny all; # keelatud ĂŒleslaaditud skriptid
}
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; # staatilise sisu vahemÀlu
}
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;
}
}
Konfiguratsiooni analĂŒĂŒs, turvakĂŒsimused, sertifikaadi saamine ja isegi veebiserveri valik jÀÀvad artiklist vĂ€lja â sellest on palju kirjutatud. Rakendusel ei ole piiranguid, see töötab nii http kui ka https.
Meil on https, Let's Encrypt sertifikaat.
Kui olete kÔik Ôigesti teinud, siis peaksite lingile minnes nÀgema midagi sarnast.

Bitrix24 seadistamine
Loome kaks veebihaki.
Sissetulev veebihakk.
Administratiivse konto alla (id 1) lÀheme jÀrgmist teed: Rakendused -> Veebihakid -> Lisa veebihakk -> Sissetulev veebihakk.

TĂ€idame sissetuleva veebihaki parameetrid nagu ekraanipiltidel:


Ja vajutame salvesta.
PÀrast salvestamist annab Bitrix24 sissetuleva veebihaki URL-i, nÀiteks:

Salvestage oma versioon URL-ist ilma lĂ”pposa /profile/ â seda kasutatakse rakenduses sissetulevate kĂ”nede haldamiseks.
Minu URL on https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
VĂ€ljuv veebihakk.
Rakendused -> Veebihakid -> Lisa veebihakk -> VĂ€ljuv veebihakk.
Kordame ĂŒksikasju ekraanipiltidel:


Salvestame ja saame autoriseerimiskoodi.

Minu URL on xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Selle peaksite samuti endale kopeerima, seda on vaja vÀljuvate kÔnede tegemiseks.
Oluline!
Bitrix24 serveril peab olema seadistatud ssl-sertifikaat (vĂ”ite kasutada letsencrypt'i), vastasel juhul ei tööta Bitrix API. Kui teil on pilveversioon, siis ei pea te muretsema â seal on juba ssl olemas.
Oluline!
VĂ€ljale âKĂ€sitleja aadressâ peab olema mĂ€rgitud internetist ligipÀÀsetav aadress!
Ja viimasena seadistame meie CallMeOut'i rakenduseks helistamiseks (et klÔpsates numbril saadetaks telefonivÔrku kÀsk kÔne originaadorimiseks).
Valige menĂŒĂŒs: Veel -> Telefoniteenused -> Veel -> Seaded, seada âVaikimisi vĂ€ljakutse numberâ Rakenduseks: CallMeOut ja vajutage âSalvestaâ.

Asterisk seadistus
Asterisk'i ja Bitrix24 edukaks koostööks peame lisama AMI-kasutaja callme faili 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
SeejÀrel on mitmeid nippe, mida on vaja rakendada dialplani kaudu (meil on see extensions.ael).
TÔin vÀlja kogu faili, ja hiljem annan selgitused:
globals {
WAV=/var/www/pbx.vistep.ru/callme/records/wav; //Ajutine kataloog WAV failidele
MP3=/var/www/pbx.vistep.ru/callme/records/mp3; //Siia laaditakse mp3 faile
URLRECORDS=https://pbx.vistep.ru/callme/records/mp3;
RECORDING=1; // Salvestamine, 1 - sisse lĂŒlitatud.
};
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()); // seame CallerID, kui teada Bitrix24 kaudu
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});
}
};
Alustame algusest: direktiiv globals.
Muutuja URLRECORDS salvestab URL-i kÔnefailide jaoks, mille kaudu Bitrix24 toob need kontaktikaardile.
SeejÀrel on meil huvi makro " recording.
Siin, peale kÔnede salvestamise, mÀÀrame muutujaks FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);See salvestab konkreetse faili tĂ€is-URL-i (makrot kutsutakse igal pool ĂŒles).
Vaatame vÀljakuulutatud kÔnet:
_. => {
&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});
}
Oletame, et helistame numbrile 89991234567, kÔigepealt jÔuame siia:
&recording(${CALLERID(number)},${EXTEN});st. kÀivitatakse kÔne salvestamise makro ja seadistatakse vajalikud muutujad.
SeejÀrel
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
salvestame, kes helistab ja fikseerime kÔne algusaja.
Ja lÔpetamisel, eritingimustes 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});
}
lĂŒlitame selle ekstensi jaoks CDR-i tabelisse salvestamise vĂ€lja (see pole seal vajalik), seame kĂ”ne lĂ”petamise aja, arvutame kestuse, kui kĂ”ne tulemus ei ole teada â paneme (muutuja CallMeDISPOSITION) ja viimasena saadame kĂ”ik Bitrixi kaudu sĂŒsteemse curl.
Ja veel natuke maagiat â sissetulev kĂ”ne:
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // seame CallerID, kui saime selle Bitrix24-st
Set(CallStart=${STRFTIME(epoch,,%s)}); // alustame kÔne aja arvestust
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
Siin huvitab meid ainult ĂŒks rida.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());See ĂŒtleb ATS-ile seada CallerID(name) vĂ”rdseks muutuja CallMeCallerIDName.
Muutuja CallMeCallerIDName, omakorda, seadistatakse rakenduse CallMe poolt (kui Bitrix24-is on helistajale mÀÀratud nimi, seadistame selle CallerID(name), kui ei, siis ei tegele selle kĂŒsimusega).
Rakenduse seadistamine
Rakenduse seadete fail â /var/www/pbx.vistep.ru/config.php
Rakenduse parameetrite selgitus:
- CallMeDEBUG â kui 1, siis kirjutatakse logifaili kĂ”ik sĂŒndmused, mida rakendus töötleb, 0 â midagi ei kirjuta
- tech â SIP/PJSIP/IAX/ jne
- authToken â Bitrix24 autoriseerimise token, vĂ€ljuva veebirakenduse autoriseerimise kood
- bitrixApiUrl â sissetuleva veebirakenduse URL, ilma profile/
- extentions â vĂ€liste numbrite loend
- context â kontekst kĂ”ne algatamiseks
- listener_timeout â sĂŒndmuste töötlemise kiirus asteriskilt
- asterisk â massiiv seadistustega ĂŒhendamiseks asteriskiga:
- host â asteriski serveri IP vĂ”i hostname
- scheme â ĂŒhendusskeem (tcp://, tls://)
- port â port
- username â kasutajanimi
- salajane â parool
- connect_timeout â ĂŒhenduse ajutine katkestus
- read_timeout â lugemise ajutine katkestus
seadete faili nÀide:
1, // debug messages in the log: 1 - write, 0 - do not write
'tech' => 'SIP',
'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', // Bitrix authorization token
'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', // URL to Bitrix API (incoming webhook)
'extentions' => array('888999'), // list of external numbers, separated by commas
'context' => 'dial_out', // outgoing context for call origination
'asterisk' => array( // settings for connecting to Asterisk
'host' => '10.100.111.249',
'scheme' => 'tcp://',
'port' => 5038,
'username' => 'callme',
'secret' => 'JD3clEB8_f23r-3ry84gJ',
'connect_timeout' => 10000,
'read_timeout' => 10000
),
'listener_timeout' => 300, // event processing speed from Asterisk
);Supervisor seadistus
Supervisor kasutab Asterisk CallMeIn.php sĂŒndmuste töötlemise protsessi kĂ€ivitamiseks, mis jĂ€lgib sissetulevaid kĂ”nesid ja suhelda Bitrix24-ga (nĂ€idata kaarti, peita kaarti jne).
Tuleb luua seadistuse fail:
/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.logRakenduse kÀivitamine ja taaskÀivitamine:
supervisorctl start callme
supervisorctl restart callmerakenduse töö staatuse vaatamine:
supervisorctl status callme
callme TĂĂTAB pid 11729, tööaeg 17 pĂ€eva, 16:58:07KokkuvĂ”te
See osutus piisavalt keeruliseks, kuid olen kindel, et kogenud administraator suudab selle enda jaoks rakendada ja oma kasutajaid rÔÔmustada.
Nagu lubatud, .
KĂŒsimused, soovitused â ootan kommentaaridesse. Samuti, kui teid huvitab, kuidas selle integratsiooni arendamine kĂ€is, kirjutage, ja jĂ€rgmises artiklis pĂŒĂŒan kĂ”ike ĂŒksikasjalikumalt avada.
Allikas: habr.com
