Asteriski ja Bitrix24 integreerimine

Asteriski ja Bitrix24 integreerimine
Võrgul on IP-PBX Asteriski ja CRM Bitrix24 integreerimiseks erinevad võimalused, kuid otsustasime sellegipoolest kirjutada oma.

Funktsionaalselt on kõik standardne:

  • Klikkides Bitrix24-s kliendi telefoninumbriga lingil, ühendab Asterisk selle kasutaja sisenumbri, kelle nimel see klõps tehti, kliendi telefoninumbriga. Bitrix24-s salvestatakse kõne salvestis ja kõne lõpus tõmmatakse vestluskirje üles.
  • Asteriskisse saabub kõne väljast - Bitrix24 liideses näitame kliendikaarti töötajale, kelle numbrile see kõne saabus.
    Kui sellist klienti pole, avage uue müügivihje loomiseks kaart.
    Niipea kui kõne on lõpetatud, kajastame seda kaardil ja tõmbame vestluse salvestise üles.

Lõike all räägin teile, kuidas kõike enda jaoks seadistada ja annan githubi lingi - jah, jah, võtke ja kasutage!

Üldine kirjeldus

Nimetasime oma integratsiooni CallMe. CallMe on väike PHP-s kirjutatud veebirakendus.

Kasutatud tehnoloogiad ja teenused

  • PHP 5.6
  • PHP AMI raamatukogu
  • Koostama
  • nginx + php fpm
  • juhendaja
  • AMI (tärnihalduri liides)
  • Bitrixi veebihaagid (lihtsustatud REST API juurutamine)

eelseadistus

Asteriskiga serverisse tuleb installida veebiserver (meil on nginx + php-fpm), supervisor ja git.

Installimiskäsk (CentOS):

yum install nginx php-fpm supervisor git

Edastame veebiserverile saadaoleva kataloogi, tõmbame rakenduse gitist ja määrame kaustale vajalikud õigused:


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

Järgmisena konfigureerige nginx, meie konfiguratsioon asub

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

Jätan konfiguratsiooni analüüsi, turvaprobleemid, sertifikaadi saamine ja isegi veebiserveri valimine artiklist väljapoole - sellest on palju kirjutatud. Rakendusel pole piiranguid, see töötab nii http kui ka https.

Meil on https, krüpteerime sertifikaadi.

Kui tegite kõik õigesti, peaksite lingil klõpsates nägema midagi sellist

Asteriski ja Bitrix24 integreerimine

Bitrix24 seadistamine

Loome kaks veebihaagi.

Sissetulev veebihaak.

Administraatori konto all (ID-ga 1) minge mööda teed: Rakendused -> Veebihaagid -> Lisa veebihaak -> Sissetulev veebihaak

Asteriski ja Bitrix24 integreerimine

Täitke sissetuleva veebihaagi parameetrid nagu ekraanipiltidel:

Asteriski ja Bitrix24 integreerimine

Asteriski ja Bitrix24 integreerimine

Ja klõpsake Salvesta.

Pärast salvestamist annab Bitrix24 sissetuleva veebihaagi URL-i, näiteks:

Asteriski ja Bitrix24 integreerimine

Salvestage oma URL-i versioon ilma lõpu /profiilita – seda kasutatakse rakenduses sissetulevate kõnedega töötamiseks.

mul on see https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Väljuv veebihaak.

Rakendused -> Veebihaagid -> Lisa veebihaak -> Väljuv veebihaak

Üksikasjad on ekraanipiltidel:

Asteriski ja Bitrix24 integreerimine

Asteriski ja Bitrix24 integreerimine

Salvestage ja hankige autoriseerimiskood

Asteriski ja Bitrix24 integreerimine

mul on see xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Samuti peate selle endale kopeerima, seda on vaja väljaminevate kõnede tegemiseks.

Tähtis!

Bitrix24 serveris peab olema seadistatud ssl-sertifikaat (saate kasutada letsencrypti), muidu BitrixXNUMX api ei tööta. Kui teil on pilveversioon, ärge muretsege – ssl on juba olemas.

Tähtis!

Väljale "Protsessori aadress" tuleb märkida Internetist ligipääsetav aadress!

Ja viimase lihviga installime oma CallMeOuti kõnede tegemise rakendusena (nii et PBX-i numbril klõpsates lendaks käsk kõne algatamiseks).

Valige menüüst: More -> Telefony -> More -> Settings, sisestage "Vaikimisi väljaminevate kõnede number" Rakendus: CallMeOut ja klõpsake "Salvesta"

Asteriski ja Bitrix24 integreerimine

tärni seadistus

Edukaks suhtlemiseks Asteriski ja Bitrix24 vahel peame faili manager.conf lisama callme AMI kasutaja:

[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

Järgmiseks on mõned nipid, mida tuleb dialplani abil rakendada (meil on laiendid.ael).

Tsiteerin kogu faili ja siis annan selgitused:

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

};

Alustame algusest: direktiiv globaalsed.

Muutuv URLRECORDS salvestab vestluse salvestusfailide URL-i, mille järgi Bitrix24 tõmbab need kontaktikaardile.

Järgmiseks oleme huvitatud makromakrost salvestamine.

Siin määrame lisaks vestluste salvestamisele ka muutuja FullFname.

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

See salvestab konkreetse faili täieliku URL-i (makrot kutsutakse kõikjal).

Analüüsime väljaminevat kõnet:

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

Oletame, et helistame esimese asjana numbril 89991234567:

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

need. kutsutakse välja kõne salvestamise makro ja seadistatakse vajalikud muutujad.

Edasi

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

salvestame kõne algataja ja salvestame kõne algusaja.

Ja selle valmimisel erilises kontekstis 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});
}

lülita selle laienduse CDR-i tabelis välja kirje (seda pole seal vaja), määra kõne lõpuaeg, arvuta kestus, kui kõne tulemus pole teada - määra (muutuja Helista mulle DISPOSITION) ja viimase sammuna saatke kõik süsteemi curl kaudu Bitrixile.

Ja veel natuke maagiat – sissetulev kõne:

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

Siin huvitab meid ainult üks rida.

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

Ta ütleb, et paigalda PBX Helistaja ID(nimi) muutuv CallMeCallerIDName.

CallMeCallerIDName muutuja ise määrab omakorda CallMe rakendus (kui Bitrix24-l on helistaja numbri täisnimi, siis paneme selle Helistaja ID(nimi), ei – me ei tee midagi).

Rakenduse seadistamine

Rakenduse seadete fail - /var/www/pbx.vistep.ru/config.php

Rakenduse parameetrite kirjeldus:

  • CallMeDEBUG - kui 1, siis kõik rakenduse poolt töödeldud sündmused kirjutatakse logifaili, 0 - me ei kirjuta midagi
  • tech SIP/PJSIP/IAX/jne
  • authToken — Bitrix24 autoriseerimisluba, väljamineva veebihaagi autoriseerimiskood
  • bitrixApiUrl — sissetuleva veebihaagi URL, ilma profiilita/
  • laiendused — välisnumbrite loend
  • kontekst — kõne algatamise kontekst
  • kuulaja_ajalõpp - sündmuste töötlemise kiirus alates tärnist
  • tärniga - massiiv ühenduse sätetega tärniga:
  • võõrustaja - tärniga serveri IP või hostinimi
  • kava - ühendusskeem (tcp://, tls://)
  • port - sadam
  • kasutajanimi - Kasutajanimi
  • saladus - parool
  • connect_timeout - ühenduse ajalõpp
  • read_timeout - lugemise ajalõpp

näidisseadete fail:

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

);

Juhendaja seadistamine

Supervisorit kasutatakse Asterisk CallMeIn.php sündmuste käitleja protsessi käivitamiseks, mis jälgib sissetulevaid kõnesid ja suhtleb Bitrix24-ga (näita kaarti, peida kaarti jne).

Loodav seadete fail:

/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

Rakenduse käivitamine ja taaskäivitamine:

supervisorctl start callme
supervisorctl restart callme

vaadake rakenduse olekut:

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

Järeldus

See osutus üsna keeruliseks, kuid olen kindel, et kogenud administraator suudab oma kasutajaid rakendada ja rõõmustada.

Nagu lubatud, link githubile.

Küsimused, ettepanekud - palun kommentaarides. Samuti, kui olete huvitatud sellest, kuidas selle integratsiooni areng läks, kirjutage ja järgmises artiklis proovin kõike üksikasjalikumalt paljastada.

Allikas: www.habr.com

Lisa kommentaar