Yntegraasje fan Asterisk en Bitrix24

Yntegraasje fan Asterisk en Bitrix24
It netwurk hat ferskate opsjes foar it yntegrearjen fan IP-PBX Asterisk en CRM Bitrix24, mar wy hawwe lykwols besletten om ús eigen te skriuwen.

Funksjoneel is alles standert:

  • Troch te klikken op de keppeling mei it telefoannûmer fan de klant yn Bitrix24, ferbynt Asterisk it ynterne nûmer fan de brûker út namme fan wa't dizze klik makke is mei it telefoannûmer fan de klant. Yn Bitrix24 wurdt in rekord fan 'e oprop opnommen, en oan' e ein fan 'e oprop wurdt it konversaasjerekord ophelle.
  • In oprop komt by Asterisk fan bûten - yn 'e Bitrix24-ynterface litte wy de kliïntkaart sjen oan de meiwurker op waans nûmer dizze oprop kaam.
    As d'r gjin sa'n klant is, iepenje de kaart foar it meitsjen fan in nije lead.
    Sadree't de oprop foltôge is, reflektearje wy dit yn 'e kaart en lûke de opname fan it petear op.

Under de besuniging sil ik jo fertelle hoe't jo alles foar josels kinne ynstelle en in keppeling jaan oan github - ja, ja, nim it en brûk it!

Algemiene beskriuwing

Wy neamden ús yntegraasje CallMe. CallMe is in lytse webapplikaasje skreaun yn PHP.

Brûkte technologyen en tsjinsten

  • PHP 5.6
  • PHP AMI Bibleteek
  • komponist
  • nginx + php fpm
  • supervisor
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (ferfâldige REST API ymplemintaasje)

foarôf ynstelle

Op de server mei Asterisk moatte jo in webserver ynstallearje (wy hawwe nginx + php-fpm), supervisor en git.

Ynstallaasjekommando (CentOS):

yum install nginx php-fpm supervisor git

Wy passe de map beskikber foar de webserver, lûke de applikaasje út 'e git en set de nedige rjochten yn' e map:


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

Konfigurearje dan nginx, ús konfiguraasje leit yn

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

Ik sil de analyse fan 'e konfiguraasje, feiligensproblemen, it krijen fan in sertifikaat, en sels it kiezen fan in webserver bûten it berik fan it artikel litte - hjir is in protte oer skreaun. De applikaasje hat gjin beheiningen, it wurket op sawol http as https.

Wy hawwe https, lit ús sertifikaat fersiferje.

As jo ​​​​alles goed dien hawwe, dan moatte jo troch op de keppeling te klikken soks sjen

Yntegraasje fan Asterisk en Bitrix24

Bitrix24 ynstelle

Litte wy twa webhooks oanmeitsje.

Ynkommende webhook.

Under it administrator akkount (mei id 1) gean lâns it paad: Applikaasjes -> Webhooks -> Webhook tafoegje -> Ynkommende webhook

Yntegraasje fan Asterisk en Bitrix24

Folje de parameters fan 'e ynkommende webhook yn lykas yn' e skermôfbyldings:

Yntegraasje fan Asterisk en Bitrix24

Yntegraasje fan Asterisk en Bitrix24

En klik op bewarje.

Nei it bewarjen sil Bitrix24 de URL fan 'e ynkommende webhook leverje, bygelyks:

Yntegraasje fan Asterisk en Bitrix24

Bewarje jo ferzje fan 'e URL sûnder it efterfolgjende /profyl/ - it sil brûkt wurde yn 'e applikaasje om te wurkjen mei ynkommende oproppen.

ik haw it https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Utgeande webhook.

Applikaasjes -> Webhooks -> Webhook tafoegje -> Utgeande Webhook

Details binne op 'e skermôfbyldings:

Yntegraasje fan Asterisk en Bitrix24

Yntegraasje fan Asterisk en Bitrix24

Bewarje en krije de autorisaasjekoade

Yntegraasje fan Asterisk en Bitrix24

ik haw it xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Jo moatte it ek nei josels kopiearje, it is nedich om útgeande oproppen te meitsjen.

Wichtich!

In ssl-sertifikaat moat konfigureare wurde op de Bitrix24-tsjinner (jo kinne letsencrypt brûke), oars sil de BitrixXNUMX-api net wurkje. As jo ​​​​in wolkferzje hawwe, meitsje jo gjin soargen - ssl is der al.

Wichtich!

Yn it fjild "Address prosessor" moat in adres oanjûn wurde dat tagonklik is fan it ynternet!

En mei de lêste touch, litte wy ús CallMeOut ynstallearje as in applikaasje foar it meitsjen fan petearen (sadat troch te klikken op it nûmer op 'e PBX, in kommando sil fleane om de oprop te begjinnen).

Selektearje yn it menu: Mear -> Tillefoany -> Mear -> Ynstellings, ynsteld op "Nûmer foar útgeande oproppen standert" Applikaasje: CallMeOut en klik op "Bewarje"

Yntegraasje fan Asterisk en Bitrix24

asterisk opset

Foar suksesfolle ynteraksje tusken Asterisk en Bitrix24 moatte wy de callme AMI-brûker tafoegje oan 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

Dêrnei binne d'r in pear trúkjes dy't moatte wurde ymplementearre mei help fan dialplan (wy hawwe extensions.ael).

Ik sil it hiele bestân sitearje, en dan sil ik útlis jaan:

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

};

Litte wy fan it begjin ôf begjinne: rjochtline wrâldwide.

Variable URLRECORDS bewarret de URL nei de konversaasje opname triemmen, neffens hokker Bitrix24 sil lûke se yn de kontakt kaart.

Folgjende, wy binne ynteressearre yn makro makro opname.

Hjir sille wy, neist it opnimmen fan petearen, de fariabele ynstelle FullFname.

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

It bewarret de folsleine URL nei in spesifyk bestân (de makro wurdt oeral neamd).

Litte wy de útgeande oprop analysearje:

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

Litte wy sizze dat wy 89991234567 skilje, it earste dat wy hjir krije:

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

dy. de oprop opname makro wurdt neamd en de nedige fariabelen wurde ynsteld.

fierder

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

wy registrearje wa't de oprop inisjearre en de starttiid fan 'e oprop opnimme.

En nei syn foltôging, yn in spesjale 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});
}

útsette de yngong yn 'e CDR-tabel foar dizze tafoeging (it is dêr net nedich), set de eintiid fan' e oprop yn, berekkenje de doer, as it resultaat fan 'e oprop net bekend is - set (fariabele) Neam my DISPOSISJON) en, de lêste stap, stjoer alles nei Bitrix fia de systeemkrullen.

En in bytsje mear magy - in ynkommende oprop:

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

Hjir binne wy ​​mar ynteressearre yn ien rigel.

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

Se seit PBX ynstallearje CallerID (namme) fariabele CallMeCallerIDName.

De CallMeCallerIDName-fariabele sels wurdt op syn beurt ynsteld troch de CallMe-applikaasje (as Bitrix24 in folsleine namme hat foar it nûmer fan de beller, sille wy it ynstelle as CallerID (namme), nee - wy sille neat dwaan).

Applikaasje opset

Applikaasje-ynstellingsbestân - /var/www/pbx.vistep.ru/config.php

Beskriuwing fan tapassing parameters:

  • CallMeDEBUG - as 1, dan wurde alle eveneminten ferwurke troch de applikaasje skreaun nei it logbestân, 0 - wy skriuwe neat
  • tech SIP/PJSIP/IAX/etc
  • authToken - Bitrix24 autorisaasje token, útgeande webhook autorisaasje koade
  • bitrixApiUrl - URL fan de ynkommende webhook, sûnder profyl/
  • extensions - list fan eksterne nûmers
  • kontekst - kontekst foar oprop ûntstean
  • listener_timeout - evenemint ferwurkjen snelheid fan asterisk
  • stjerke - in array mei de ferbiningynstellingen nei it asterisk:
  • gasthear - ip of hostnamme fan de asterisk-tsjinner
  • skema - ferbiningsdiagram (tcp://, tls://)
  • haven - haven
  • brûkersnamme - Brûkersnamme
  • geheim - wachtwurd
  • connect_timeout - ferbining timeout
  • read_timeout - timeout lêze

foarbyld ynstellingsbestân:

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

);

Supervisor opset

Supervisor wurdt brûkt om it Asterisk CallMeIn.php-eveneminthannelerproses te starten, dat ynkommende petearen kontrolearret en ynteraksje mei Bitrix24 (de kaart sjen litte, de kaart ferbergje, ensfh.).

Ynstellingsbestân om te meitsjen:

/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

De applikaasje begjinne en opnij starte:

supervisorctl start callme
supervisorctl restart callme

besjoch de status fan 'e applikaasje:

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

konklúzje

It die bliken frij lestich, mar ik bin der wis fan dat in betûfte behearder sil by steat wêze om te fieren en please syn brûkers.

As tasein, keppeling nei github.

Fragen, suggestjes - asjebleaft yn 'e kommentaren. Ek, as jo ynteressearre binne yn hoe't de ûntwikkeling fan dizze yntegraasje gie, skriuw dan, en yn it folgjende artikel sil ik besykje alles yn mear detail te iepenbierjen.

Boarne: www.habr.com

Add a comment