Integrasie van Asterisk en Bitrix24

Integrasie van Asterisk en Bitrix24
Daar is verskillende opsies om IP-PBX Asterisk en CRM Bitrix24 op die netwerk te integreer, maar ons het steeds besluit om ons eie te skryf.

Wat funksionaliteit betref, is alles standaard:

  • Deur op 'n skakel met 'n kliënt se telefoonnommer in Bitrix24 te klik, verbind Asterisk die interne nommer van die gebruiker namens wie die klik gemaak is met die kliënt se telefoonnommer. In Bitrix24 word 'n rekord van die oproep opgeneem en aan die einde van die oproep word 'n opname van die gesprek opgetrek.
  • Asterisk ontvang 'n oproep van buite - in die Bitrix24-koppelvlak wys ons die kliëntkaart aan die werknemer na wie se nommer hierdie oproep aangekom het.
    As daar nie so 'n kliënt is nie, sal ons die kaart oopmaak om 'n nuwe lood te skep.
    Sodra die oproep voltooi is, reflekteer ons dit op die kaart en trek 'n opname van die gesprek op.

Onder die snit sal ek jou vertel hoe om alles vir jouself op te stel en vir jou 'n skakel na github gee - ja, ja, neem dit en gebruik dit!

Algemene beskrywing

Ons het ons integrasie CallMe genoem. CallMe is 'n klein webtoepassing wat in PHP geskryf is.

Tegnologieë en dienste wat gebruik word

  • PHP 5.6
  • PHP AMI-biblioteek
  • komponis
  • Nginx + php-fpm
  • toesighouer
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (vereenvoudigde REST API implementering)

voorafinstelling

Op 'n bediener met Asterisk moet u 'n webbediener installeer (vir ons is dit nginx+php-fpm), toesighouer en git.

Installasie opdrag (CentOS):

yum install nginx php-fpm supervisor git

Ons gaan na die gids wat toeganklik is vir die webbediener, trek die toepassing uit Git en stel die nodige regte op die gids in:


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

Kom ons stel dan nginx op, ons konfigurasie is geleë in

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

Ek sal die ontleding van die konfigurasie, sekuriteitskwessies, die verkryging van 'n sertifikaat en selfs die keuse van 'n webbediener buite die bestek van die artikel laat - baie is hieroor geskryf. Die toepassing het geen beperkings nie, dit werk oor beide http en https.

Ons gebruik https, kom ons enkripteer sertifikaat.

As jy alles reg gedoen het, sal jy so iets sien deur op die skakel te klik

Integrasie van Asterisk en Bitrix24

Stel Bitrix24 op

Kom ons skep twee webhooks.

Inkomende webhaak.

Onder die administrateur rekening (met id 1), volg die pad: Toepassings -> Webhooks -> Voeg webhook by -> Inkomende webhook

Integrasie van Asterisk en Bitrix24

Vul die parameters van die inkomende webhook in soos in die skermkiekies:

Integrasie van Asterisk en Bitrix24

Integrasie van Asterisk en Bitrix24

En klik op stoor.

Nadat dit gestoor is, sal Bitrix24 die URL van die inkomende webhook verskaf, byvoorbeeld:

Integrasie van Asterisk en Bitrix24

Stoor jou weergawe van die URL sonder die finale /profiel/ - dit sal in die toepassing gebruik word om met inkomende oproepe te werk.

Ek het hierdie https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Uitgaande webhaak.

Toepassings -> Webhooks -> Voeg webhook by -> Uitgaande webhook

Besonderhede is weer op die skermkiekies:

Integrasie van Asterisk en Bitrix24

Integrasie van Asterisk en Bitrix24

Stoor en ontvang die magtigingskode

Integrasie van Asterisk en Bitrix24

Ek het hierdie xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Jy moet dit ook vir jouself kopieer; jy het dit nodig om uitgaande oproepe te maak.

Belangrik!

'n SSL-sertifikaat moet op die Bitrix24-bediener gekonfigureer word (jy kan letsencrypt gebruik), anders sal die Bitrix-api nie werk nie. As jy 'n wolkweergawe het, moenie bekommerd wees nie - dit het reeds ssl.

Belangrik!

Die "Verwerkeradres"-veld moet 'n adres bevat wat toeganklik is vanaf die internet!

En as 'n laaste aanraking, kom ons installeer ons CallMeOut as 'n toepassing om oproepe te maak (sodat wanneer jy op die nommer op die PBX klik, die opdrag vir die oorsprong van die oproep weg sal vlieg).

In die kieslys, kies: Meer -> Telefonie -> Meer -> Instellings, stel in "Verstek uitgaande oproepnommer" Toepassing: CallMeOut en klik "Stoor"

Integrasie van Asterisk en Bitrix24

Stel asterisk op

Vir suksesvolle interaksie tussen Asterisk en Bitrix24, moet ons die AMI-gebruiker callme by manager.conf voeg:

[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

Vervolgens is daar verskeie truuks wat via dialplan geïmplementeer sal moet word (vir ons is dit extensions.ael).

Ek sal die hele lêer verskaf, en dan sal ek 'n verduideliking gee:

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

};

Kom ons begin van die begin af: die richtlijn globals.

veranderlike URLRECORDS stoor die URL na die gespreksopnamelêers, waarvolgens Bitrix24 dit in die kontakkaart sal trek.

Volgende stel ons belang in die makro-makro opname.

Hier sal ons, benewens die opneem van gesprekke, die veranderlike stel Volle naam.

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

Dit stoor die volledige URL na 'n spesifieke lêer (die makro word oral genoem).

Kom ons ontleed die uitgaande oproep:

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

Kom ons sê ons bel 89991234567, eerstens kom ons hier:

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

dié. Die gesprekopname-makro word opgeroep en die nodige veranderlikes word ingestel.

Verdere

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

Ons teken aan wie die oproep begin het en teken die begintyd van die oproep aan.

En na die voltooiing daarvan, in 'n spesiale konteks 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});
}

deaktiveer toegang tot die CDR-tabel vir hierdie uitbreiding (dit is nie daar nodig nie), stel die eindtyd van die oproep in, bereken die duur, as die resultaat van die oproep nie bekend is nie - stel (veranderlik CallMeDISPOSITION) en, die laaste stap, stuur alles na Bitrix via die stelselkrul.

En 'n bietjie meer magie - 'n inkomende oproep:

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

Hier stel ons net belang in een reël.

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

Sy sê vir die PBX om te installeer Beller-ID (naam) gelyk aan veranderlike CallMeCallerIDName.

Die CallMeCallerIDName-veranderlike self word op sy beurt deur die CallMe-toepassing gestel (as Bitrix24 'n volle naam vir die beller se nommer het, stel dit as Beller-ID (naam), nee - ons sal niks doen nie).

Die opstel van die toepassing

Toepassingsinstellingslêer - /var/www/pbx.vistep.ru/config.php

Beskrywing van toepassingsparameters:

  • CallMeDEBUG — indien 1, dan sal alle gebeure wat deur die toepassing verwerk word na die loglêer geskryf word, 0 — ons skryf niks
  • tegnologie - SIP/PJSIP/IAX/ens
  • authToken — Bitrix24-magtigingstoken, uitgaande webhook-magtigingskode
  • bitrixApiUrl - URL van die inkomende webhook, sonder profiel/
  • uitbreidings — lys van eksterne nommers
  • konteks — konteks vir die skep van 'n oproep
  • listener_timeout - spoed van gebeurtenisverwerking vanaf asterisk
  • asterisk - 'n skikking met instellings om aan die asterisk te koppel:
  • gasheer - ip of gasheernaam van die asterisk-bediener
  • skema - verbindingsdiagram (tcp://, tls://)
  • hawe - hawe
  • Gebruikersnaam - Gebruikersnaam
  • geheim - wagwoord
  • connect_timeout — Verbindingstydperk
  • read_timeout - lees time-out

voorbeeld instellings lêer:

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

);

Toesighouer opstelling

Toesighouer word gebruik om die gebeurtenishanteerderproses vanaf Asterisk CallMeIn.php te begin, wat inkomende oproepe monitor en met Bitrix24 interaksie het (wys kaart, versteek kaart, ens.).

Instellingslêer wat geskep moet word:

/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

Begin en herbegin die toepassing:

supervisorctl start callme
supervisorctl restart callme

Bekyk die toepassing se bedryfstatus:

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

Gevolgtrekking

Dit blyk taamlik ingewikkeld te wees, maar ek is seker dat 'n ervare administrateur dit sal kan implementeer en sy gebruikers sal behaag.

Soos beloof, skakel na github.

Vrae, voorstelle - laat dit asseblief in die kommentaar. Ook, as jy belangstel in hoe die ontwikkeling van hierdie integrasie verloop het, skryf, en in die volgende artikel sal ek probeer om alles in meer besonderhede te openbaar.

Bron: will.com

Voeg 'n opmerking