Shabakadu waxay leedahay doorashooyin kala duwan oo loogu talagalay isku dhafka IP-PBX Asterisk iyo CRM Bitrix24, laakiin annagu, si kastaba ha ahaatee, waxaan go'aansanay inaan qorno annaga.
Shaqaale ahaan, wax walba waa heer:
- Markaad gujiso isku xirka lambarka taleefanka macmiilka ee Bitrix24, Asterisk waxay ku xidhaysaa nambarka gudaha ee isticmaalaha isaga oo ka wakiil ah gujintaan lagu sameeyay lambarka taleefanka macmiilka. Gudaha Bitrix24, diiwaanka wicitaanka ayaa la duubayaa, dhammaadka wicitaanka, rikoorka wada hadalka waa la jiidayaa.
- Wicitaanku wuxuu ka imaanayaa Asterisk bannaanka - gudaha Bitrix24 interface, waxaan tuseynaa kaarka macmiilka shaqaalaha lambarkiisa uu soo wacay.
Haddii uusan jirin macmiil noocaas ah, fur kaarka si aad u abuurto rasaas cusub.
Sida ugu dhakhsaha badan ee wicitaanku dhammeeyo, waxaanu ka tarjumaynaa kaadhka oo aanu kor u qaadnay duubista wada hadalka.
Goynta hoosteeda, waxaan kuu sheegi doonaa sida loo dejiyo wax kasta oo naftaada ah oo aad siiso xiriiriye github - haa, haa, qaado oo isticmaal!
Tafaasiisha guud
Waxaan u yeernay is dhexgalkayaga CallMe. CallMe waa codsi web yar oo ku qoran PHP.
Tignoolajiyada iyo adeegyada la isticmaalay
- PHP 5.6
PHP AMI Library - laxamiistaha
- nginx + php fpm
- kormeere
- AMI (Interface Manager Asterisk Manager)
- Bitrix webhooks (fulinta REST API oo la fududeeyay)
habayn
Seerarka leh Asterisk, waxaad u baahan tahay inaad ku rakibto server-ka shabakadda (waxaan leenahay nginx + php-fpm), kormeere iyo git.
Amarka rakibida (CentOS):
yum install nginx php-fpm supervisor git
Waxaan u gudbinaa tusaha diyaar u ah server-ka shabakada, ka soo jiid codsiga git oo dejinno xuquuqda lagama maarmaanka ah galka:
cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/
Marka xigta, habee nginx, qaabayntayadu waxay ku taal
/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;
}
}
Waxaan ka tagi doonaa falanqaynta qaabeynta, arrimaha amniga, helitaanka shahaadada, iyo xitaa doorashada server-ka shabakadda oo ka baxsan baaxadda maqaalka - wax badan ayaa laga qoray arrintan. Codsiga ma laha wax xannibaad ah, wuxuu ka shaqeeyaa labadaba http iyo https.
Waxaan haynaa https, aan sirin shahaado.
Haddii aad wax walba si sax ah u samaysay, markaa adigoo gujinaya isku xirka waa inaad aragto wax sidan oo kale ah
Qalabaynta Bitrix24
Aynu abuurno laba webhooks.
Qaboojiyaha soo socda.
Hoosta koontada maamulka (oo leh id 1) raac jidka: Codsiyada -> Webhooks -> Ku dar webhook -> webhook soo socda
Buuxi cabbiraadaha shabkada soo socota sida sawirada shaashadda:
Oo guji keydka
Kaydinta ka dib, Bitrix24 waxay bixin doontaa URL-ka webhook soo socda, tusaale ahaan:
Keydi nooca URL-ka adiga oo aan raad raacin/profile/ - waxaa loo isticmaali doonaa codsiga si loogula shaqeeyo wicitaanada soo socda.
waan hayaa https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/
Qaboojiyaha ka baxaya.
Codsiyada -> Webhook -> Ku dar Webhook -> Webhook baxaya
Faahfaahinta waxay ku taal shaashadda:
Keydi oo hel lambarka oggolaanshaha
waan hayaa xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6
. Waxa kale oo aad u baahan tahay in aad koobi ka samayso naftaada, waxa loo baahan yahay in la sameeyo wicitaano dibadda ah.
Muhiim!
Shahaadada ssl waa in lagu habeeyaa server-ka Bitrix24 (waxaad isticmaali kartaa letsencrypt), haddii kale BitrixXNUMX api ma shaqayn doono. Haddii aad haysatid nooca daruuraha, ha werwerin - ssl waaba meeshaas.
Muhiim!
Goobta "Cinwaanka Processor-ka", ciwaanka laga heli karo internetka waa in lagu tilmaamaa!
Iyo taabashada kama dambaysta ah, aan ku rakibno CallMeOut codsi ahaan wicitaannada wicitaannada (si markaa adigoo gujinaya lambarka PBX, amar ayaa u duuli doona si uu u bilaabo wicitaanka).
Gudaha menu, dooro: More -> Telefoon -> Wax badan -> Settings, u deji "Lambarka wicitaanada baxaya by default" Codsiga: CallMeOut oo guji "Save"
habaynta xidigta
Si loo helo is dhexgalka guusha leh ee u dhexeeya Asterisk iyo Bitrix24, waxaan u baahanahay inaan ku darno isticmaalaha callme AMI 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
Marka xigta, waxaa jira dhowr farsamooyin oo u baahan doona in la hirgeliyo iyadoo la adeegsanayo dialplan (waxaan leenahay extensions.ael).
Waxaan soo qaadan doonaa faylka oo dhan, ka dibna waxaan bixin doonaa sharraxaad:
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});
}
};
Aan ka bilowno bilowga: dardaaran caalamka.
Isbadal RECORDS waxay ku kaydisaa URL faylalka duubista wada sheekeysiga, iyadoo la raacayo taas oo Bitrix24 ay u jiidi doonto kaarka xiriirka.
Marka xigta, waxaan xiiseyneynaa macro wax lagu qoro.
Halkan, marka lagu daro duubista wada sheekaysiga, waxaanu dejin doonaa doorsoomaha Magaca buuxa.
Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);
Waxay ku kaydisaa URL buuxa faylal gaar ah (makro waxaa loogu yeeraa meel kasta).
Aan falanqeyno wicitaanka baxaya:
_. => {
&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});
}
Aynu nidhaahno waxaan wacnaa 89991234567, waxa ugu horreeya ee aan halkan helno:
&recording(${CALLERID(number)},${EXTEN});
kuwaas. macro duubista wicitaanka ayaa la yiraahdaa doorsoomayaasha lagama maarmaanka ah waa la dejiyaa.
dheeraad ah
Set(__CallIntNum=${CALLERID(num)})
Set(CallStart=${STRFTIME(epoch,,%s)});
Waxaan duubnaa cidda wacday, waxaanan diiwaangelinnaa waqtiga wicitaanka.
Iyo marka la dhammeeyo, oo ku jira xaalad gaar ah 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});
}
dami gelitaanka miiska CDR ee kordhintan (looma baahna halkaas), deji waqtiga dhamaadka wicitaanka, xisaabi muddada, haddii natiijada wicitaanku aan la garanayn - dejin (la beddeli karo) Igu wac DHISAN) iyo, tallaabada ugu dambeysa, u dir wax walba Bitrix iyada oo loo marayo curlka nidaamka.
Iyo wax yar oo sixir ah - wicitaan soo socda:
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();
}
Halkan waxaan xiisaynaynaa hal sadar oo kaliya.
ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());
Waxay tidhi PBX rakib Aqoonsiga soo wacaha (magaca) doorsoome WacMeCallerIDMagaca.
Doorsoomiyaha CallMeCallerIDName laftiisa, dhankeeda, waxaa dejiyay arjiga CallMe (haddii Bitrix24 ay magac buuxa u leedahay lambarka soo wacaha, waxaan u dejin doonaa sida Aqoonsiga soo wacaha (magaca), maya - waxba yeeli mayno).
Dejinta codsiga
Faylka habaynta codsiga - /var/www/pbx.vistep.ru/config.php
Sharaxaadda cabbirrada codsiga:
- WacMeDEBUG - haddii 1, markaa dhammaan dhacdooyinka lagu habeeyo codsiga waxaa lagu qori doonaa faylka log, 0 - waxba ma qorinno
- casriga ah SIP/PJSIP/IAX/iwm
- AuthToken - Calaamadda oggolaanshaha Bitrix24, koodka oggolaanshaha webhook baxaya
- bitrixApiUrl - URL-ka webhook soo socda, oo aan lahayn profile/
- xad-dhaaf - liiska lambarrada dibadda
- Macnaha guud - macnaha guud ee asalka call
- dhagaystaha_waqti-dhamaaday - Xawaaraha habaynta dhacdada oo ka imanaya xiddigga
- asterisk - array leh jaangooyooyinka isku xirka calaamadda:
- ciidankii - ip ama magaca martida loo yahay ee server-ka xidigta
- nidaam - jaantuska isku xirka (tcp: //, tls: //)
- dekedda - dekedda
- username - Magaca isticmaalaha
- qarsoodi ah - erayga sirta ah
- isku xidhka_waqti dhamaa - wakhtiga xidhidhku
- akhriska_waqti dhamaatey - wakhtiga wax akhrinta
tusaale ahaan faylka dejinta:
<?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
);
Dejinta kormeeraha
Kormeeraha waxa loo isticmaalaa in lagu bilaabo nidaamka maamulaha dhacdada Asterisk CallMeIn.php, kaas oo la socda wicitaanada soo socda oo la falgala Bitrix24 (muuji kaadhka, qari kaadhka, iwm.).
Faylka dejinta si loo abuuro:
/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
Bilaabida iyo dib u bilaabida codsiga:
supervisorctl start callme
supervisorctl restart callme
arag heerka codsiga
supervisorctl status callme
callme RUNNING pid 11729, uptime 17 days, 16:58:07
gunaanad
Waxay noqotay arrin aad u adag, laakiin waxaan hubaa in maamule khibrad leh uu awoodi doono inuu hirgeliyo oo ka farxiyo isticmaalayaashiisa.
Sidii ballanku ahaa,
Su'aalo, talooyin - fadlan faallooyinka. Sidoo kale, haddii aad xiisaynayso sida horumarka is-dhexgalkani u dhacay, qor, maqaalka soo socdana waxaan isku dayi doonaa inaan wax walba si faahfaahsan u muujiyo.
Source: www.habr.com