Asterisk eta Bitrix24 integrazioa

Asterisk eta Bitrix24 integrazioa
IP-PBX Asterisk eta CRM Bitrix24 sarean integratzeko aukera desberdinak daude, baina hala ere gurea idaztea erabaki dugu.

Funtzionalitateari dagokionez, dena estandarra da:

  • Bitrix24-n bezero baten telefono-zenbakia duen estekan klik eginez, Asterisk-ek klika egin den erabiltzailearen barne-zenbakia bezeroaren telefono-zenbakiarekin lotzen du. Bitrix24-n, deiaren erregistroa grabatzen da eta, deia amaitzean, elkarrizketaren grabazioa ateratzen da.
  • Asterisk-ek kanpotik dei bat jasotzen du - Bitrix24 interfazean bezero-txartela erakusten diogu dei hori heldu zaion langileari.
    Horrelako bezerorik ez badago, bezerogai berri bat sortzeko txartela irekiko dugu.
    Deia amaitu bezain laster, hori txartelean islatzen dugu eta elkarrizketaren grabazio bat ateratzen dugu.

Ebakiaren azpian dena nola konfiguratu eta github-erako esteka bat emango dizut esango dizut - bai, bai, hartu eta erabili!

Deskribapen orokorra

Gure integrazioa CallMe deitu genuen. CallMe PHPn idatzitako web aplikazio txiki bat da.

Erabilitako teknologiak eta zerbitzuak

  • PHP 5.6
  • PHP AMI liburutegia
  • Composer
  • Nginx + php-fpm
  • ikuskatzaile
  • AMI (Asterisk Manager Interface)
  • Bitrix webhook (REST APIaren ezarpen sinplifikatua)

Aurrez ezartzea

Asterisk duen zerbitzari batean, web zerbitzari bat instalatu behar duzu (guretzat nginx+php-fpm da), gainbegiratzailea eta git.

Instalazio komandoa (CentOS):

yum install nginx php-fpm supervisor git

Web zerbitzarirako sarbidea duen direktoriora joango gara, Git-etik aplikazioa atera eta karpetan beharrezko eskubideak ezarriko ditugu:


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

Ondoren, konfigura dezagun nginx, gure konfigurazioa bertan dago

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

Konfigurazioa aztertzen utziko dut, segurtasun-arazoak, ziurtagiria eskuratzea eta baita artikuluaren esparrutik kanpo web zerbitzari bat aukeratzea ere - asko idatzi da honi buruz. Aplikazioak ez du mugarik, http eta https-ren bidez funtzionatzen du.

https erabiltzen dugu, zifra dezagun ziurtagiria.

Dena ondo egin baduzu, estekan klik eginez gero, horrelako zerbait ikusi beharko zenuke

Asterisk eta Bitrix24 integrazioa

Bitrix24 konfiguratzea

Sor ditzagun bi webhook.

Sarrerako webhook.

Administratzailearen kontuaren azpian (1 IDarekin), jarraitu bidea: Aplikazioak -> Webhook -> Gehitu webhook -> Sarrerako webhook

Asterisk eta Bitrix24 integrazioa

Bete sarrerako webhook-aren parametroak pantaila-argazkietan bezala:

Asterisk eta Bitrix24 integrazioa

Asterisk eta Bitrix24 integrazioa

Eta egin klik gorde.

Gorde ondoren, Bitrix24-k sarrerako webhook-aren URLa emango du, adibidez:

Asterisk eta Bitrix24 integrazioa

Gorde URLaren bertsioa azken /profile/ gabe - aplikazioan erabiliko da sarrerako deiekin lan egiteko.

Hau daukat https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Irteerako webhook.

Aplikazioak -> Webhook -> Gehitu webhook -> Irteerako webhook

Xehetasunak berriro pantaila-argazkietan daude:

Asterisk eta Bitrix24 integrazioa

Asterisk eta Bitrix24 integrazioa

Gorde eta jaso baimen-kodea

Asterisk eta Bitrix24 integrazioa

Hau daukat xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Zuk ere kopiatu behar duzu; irteerako deiak egiteko behar duzu.

Garrantzitsua da!

Bitrix24 zerbitzarian SSL ziurtagiria konfiguratu behar da (letsencrypt erabil dezakezu), bestela Bitrix apiak ez du funtzionatuko. Hodeiko bertsioa baduzu, ez kezkatu - dagoeneko ssl du.

Garrantzitsua da!

"Prozesadorearen helbidea" eremuak Internetetik eskura daitekeen helbide bat izan behar du!

Eta azken ukitu gisa, instala ditzagun gure CallMeOut deiak egiteko aplikazio gisa (horrela PBXko zenbakian klik egiten duzunean, deia sortzeko komandoak ihes egingo du).

Menuan, hautatu: Gehiago -> Telefonia -> Gehiago -> Ezarpenak, ezarri "Irteerako dei-zenbaki lehenetsia" Aplikazioa: CallMeOut eta sakatu "Gorde"

Asterisk eta Bitrix24 integrazioa

Izartxoa konfiguratzen

Asterisk eta Bitrix24-ren arteko elkarrekintza arrakastatsua izateko, AMI erabiltzailea callme gehitu behar dugu manager.conf-era:

[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

Ondoren, dialplan bidez ezarri beharko diren hainbat trikimailu daude (guretzat hau extensions.ael da).

Fitxategi osoa emango dut, eta ondoren azalpen bat emango dut:

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

};

Has gaitezen hasieratik: zuzentaraua Globalak.

Aldakorra URLERREGISTROAK URLa elkarrizketak grabatzeko fitxategietan gordetzen du, eta, horren arabera, Bitrix24-k kontaktu-txartelera eramango ditu.

Ondoren makro makroa interesatzen zaigu Grabaketa.

Hemen, elkarrizketak grabatzeaz gain, aldagaia ezarriko dugu FullFname.

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

URL osoa fitxategi zehatz batean gordetzen du (makroa nonahi deitzen da).

Azter dezagun irteerako deia:

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

Demagun 89991234567 telefonora deitzen dugula, lehenik eta behin hona iristen garela:

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

horiek. Elkarrizketa grabatzeko makroari deitzen zaio eta beharrezko aldagaiak ezartzen dira.

Gehiago

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

Deia nork hasi duen grabatzen dugu eta deiaren hasiera-ordua grabatzen dugu.

Eta amaitutakoan, testuinguru berezi batean 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});
}

desgaitu luzapen honetarako CDR taularako sarrera (ez da beharrezkoa bertan), ezarri deiaren amaiera-ordua, kalkulatu iraupena, deiaren emaitza ezagutzen ez bada - ezarri (aldagaia CallMeDISPOSITION) eta, azken urratsa, bidali guztia Bitrixera sistema curl bidez.

Eta magia apur bat gehiago: sarrerako deia:

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

Hemen lerro bakarra interesatzen zaigu.

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

PBXari instalatzeko esaten dio Deitzailearen ID (izena) aldagaiaren berdina CallMeCallerIDName.

CallMeCallerIDName aldagaia bera, berriz, CallMe aplikazioak ezartzen du (Bitrix24-k deitzailearen zenbakiaren izen osoa badu, ezarri gisa Deitzailearen ID (izena), ez - ez dugu ezer egingo).

Aplikazioaren konfigurazioa

Aplikazioaren ezarpenen fitxategia - /var/www/pbx.vistep.ru/config.php

Aplikazio-parametroen deskribapena:

  • DeituMeDEBUG β€” 1 bada, aplikazioak prozesatutako gertaera guztiak erregistro fitxategian idatziko dira, 0 β€” ez dugu ezer idazten
  • tech - SIP/PJSIP/IAX/etab
  • authToken β€” Bitrix24 baimen-tokena, irteerako webhook baimen-kodea
  • bitrixApiUrl β€” Sarrerako webhook-aren URLa, profilik gabe/
  • luzapenak β€” kanpoko zenbakien zerrenda
  • Testuinguru β€” dei bat sortzeko testuingurua
  • listener_timeout β€” Gertaerak prozesatzeko abiadura izartxotik
  • Asteriskoa β€” izartxora konektatzeko ezarpenak dituen array bat:
  • ostalari β€” izartxoaren zerbitzariaren ip edo ostalari-izena
  • eskema β€” konexio diagrama (tcp://, tls://)
  • portu - portua
  • erabiltzailea - Erabiltzaile izena
  • sekretua - pasahitza
  • connect_timeout β€” konexioaren denbora-muga
  • irakurri_denbora - irakurri denbora-muga

adibidea ezarpen fitxategia:

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

);

Begiralearen konfigurazioa

Gainbegiralea Asterisk CallMeIn.php-tik gertaeren kudeatzailearen prozesua abiarazteko erabiltzen da, sarrerako deiak kontrolatzen dituena eta Bitrix24-rekin elkarreragiten duen (erakutsi txartela, ezkutatu txartela, etab.).

Sortu beharreko ezarpen-fitxategia:

/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

Abiarazi eta berrabiarazi aplikazioa:

supervisorctl start callme
supervisorctl restart callme

Aplikazioaren funtzionamendu-egoera ikustea:

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

Ondorioa

Nahiko konplikatua izan zen, baina ziur nago esperientziadun administratzaile batek inplementatu eta bere erabiltzaileei atsegin izango diela.

Agindu bezala, github-erako esteka.

Galderak, iradokizunak - utzi iruzkinetan. Gainera, integrazio honen garapena nola joan den interesatzen bazaizu, idatzi, eta hurrengo artikuluan saiatuko naiz guztia zehatzago azaltzen.

Iturria: www.habr.com

Gehitu iruzkin berria