Asterisk un Bitrix24 integrācija

Asterisk un Bitrix24 integrācija
Tīklam ir dažādas iespējas integrēt IP-PBX Asterisk un CRM Bitrix24, taču mēs tomēr nolēmām rakstīt savu.

Funkcionāli viss ir standarta:

  • Noklikšķinot uz saites ar klienta tālruņa numuru programmā Bitrix24, Asterisk savieno tā lietotāja iekšējo numuru, kura vārdā tika veikts šis klikšķis, ar klienta tālruņa numuru. Programmā Bitrix24 tiek ierakstīts zvana ieraksts, un zvana beigās tiek izvilkts sarunas ieraksts.
  • Uz Asterisk pienāk zvans no ārpuses - Bitrix24 interfeisā rādām klienta karti darbiniekam, uz kura numuru pienāca šis zvans.
    Ja šāda klienta nav, atveriet karti jauna potenciālā pirkuma izveidei.
    Tiklīdz zvans ir pabeigts, mēs to atspoguļojam kartītē un izvelkam sarunas ierakstu.

Zem griezuma es jums pastāstīšu, kā visu iestatīt sev un iedošu saiti uz github - jā, jā, ņem un izmanto!

vispārīgs apraksts

Mēs nosaucām mūsu integrāciju CallMe. CallMe ir neliela tīmekļa lietojumprogramma, kas rakstīta PHP.

Izmantotās tehnoloģijas un pakalpojumi

  • PHP 5.6
  • PHP AMI bibliotēka
  • Komponists
  • nginx + php fpm
  • uzraugs
  • AMI (zvaigznīšu pārvaldnieka saskarne)
  • Bitrix tīmekļa aizķeres (vienkāršota REST API ieviešana)

priekšiestatījums

Serverī ar Asterisk jums jāinstalē tīmekļa serveris (mums ir nginx + php-fpm), supervizors un git.

Instalēšanas komanda (CentOS):

yum install nginx php-fpm supervisor git

Mēs nododam tīmekļa serverim pieejamo direktoriju, izvelkam lietojumprogrammu no git un iestatām mapei nepieciešamās tiesības:


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

Pēc tam konfigurējiet nginx, mūsu konfigurācija atrodas

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

Konfigurācijas analīzi, drošības problēmas, sertifikāta iegūšanu un pat tīmekļa servera izvēli atstāšu ārpus raksta darbības jomas - par to ir daudz rakstīts. Lietojumprogrammai nav ierobežojumu, tā darbojas gan http, gan https.

Mums ir https, šifrēsim sertifikātu.

Ja jūs visu izdarījāt pareizi, tad, noklikšķinot uz saites, jums vajadzētu redzēt kaut ko līdzīgu šim

Asterisk un Bitrix24 integrācija

Bitrix24 iestatīšana

Izveidosim divus tīmekļa aizķeres.

Ienākošais tīmekļa aizķere.

Zem administratora konta (ar ID 1) dodieties pa ceļu: Programmas -> Webhooks -> Pievienot tīmekļa aizķeri -> Ienākošais tīmekļa aizķere

Asterisk un Bitrix24 integrācija

Aizpildiet ienākošā tīmekļa aizķeres parametrus, kā parādīts ekrānuzņēmumos:

Asterisk un Bitrix24 integrācija

Asterisk un Bitrix24 integrācija

Un noklikšķiniet uz Saglabāt.

Pēc saglabāšanas Bitrix24 nodrošinās ienākošā tīmekļa aizķeres URL, piemēram:

Asterisk un Bitrix24 integrācija

Saglabājiet savu URL versiju bez beigu /profile/ — tā tiks izmantota lietojumprogrammā, lai strādātu ar ienākošajiem zvaniem.

Man tas ir https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Izejošais tīmekļa aizķere.

Lietojumprogrammas -> Tīmekļa aizķere -> Pievienot tīmekļa aizķeri -> Izejošā tīmekļa aizķere

Sīkāka informācija atrodama ekrānuzņēmumos:

Asterisk un Bitrix24 integrācija

Asterisk un Bitrix24 integrācija

Saglabājiet un iegūstiet autorizācijas kodu

Asterisk un Bitrix24 integrācija

Man tas ir xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Vajag arī pārkopēt sev, tas ir vajadzīgs izejošo zvanu veikšanai.

Svarīgi!

Bitrix24 serverī ir jākonfigurē SSL sertifikāts (varat izmantot letsencrypt), pretējā gadījumā BitrixXNUMX api nedarbosies. Ja jums ir mākoņa versija, neuztraucieties — ssl jau ir.

Svarīgi!

Laukā "Procesora adrese" jānorāda no interneta pieejama adrese!

Un ar pēdējo pieskārienu instalēsim mūsu CallMeOut kā lietojumprogrammu zvanu veikšanai (lai, noklikšķinot uz PBX numura, tiktu parādīta komanda, lai sāktu zvanu).

Izvēlnē atlasiet: Vairāk -> Telefonija -> Vairāk -> Iestatījumi, iestatiet uz "Izejošo zvanu numurs pēc noklusējuma" Lietojumprogramma: CallMeOut un noklikšķiniet uz "Saglabāt"

Asterisk un Bitrix24 integrācija

zvaigznītes iestatīšana

Lai veiksmīgi mijiedarbotos starp Asterisk un Bitrix24, mums ir jāpievieno callme AMI lietotājs vietnei 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

Tālāk ir daži triki, kas būs jāievieš, izmantojot dialplan (mums ir paplašinājumi.ael).

Es citēšu visu failu un tad sniegšu paskaidrojumus:

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

};

Sāksim no sākuma: direktīva Globālie.

Mainīgs URLRECORDS saglabā sarunu ierakstīšanas failu URL, saskaņā ar kuru Bitrix24 tos ievilks kontakta kartītē.

Tālāk mūs interesē makro makro ierakstīšana.

Šeit papildus sarunu ierakstīšanai mēs iestatīsim mainīgo FullFname.

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

Tas saglabā pilnu URL konkrētam failam (makro tiek izsaukts visur).

Analizēsim izejošo zvanu:

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

Pieņemsim, ka mēs zvanām 89991234567. Pirmā lieta, ko mēs šeit saņemam:

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

tie. tiek izsaukts zvanu ierakstīšanas makro un iestatīti nepieciešamie mainīgie.

Tālāk

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

mēs ierakstām, kurš iniciējis zvanu, un ierakstām zvana sākuma laiku.

Un pēc tās pabeigšanas īpašā kontekstā 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});
}

izslēdziet ierakstu CDR tabulā šim paplašinājumam (tur tas nav vajadzīgs), iestatiet zvana beigu laiku, aprēķiniet ilgumu, ja zvana rezultāts nav zināms - iestatīt (mainīgs Zvaniet man par DISPOSITION) un, pēdējais solis, nosūtiet visu uz Bitrix, izmantojot sistēmas curl.

Un vēl mazliet maģijas – ienākošs zvans:

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

Šeit mūs interesē tikai viena rinda.

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

Viņa saka, ka instalējiet PBX Zvanītāja ID(vārds) mainīgs CallMeCallerIDName.

Savukārt pašu CallMeCallerIDName mainīgo iestata lietojumprogramma CallMe (ja Bitrix24 ir pilns zvanītāja numura nosaukums, mēs to iestatīsim kā Zvanītāja ID(vārds), nē - mēs neko nedarīsim).

Lietojumprogrammas iestatīšana

Lietojumprogrammas iestatījumu fails - /var/www/pbx.vistep.ru/config.php

Lietojuma parametru apraksts:

  • CallMeDEBUG - ja 1, tad visi lietojumprogrammas apstrādātie notikumi tiks ierakstīti žurnāla failā, 0 - mēs neko nerakstām
  • tech SIP/PJSIP/IAX/u.c
  • authToken — Bitrix24 autorizācijas marķieris, izejošā tīmekļa aizķeres autorizācijas kods
  • bitrixApiUrl — ienākošā tīmekļa aizķeres URL bez profila/
  • pagarinājumi — ārējo numuru saraksts
  • konteksts — konteksts zvana uzsākšanai
  • klausītāja_noildze - notikumu apstrādes ātrums no zvaigznītes
  • zvaigznīte - masīvs ar savienojuma iestatījumiem līdz zvaigznītei:
  • saimnieks - zvaigznītes servera IP vai resursdatora nosaukums
  • shēma — savienojuma shēma (tcp://, tls://)
  • osta - osta
  • lietotājvārds - Lietotājvārds
  • noslēpums - parole
  • savienojuma_noildze - savienojuma taimauts
  • lasīšanas_noildze - lasīšanas taimauts

iestatījumu faila piemērs:

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

);

Pārrauga iestatīšana

Supervisor tiek izmantots, lai palaistu Asterisk CallMeIn.php notikumu apstrādātāja procesu, kas uzrauga ienākošos zvanus un mijiedarbojas ar Bitrix24 (parādīt karti, paslēpt karti utt.).

Izveidojamais iestatījumu fails:

/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

Lietojumprogrammas palaišana un restartēšana:

supervisorctl start callme
supervisorctl restart callme

skatiet pieteikuma statusu:

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

Secinājums

Tas izrādījās diezgan grūti, bet esmu pārliecināts, ka pieredzējis administrators spēs ieviest un iepriecināt savus lietotājus.

Kā solīts, saite uz github.

Jautājumi, ieteikumi - lūdzu komentāros. Kā arī, ja interesē, kā noritēja šīs integrācijas attīstība, rakstiet, un nākamajā rakstā mēģināšu visu atklāt sīkāk.

Avots: www.habr.com

Pievieno komentāru