IP-PBX Asterisk eta CRM Bitrix24 sarean integratzeko aukera desberdinak daude, baina hala ere gurea idaztea erabaki dugu.
Funtzionalitateari dagokionez, dena estandarra da:
- Bitrix24-n bezero baten telefono-zenbakia duen estekan klik eginez, Asterisk-ek klika egin den erabiltzailearen barne-zenbakia bezeroaren telefono-zenbakiarekin lotzen du. Bitrix24-n, deiaren erregistroa grabatzen da eta, deia amaitzean, elkarrizketaren grabazioa ateratzen da.
- Asterisk-ek kanpotik dei bat jasotzen du - Bitrix24 interfazean bezero-txartela erakusten diogu dei hori heldu zaion langileari.
Horrelako bezerorik ez badago, bezerogai berri bat sortzeko txartela irekiko dugu.
Deia amaitu bezain laster, hori txartelean islatzen dugu eta elkarrizketaren grabazio bat ateratzen dugu.
Ebakiaren azpian dena nola konfiguratu eta github-erako esteka bat emango dizut esango dizut - bai, bai, hartu eta erabili!
Deskribapen orokorra
Gure integrazioa CallMe deitu genuen. CallMe PHPn idatzitako web aplikazio txiki bat da.
Erabilitako teknologiak eta zerbitzuak
- PHP 5.6
PHP AMI liburutegia - Composer
- Nginx + php-fpm
- ikuskatzaile
- AMI (Asterisk Manager Interface)
- Bitrix webhook (REST APIaren ezarpen sinplifikatua)
Aurrez ezartzea
Asterisk duen zerbitzari batean, web zerbitzari bat instalatu behar duzu (guretzat nginx+php-fpm da), gainbegiratzailea eta git.
Instalazio komandoa (CentOS):
yum install nginx php-fpm supervisor git
Web zerbitzarirako sarbidea duen direktoriora joango gara, Git-etik aplikazioa atera eta karpetan beharrezko eskubideak ezarriko ditugu:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Ondoren, konfigura dezagun nginx, gure konfigurazioa bertan dago
/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;
}
}
Konfigurazioa aztertzen utziko dut, segurtasun-arazoak, ziurtagiria eskuratzea eta baita artikuluaren esparrutik kanpo web zerbitzari bat aukeratzea ere - asko idatzi da honi buruz. Aplikazioak ez du mugarik, http eta https-ren bidez funtzionatzen du.
https erabiltzen dugu, zifra dezagun ziurtagiria.
Dena ondo egin baduzu, estekan klik eginez gero, horrelako zerbait ikusi beharko zenuke
Bitrix24 konfiguratzea
Sor ditzagun bi webhook.
Sarrerako webhook.
Administratzailearen kontuaren azpian (1 IDarekin), jarraitu bidea: Aplikazioak -> Webhook -> Gehitu webhook -> Sarrerako webhook
Bete sarrerako webhook-aren parametroak pantaila-argazkietan bezala:
Eta egin klik gorde.
Gorde ondoren, Bitrix24-k sarrerako webhook-aren URLa emango du, adibidez:
Gorde URLaren bertsioa azken /profile/ gabe - aplikazioan erabiliko da sarrerako deiekin lan egiteko.
Hau daukat https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Irteerako webhook.
Aplikazioak -> Webhook -> Gehitu webhook -> Irteerako webhook
Xehetasunak berriro pantaila-argazkietan daude:
Gorde eta jaso baimen-kodea
Hau daukat xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6
. Zuk ere kopiatu behar duzu; irteerako deiak egiteko behar duzu.
Garrantzitsua da!
Bitrix24 zerbitzarian SSL ziurtagiria konfiguratu behar da (letsencrypt erabil dezakezu), bestela Bitrix apiak ez du funtzionatuko. Hodeiko bertsioa baduzu, ez kezkatu - dagoeneko ssl du.
Garrantzitsua da!
"Prozesadorearen helbidea" eremuak Internetetik eskura daitekeen helbide bat izan behar du!
Eta azken ukitu gisa, instala ditzagun gure CallMeOut deiak egiteko aplikazio gisa (horrela PBXko zenbakian klik egiten duzunean, deia sortzeko komandoak ihes egingo du).
Menuan, hautatu: Gehiago -> Telefonia -> Gehiago -> Ezarpenak, ezarri "Irteerako dei-zenbaki lehenetsia" Aplikazioa: CallMeOut eta sakatu "Gorde"
Izartxoa konfiguratzen
Asterisk eta Bitrix24-ren arteko elkarrekintza arrakastatsua izateko, AMI erabiltzailea callme gehitu behar dugu manager.conf-era:
[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
Ondoren, dialplan bidez ezarri beharko diren hainbat trikimailu daude (guretzat hau extensions.ael da).
Fitxategi osoa emango dut, eta ondoren azalpen bat emango dut:
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});
}
};
Has gaitezen hasieratik: zuzentaraua Globalak.
Aldakorra URLERREGISTROAK URLa elkarrizketak grabatzeko fitxategietan gordetzen du, eta, horren arabera, Bitrix24-k kontaktu-txartelera eramango ditu.
Ondoren makro makroa interesatzen zaigu Grabaketa.
Hemen, elkarrizketak grabatzeaz gain, aldagaia ezarriko dugu FullFname.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
URL osoa fitxategi zehatz batean gordetzen du (makroa nonahi deitzen da).
Azter dezagun irteerako deia:
_. => {
&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});
}
Demagun 89991234567 telefonora deitzen dugula, lehenik eta behin hona iristen garela:
&recording(${CALLERID(number)},${EXTEN});
horiek. Elkarrizketa grabatzeko makroari deitzen zaio eta beharrezko aldagaiak ezartzen dira.
Gehiago
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Deia nork hasi duen grabatzen dugu eta deiaren hasiera-ordua grabatzen dugu.
Eta amaitutakoan, testuinguru berezi batean 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});
}
desgaitu luzapen honetarako CDR taularako sarrera (ez da beharrezkoa bertan), ezarri deiaren amaiera-ordua, kalkulatu iraupena, deiaren emaitza ezagutzen ez bada - ezarri (aldagaia CallMeDISPOSITION) eta, azken urratsa, bidali guztia Bitrixera sistema curl bidez.
Eta magia apur bat gehiago: sarrerako deia:
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();
}
Hemen lerro bakarra interesatzen zaigu.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());
PBXari instalatzeko esaten dio Deitzailearen ID (izena) aldagaiaren berdina CallMeCallerIDName.
CallMeCallerIDName aldagaia bera, berriz, CallMe aplikazioak ezartzen du (Bitrix24-k deitzailearen zenbakiaren izen osoa badu, ezarri gisa Deitzailearen ID (izena), ez - ez dugu ezer egingo).
Aplikazioaren konfigurazioa
Aplikazioaren ezarpenen fitxategia - /var/www/pbx.vistep.ru/config.php
Aplikazio-parametroen deskribapena:
- DeituMeDEBUG β 1 bada, aplikazioak prozesatutako gertaera guztiak erregistro fitxategian idatziko dira, 0 β ez dugu ezer idazten
- tech - SIP/PJSIP/IAX/etab
- authToken β Bitrix24 baimen-tokena, irteerako webhook baimen-kodea
- bitrixApiUrl β Sarrerako webhook-aren URLa, profilik gabe/
- luzapenak β kanpoko zenbakien zerrenda
- Testuinguru β dei bat sortzeko testuingurua
- listener_timeout β Gertaerak prozesatzeko abiadura izartxotik
- Asteriskoa β izartxora konektatzeko ezarpenak dituen array bat:
- ostalari β izartxoaren zerbitzariaren ip edo ostalari-izena
- eskema β konexio diagrama (tcp://, tls://)
- portu - portua
- erabiltzailea - Erabiltzaile izena
- sekretua - pasahitza
- connect_timeout β konexioaren denbora-muga
- irakurri_denbora - irakurri denbora-muga
adibidea ezarpen fitxategia:
<?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
);
Begiralearen konfigurazioa
Gainbegiralea Asterisk CallMeIn.php-tik gertaeren kudeatzailearen prozesua abiarazteko erabiltzen da, sarrerako deiak kontrolatzen dituena eta Bitrix24-rekin elkarreragiten duen (erakutsi txartela, ezkutatu txartela, etab.).
Sortu beharreko ezarpen-fitxategia:
/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
Abiarazi eta berrabiarazi aplikazioa:
supervisorctl start callme
supervisorctl restart callme
Aplikazioaren funtzionamendu-egoera ikustea:
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07
Ondorioa
Nahiko konplikatua izan zen, baina ziur nago esperientziadun administratzaile batek inplementatu eta bere erabiltzaileei atsegin izango diela.
Agindu bezala,
Galderak, iradokizunak - utzi iruzkinetan. Gainera, integrazio honen garapena nola joan den interesatzen bazaizu, idatzi, eta hurrengo artikuluan saiatuko naiz guztia zehatzago azaltzen.
Iturria: www.habr.com