
Võrgus on erinevaid võimalusi IP-ATSi Asterisk ja CRM Bitrix24 integreerimiseks, kuid me otsustasime siiski kirjutada oma.
Funktsionaalsus on kõik standardne:
- Klõpsates Bitrix24 kliendi telefoninumbri lingil, ühendab Asterisk sisemise numbri kasutajalt, kelle nimel klikk juuri, kliendi telefoninumbriga. Bitrix24-s salvestatakse kõne protokoll ja kõne lõppedes tõmmatakse sisse kõne salvestus.
- Asteriskile tuleb väliskõne - Bitrix24 liideses näitame selle töötaja kliendi kaarti, kelle numbrile see kõne tuleb.
Kui sellist klienti pole, avame uue liidi loomise kaardi.
Niipea kui kõne on lõpetatud, peegeldame seda kaardil ja tõmbame sisse kõne salvestuse.
Allpool räägin, kuidas seda enda juures seadistada ja jagan linki github'i - jah, jah, võtke ja kasutage!
Üldine kirjeldus
Oma integreerimist nimetame CallMe. CallMe on väike veebirakendus, mis on kirjutatud PHP-s.
Kasutatavad tehnoloogiad ja teenused
- PHP 5.6
- Composer
- Nginx + php-fpm
- supervisor
- AMI (Asterisk Manager Interface)
- Bitrixi veebihooked (lihtsustatud REST API rakendus)
Eelseade
Asteriskiga serverisse tuleb installida veebiserver (meil on see nginx+php-fpm), supervisor ja git.
Installeerimisna - CentOS:
yum install nginx php-fpm supervisor gitLiigume veebiserverile juurdepääsetavasse katalooge, tõmbame gitist rakenduse ja seadistame kaustale vajalikud õigused:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Seejärel seadistame nginx'i, 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; # скрытые файлы
}
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;
}
}
Konfiguratsiooni analüüs, turvaküsimused, sertifikaadi hankimine ja isegi veebiserveri valik jääb artikli raames arutlemata — sellest on juba palju kirjutatud. Rakendusel ei ole piiranguid, see töötab nii http kui https protokolliga.
Meil on https, let’s encrypt sertifikaat.
Kui olete kõik õigesti teinud, siis klõpsates lingile peaksite nägema midagi sellist

Bitrix24 seadistamine
Loome kaks veebihooki.
Sisenev veebihook.
Administraatori kontoga (id 1) liikuge järgmise tee järgi: Rakendused -> Veebihookid -> Lisa veebihook -> Sisenev veebihook

Täidame siseneva veebihoki parameetrid nagu ekraanipiltidel:


Ja vajutame salvesta.
Pärast salvestamist annab Bitrix24 teile siseneva veebihoki URL-i, näiteks:

Salvestage oma variant URL-ist ilma lõpp-partii /profile/ — seda kasutatakse rakenduses sisenevate kõnede jaoks.
Mul on see https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Väljuv veebihook.
Rakendused -> Veebihookid -> Lisa veebihook -> Väljuv veebihook
Üksikasjad taas ekraanipiltidel:


Salvestame ja saame autoriseerimise koodi

Mul on see xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. See tuleb samuti kopeerida, see on vajalik väljuvate kõnede tegemiseks.
Oluline!
Bitrix24 server must have an SSL certificate configured (you can use Let's Encrypt), otherwise the Bitrix API will not work. If you have a cloud version, you don't need to worry — it already has SSL.
Oluline!
In the 'Handler Address' field, you must specify an address accessible from the Internet!
As a final touch, we will set up our CallMeOut as an application for making calls (so that when clicking on a number, a command will be sent to the PBX for call origination).
In the menu, select: More -> Telephony -> More -> Settings, set 'Default Outgoing Call Number' to Application: CallMeOut and click 'Save'.

Configuring Asterisk
For successful interaction between Asterisk and Bitrix24, we need to add the AMI user callme in 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
Next, there are a few tricks that will need to be implemented through the dialplan (in our case, this is extensions.ael).
Here is the entire file, and I will provide explanations afterwards:
globals {
WAV=\/var\/www\/pbx.vistep.ru\/callme\/records\/wav; \/\/Ajutatud kataloog WAV jaoks
MP3=\/var\/www\/pbx.vistep.ru\/callme\/records\/mp3; \/\/Kuhu mp3 failid üles laadida
URLRECORDS=https:\/\/pbx.vistep.ru\/callme\/records\/mp3;
RECORDING=1; \/\/ Salvestamine, 1 - sisse.
};
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()); \/\/ määrame CallerID, kui õppisime selle Bitrix24-st
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 juba seadistatud ===));
}
}
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 hoiab endas URL-i suhtlemise salvestuste failidele, mille kaudu Bitrix24 need kontaktikaardile tõmbab.
Edasi on meie jaoks huvitav makro recording.
Siin, lisaks kõnede salvestamisele, seadistame muutuja FullFname.
Set(FullFname=${URLRECORDS}\/${datedir}\/${fname}.mp3);See hoiab konkreetsest failist täis-URL-i (makrot kutsutakse igal pool).
Analüüsime väljaminevat 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});
}
Kui me helistame numbrile 89991234567, jõuame esmakordselt siia:
&recording(${CALLERID(number)},${EXTEN});st. kutsub esile kõne salvestamise makro ja seadistab vajalikud muutujad.
Edasi
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
salvestame, kes kõne algatas, ja fikseerime kõne alguse aja.
Ja pärast selle lõpetamist, eraldi kontekstis 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});
}
väljastame CDR tabelisse salvestamise, selle laienemine ei ole vajalik, seadistame kõne lõpuaega, arvutame kestuse, kui kõne tulemus ei ole teada — seadistame (muutuja CallMeDISPOSITION) ja viimasena saadame kõik Bitrixi süsteemi kaudu curl.
Ja veel veidi magia — sisenev kõne:
888999 => {
&recording(${CALLERID(number)},${EXTEN});
Answer();
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp()); // määrame CallerID, kui saime selle Bitrix24-st
Set(CallStart=${STRFTIME(epoch,,%s)}); // alustame kõne ajakulu
Queue(Q1,tT);
Set(CallMeDISPOSITION=${CDR(disposition)});
Hangup();
}
Siin on meid huvitav ainult üks rida.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());See ütleb PBX-ile seadistada CallerID(name) võrdseks muutuja CallMeCallerIDName.
Isegi muutujat CallMeCallerIDName seadistab CallMe rakendus (kui Bitrix24-s on helistaja nimi, seame selle CallerID(name), kui mitte — siis ei tee me midagi).
Rakenduse seadistamine
Rakenduse seadete fail — /var/www/pbx.vistep.ru/config.php
Rakenduse parameetrite kirjeldus:
- CallMeDEBUG — kui 1, siis logifaili kirjutatakse kõik rakenduse töötlemise sündmused, 0 — ei kirjuta midagi
- tech — SIP/PJSIP/IAX/jne
- authToken — Bitrix24 autoriseerimistoken, väljamineva webhook'i autoriseerimise kood
- bitrixApiUrl — sissetuleva webhook'i URL, ilma profilita/
- extentions — välistenumbrite loend
- context — kontekst kõne algatamiseks
- listener_timeout — Asterisk' sündmuste töötlemise kiirus
- asterisk — massiiv Asterisk' ühendussete jaoks:
- host — Asterisk serveri IP või hostinimi
- scheme — ühenduse skeem (tcp://, tls://)
- port — port
- username — kasutajanimi
- secret — parool
- connect_timeout — ühenduse ajaületus
- read_timeout — lugemise ajaületus
näidis konfiguratsioonifailist:
1, // logis debug-õnumid: 1 - kirjutame, 0 - ei kirjuta
'tech' => 'SIP',
'authToken' => 'xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6', // Bitrix' autoriseerimistoken
'bitrixApiUrl' => 'https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/', // URL Bitrix API-ile (sissetulev webhook)
'extentions' => array('888999'), // välistenumbrid, koma abil
'context' => 'dial_out', // kõne algatamiseks väljaminev kontekst
'asterisk' => array( // Asterisk' ühenduse seadistused
'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' sündmuste töötlemise kiirus
);Superviseeri seadistamine
Supervisor käivitab sündmuste töötlemise protsessi CallMeIn.php Asterisk'ilt, mis jälgib sissetulevaid kõnesid ja suudab suhelda Bitrix24'ga (näidata kaarti, varjata kaarti jne).
Konfiguratsioonifail, mille peate looma:
/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 RUNNING pid 11729, uptime 17 days, 16:58:07Kokkuvõte
See tundub piisavalt keeruline, kuid olen kindel, et kogenud administraator suudab selle ellu viia ja oma kasutajaid rahuldada.
Kuidas lubasime, .
Küsimused, soovitused - palun kirjutage kommentaaridesse. Kui teid huvitab, kuidas selle integratsiooni arendamine käis, andke teada, järgmises artiklis püüan kõike üksikasjalikumalt käsitleda.
Allikas: habr.com
