Kubatanidzwa kweAsterisk uye Bitrix24

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

Panyaya yekushanda, zvese zvakajairwa:

  • Nekudzvanya pane chinongedzo nenhamba dzenhare yemutengi muBitrix24, Asterisk inobatanidza nhamba yemukati yemushandisi uyo wakaitwa kudzvanya uku nenhamba dzenhare yemutengi. Bitrix24 inorekodha kufona uye inodhonza rekodhi yekukurukurirana pakupera kwekufona.
  • Kufona kunouya kuAsterisk kubva kunze - muBitrix24 interface tinoratidza kadhi yemutengi kune mushandi ane nhamba yekufona kwakasvika.
    Kana pasina mutengi akadaro, tichavhura kadhi rekugadzira kutungamira kutsva.
    Kana kufona kwangopera, tinoratidza izvi mukadhi uye tokwevera kurekodha hurukuro.

Pasi pekucheka ini ndichakuudza nzira yekuzvigadzirira iwe zvese uye kukupa chinongedzo kune github - 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 (munyaya yedu ndeye nginx + php-fpm), mutariri uye git.

Kuisa murairo (CentOS):

yum install nginx php-fpm supervisor git

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


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

Tevere, isu tichagadzirisa 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 iyo config ongororo, kuchengetedza nyaya, kuwana chitupa uye kunyange kusarudza webhu server kunze kwechikamu chechinyorwa - zvakawanda zvakanyorwa pamusoro peizvi. Iyo application haina zvirambidzo, inoshanda zvese pa http uye https.

Isu tinoshandisa https, ngatinyorei chitupa.

Kana iwe wakaita zvese nemazvo, saka kana iwe ukadzvanya pane chinongedzo iwe unofanirwa kuona chimwe chinhu chakadai

Kubatanidzwa kweAsterisk uye Bitrix24

Kugadzira Bitrix24

Ngatigadzire mawebhook maviri.

Incoming 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 vhezheni yeURL isina kupera /profile/ - ichashandiswa mukushandisa kubata mafoni anouya.

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

Inobuda webhook.

Zvishandiso -> Webhooks -> Wedzera Webhook -> Inobuda Webhook

Tsanangudzo 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 kuikopa kwauri, inodiwa kuita mafoni anobuda.

Zvinokosha!

Iyo Bitrix24 server inofanirwa kunge iine SSL chitupa chakagadziriswa (unogona kushandisa letsencrypt), zvikasadaro Bitrix API haishande. Kana iwe uine gore vhezheni, haugone kunetseka - kwatove neSSL.

Zvinokosha!

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

Uye sekubata kwekupedzisira, tichaisa yedu CallMeOut sechikumbiro chekufona (kuitira kuti kana ukadzvanya panhamba, murairo wekutanga kufona unotumirwa kuPBX).

Mumenyu, sarudza: Zvakawanda -> Runhare -> Zvimwe -> Zvirongwa, isa iyo "Default inobuda yekufona nhamba" Chishandiso: 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 mashoma mashoma anozoda kuitwa kuburikidza nedialplan (munyaya yedu, ndeye extensions.ael).

Ini ndichapa iyo yese faira ndozopa dzimwe 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 globals.

Variable URLRECORDS inochengeta iyo URL kumafaira ekurekodha ekufona, ayo Bitrix24 achashandisa kuvadhonzera mukadhi 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).

Ngatitarisei kufona kunobuda:

_. => {
	&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, chinhu chekutanga chatinowana chiri pano:

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

i.e. hurukuro yekurekodha macro inodaidzwa uye izvo zvinodiwa zvinopinda.

mberi

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

Isu tinorekodha ndiani akatanga kufona uye kurekodha nguva yekutanga kufona.

Uye pakupera kwayo, mune yakakosha mamiriro 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});
}

isu tinodzima kurekodha muCDR ​​tafura yekuwedzera uku (hatidi ipapo), tinoseta nguva yekupedzisira yekufona, tinoverenga nguva, kana mhedzisiro yekufona isingazivikanwe, tinoisa (inoshanduka. CallMeDISPOSITION) uye, sedanho rekupedzisira, tinotumira zvese kuBitrix kuburikidza neiyo system curl.

Uye mamwe mashiripiti - kufona kunouya:

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 kufarira mutsetse mumwe chete.

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

Anoti kuisa PBX CallerID(zita) yakaenzana nekuchinja CallMeCallerIDName.

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

Kugadzika application

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

Tsanangudzo yezvishandiso parameters:

  • CallMeDEBUG - kana 1, saka 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 - chirevo chemavambo ekufona
  • muteereri_timeout - kukurumidza kwekugadzirisa chiitiko kubva kune asterisk
  • asterisk - array ine asterisk yekubatanidza marongero:
  • hondo - ip kana zita rekutambira reiyo asterisk server
  • chikwata - chirongwa chekubatanidza (tcp://, tls://)
  • poti - chiteshi
  • Username - username
  • chakavanzika - pasiwedhi
  • connect_timeout - nguva yekubatanidza
  • read_timeout - kuverenga nguva

muenzaniso wezvigadziriso 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

);

Kugadzira mutariri

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

Iyo faira yekuseta inoda kugadzirwa ndeye:

/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

Ona mamiriro ekushandisa:

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, zvishuwo - ndapota mune mhinduro. Zvakare, kana iwe uchifarira kuti kusimudzira kwekubatanidzwa kwakaenda sei, nyora, uye mune inotevera chinyorwa ndichaedza kuburitsa zvese zvakadzama.

Source: www.habr.com

Voeg