
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
