Kubatanidzwa kweAsterisk uye Bitrix24

Kubatanidzwa kweAsterisk uye Bitrix24
Pane nzira dzakasiyana dzekubatanidza IP-PBX Asterisk uye CRM Bitrix24 pane network, asi isu takasarudza kunyora zvedu.

Panyaya yekushanda, zvese zvakajairwa:

  • Nekudzvanya pane chinongedzo nenhamba dzefoni yemutengi muBitrix24, Asterisk inobatanidza nhamba yemukati yemushandisi uyo kudzvanya kwakaitwa nenhamba dzenhare yemutengi. MuBitrix24, rekodhi yekufona inorekodhwa uye, pakupera kwekufona, kurekodha kwenhaurirano kunosimudzwa.
  • Asterisk inogamuchira runhare kubva kunze - muBitrix24 interface tinoratidza kadhi yemutengi kune mushandi ane nhamba yekufona iyi.
    Kana pasina mutengi akadaro, tichavhura kadhi rekugadzira kutungamira kutsva.
    Pakangopera kufona, isu tinoratidza izvi pakadhi uye tokwevera kurekodha yehurukuro.

Pazasi pekucheka ini ndichakuudza maitiro ekuzvigadzirira zvese uye kukupa chinongedzo kugithub - hongu, hongu, tora uye uishandise!

Gwaro rinotsanangurwa

Isu takadaidza yedu yekubatanidza CallMe. CallMe idiki rewebhu application rakanyorwa muPHP.

Tekinoroji uye masevhisi anoshandiswa

  • PHP 5.6
  • PHP AMI raibhurari
  • munyori
  • Nginx + php-fpm
  • mutariri
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (yakareruka REST API kuita)

Pre-setting

Pane sevha ine Asterisk, unofanirwa kuisa sevha yewebhu (kwedu ndeye nginx+php-fpm), mutariri uye git.

Kuisa murairo (CentOS):

yum install nginx php-fpm supervisor git

Isu tinoenda kune iyo dhairekitori inowanikwa kune webhu server, dhonza iyo application kubva kuGit uye isa kodzero dzinodiwa kune folda:


cd /var/www
git clone https://github.com/ViStepRU/callme.git
chown nginx. -R callme/

Tevere, ngatigadzirise nginx, yedu config iri mukati

/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;
		}
}

Ini ndichasiya kupatsanura gadziriso, nyaya dzekuchengetedza, kuwana chitupa uye kunyange kusarudza webhu server kunze kwechikamu chechinyorwa - zvakawanda zvakanyorwa pamusoro peizvi. Iyo application haina zvirambidzo, inoshanda pamusoro pese http uye https.

Isu tinoshandisa https, ngatinyorei chitupa.

Kana iwe wakaita zvese nemazvo, ipapo nekudzvanya pane chinongedzo iwe unofanirwa kuona chimwe chinhu chakadai

Kubatanidzwa kweAsterisk uye Bitrix24

Kugadzira Bitrix24

Ngatigadzire mawebhook maviri.

Inouya webhook.

Pasi peakaundi yemutungamiriri (ine id 1), tevera nzira: Zvishandiso -> Webhooks -> Wedzera webhook -> Inouya webhook

Kubatanidzwa kweAsterisk uye Bitrix24

Zadza maparamendi eiyo inopinda webhook sezviri muscreenshots:

Kubatanidzwa kweAsterisk uye Bitrix24

Kubatanidzwa kweAsterisk uye Bitrix24

Uye tinya save.

Mushure mekuchengetedza, Bitrix24 ichapa iyo URL yeinouya webhook, semuenzaniso:

Kubatanidzwa kweAsterisk uye Bitrix24

Sevha yako URL vhezheni pasina yekupedzisira / mbiri/ - ichashandiswa mukushandisa kushanda nemafoni anouya.

Ndine izvi https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Inobuda webhook.

Zvishandiso -> Webhooks -> Wedzera webhook -> Inobuda webhook

Tsanangudzo dziri zvakare pane skrini:

Kubatanidzwa kweAsterisk uye Bitrix24

Kubatanidzwa kweAsterisk uye Bitrix24

Sevha uye ugamuchire kodhi yemvumo

Kubatanidzwa kweAsterisk uye Bitrix24

Ndine izvi xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Iwe zvakare unofanirwa kuzvikopa iwe pachako; unoida kuti uite mafoni anobuda.

Zvinokosha!

Chitupa cheSSL chinofanira kugadzirwa paBitrix24 server (unogona kushandisa letsencrypt), zvikasadaro Bitrix api haishande. Kana iwe uine gore vhezheni, usazvinetse - yatova ne ssl.

Zvinokosha!

Iyo "Processor Kero" ndima inofanira kunge iine kero inowanikwa kubva paInternet!

Uye sekubata kwekupedzisira, ngatiise yedu CallMeOut sechikumbiro chekufona (kuitira kuti kana iwe ukadzvanya panhamba iri paPBX, murairo wekutangisa kufona unobhururuka uchienda).

Mumenyu, sarudza: Zvakawanda -> Runhare -> Zvimwe -> Zvirongwa, set mu "Default inobuda yekufona nhamba" Chikumbiro: CallMeOut uye tinya "Chengetedza"

Kubatanidzwa kweAsterisk uye Bitrix24

Kugadzira asterisk

Kuti kudyidzana kwakabudirira pakati peAsterisk neBitrix24, tinoda kuwedzera iyo AMI mushandisi callme kumaneja.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

Tevere, pane akati wandei matipi anozoda kuitwa kuburikidza ne dialplan (kwedu izvi ndezvekuwedzera.ael).

Ini ndichapa iyo yese faira, uye ipapo ini ndopa tsananguro:

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});
}

};

Ngatitangei kubva pakutanga: kuraira globalbals.

Variable URLRECORDS inochengeta iyo URL kumafaira ekurekodha ehurukuro, maererano neiyo Bitrix24 inovakwevera mukati mekadhi rekuonana.

Tevere isu tinofarira iyo macro macro kutsikisa.

Pano, kunze kwekurekodha hurukuro, tichaisa shanduko FullFname.

Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3);

Iyo inochengeta iyo yakazara URL kune chaiyo faira (iyo macro inonzi kwese kwese).

Ngationgororei runhare rwunobuda:

_. => {
	&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});
}

Ngatitii tinodaidza 89991234567, chekutanga tinosvika pano:

&recording(${CALLERID(number)},${EXTEN});

avo. Hurukuro yekurekodha macro inodaidzwa uye inodiwa mavheti akaiswa.

mberi

        Set(__CallIntNum=${CALLERID(num)})
	Set(CallStart=${STRFTIME(epoch,,%s)});

Isu tinorekodha ndiani akatanga kufona uye kurekodha nguva yekutanga kufona.

Uye pakupedzwa kwayo, muchimiro chakakosha 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});
}

dzima kurekodha muCDR ​​tafura yekuwedzera uku (haidiwe ipapo), isa nguva yekupedzisira yekufona, verenga nguva, kana mhedzisiro yekufona isingazivikanwe - set (inoshanduka CallMeDISPOSITION) uye, danho rekupedzisira, tumira zvese kuBitrix kuburikidza neiyo system curl.

Uye mamwe mashiripiti mashoma - runhare runouya:

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();
        }

Pano isu tiri kungofarira mutsetse mumwe chete.

ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp());

Anoudza PBX kuti iise CallerID(zita) kuenzana nekuchinja CallMeCallerIDName.

Iyo CallMeCallerIDName inoshanduka pachayo, zvakare, inoiswa neCallMe application (kana Bitrix24 iine zita rakazara renhamba yeanofona, isa senge. CallerID(zita), kwete - hapana chatichaita).

Kugadzika application

Chikumbiro chekugadzirisa faira - /var/www/pbx.vistep.ru/config.php

Tsanangudzo yezvishandiso parameters:

  • CallMeDEBUG - kana 1, ipapo zviitiko zvese zvakagadziriswa nechikumbiro zvichanyorerwa kune faira regi, 0 - isu hatinyore chero chinhu
  • Tech - SIP/PJSIP/IAX/etc
  • authToken -Bitrix24 mvumo tokeni, inobuda webhook mvumo kodhi
  • bitrixApiUrl - URL yeinouya webhook, isina chimiro/
  • zviyero - rondedzero yenhamba dzekunze
  • chinyorwa - mamiriro ekutanga runhare
  • muteereri_timeout - kukurumidza kwekugadzirisa chiitiko kubva kune asterisk
  • asterisk - rondedzero ine zvigadziriso zvekubatanidza kune asterisk:
  • hondo - ip kana zita rekutambira reiyo asterisk server
  • chikwata - dhayagiramu yekubatanidza (tcp://, tls://)
  • poti - chiteshi
  • Username - Username
  • chakavanzika - pasiwedhi
  • connect_timeout - nguva yekubatanidza
  • read_timeout - kuverenga nguva

muenzaniso kuseta faira:

 <?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

);

Supervisor setup

Mutariri anoshandiswa kuvhura chiitiko chekubata chiitiko kubva kuAsterisk CallMeIn.php, iyo inotarisisa mafoni anouya uye inodyidzana neBitrix24 (kadhi yekuratidza, kadhi yekuviga, nezvimwewo).

Settings faira ichagadzirwa:

/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

Vhura uye tangazve application:

supervisorctl start callme
supervisorctl restart callme

Uchiona mamiriro ekushandisa kweapp:

supervisorctl status callme
callme                           RUNNING   pid 11729, uptime 17 days, 16:58:07

mhedziso

Zvakazonetsa, asi ndine chokwadi chekuti maneja ane ruzivo achakwanisa kuzviita uye kufadza vashandisi vake.

Sezvakavimbiswa, link kune github.

Mibvunzo, mazano - ndapota vasiye mumashoko. Zvakare, kana iwe uchifarira kuti kusimudzira kwekubatanidzwa kwakaenda sei, nyora, uye mune inotevera chinyorwa ndichaedza kuburitsa zvese zvakadzama.

Source: www.habr.com

Voeg