Paghiusa sa Asterisk ug Bitrix24

Paghiusa sa Asterisk ug Bitrix24
Ang network adunay lainlaing mga kapilian alang sa pag-integrate sa IP-PBX Asterisk ug CRM Bitrix24, apan kami, bisan pa, nakahukom sa pagsulat sa among kaugalingon.

Sa pag-andar, ang tanan standard:

  • Pinaagi sa pag-klik sa link nga adunay numero sa telepono sa kliyente sa Bitrix24, gikonektar sa Asterisk ang internal nga numero sa tiggamit alang sa kung kinsa kini nga pag-klik gihimo gamit ang numero sa telepono sa kliyente. Sa Bitrix24, usa ka rekord sa tawag ang natala, ug sa pagtapos sa tawag, ang rekord sa panag-istoryahanay gikuha.
  • Usa ka tawag ang miabot sa Asterisk gikan sa gawas - sa Bitrix24 interface, among gipakita ang client card ngadto sa empleyado kang kansang numero miabot kini nga tawag.
    Kung walay ingon nga kliyente, ablihi ang kard alang sa paghimo og bag-ong tingga.
    Sa diha nga ang tawag makompleto, among gipakita kini sa kard ug gibira ang pagrekord sa panag-istoryahanay.

Ubos sa pagputol, sultihan ko ikaw kung giunsa ang pag-set up sa tanan alang sa imong kaugalingon ug paghatag usa ka link sa github - oo, oo, kuhaa kini ug gamita kini!

Kinatibuk-ang pagpasabut

Gitawag namon ang among panagsama nga CallMe. Ang CallMe usa ka gamay nga aplikasyon sa web nga gisulat sa PHP.

Gigamit nga mga teknolohiya ug serbisyo

  • PHP 5.6
  • PHP AMI Library
  • kompositor
  • nginx + php fpm
  • superbisor
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (gipasimple nga pagpatuman sa REST API)

presetting

Sa server nga adunay Asterisk, kinahanglan nimo nga i-install ang usa ka web server (naa kami nginx + php-fpm), superbisor ug git.

Pag-instalar nga sugo (CentOS):

yum install nginx php-fpm supervisor git

Gipasa namo ang direktoryo nga anaa sa web server, gibira ang aplikasyon gikan sa git ug gibutang ang gikinahanglan nga mga katungod sa folder:


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

Sunod, i-configure ang nginx, ang among config nahimutang sa

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

Ibilin nako ang pag-analisar sa config, mga isyu sa seguridad, pagkuha usa ka sertipiko, ug bisan ang pagpili sa usa ka web server sa gawas sa sulud sa artikulo - daghan ang nasulat bahin niini. Ang aplikasyon walay mga pagdili, kini nagtrabaho sa duha sa http ug https.

Naa tay https, i-encrypt nato ang certificate.

Kung gibuhat nimo ang tanan nga husto, unya pinaagi sa pag-klik sa link kinahanglan nimo nga makita ang usa ka butang nga sama niini

Paghiusa sa Asterisk ug Bitrix24

Pag-set up sa Bitrix24

Magbuhat ta ug duha ka webhook.

Ang umaabot nga webhook.

Ubos sa administrator account (uban ang id 1) subay sa dalan: Aplikasyon -> Webhooks -> Add webhook -> Incoming webhook

Paghiusa sa Asterisk ug Bitrix24

Pun-a ang mga parameter sa umaabot nga webhook sama sa mga screenshot:

Paghiusa sa Asterisk ug Bitrix24

Paghiusa sa Asterisk ug Bitrix24

Ug i-klik ang save.

Pagkahuman sa pagtipig, ang Bitrix24 maghatag sa URL sa umaabot nga webhook, pananglitan:

Paghiusa sa Asterisk ug Bitrix24

I-save ang imong bersyon sa URL nga wala ang trailing /profile/ - gamiton kini sa aplikasyon aron magtrabaho sa mga umaabot nga tawag.

naa ko https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Mogawas nga webhook.

Aplikasyon -> Webhooks -> Idugang ang Webhook -> Outgoing Webhook

Ang mga detalye anaa sa mga screenshot:

Paghiusa sa Asterisk ug Bitrix24

Paghiusa sa Asterisk ug Bitrix24

I-save ug kuhaa ang authorization code

Paghiusa sa Asterisk ug Bitrix24

naa ko xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Kinahanglan nimo usab nga kopyahon kini sa imong kaugalingon, gikinahanglan kini aron makahimo mga outgoing nga tawag.

Importante!

Ang usa ka ssl nga sertipiko kinahanglan nga ma-configure sa Bitrix24 server (mahimo nimong gamiton ang letsencrypt), kung dili ang BitrixXNUMX api dili molihok. Kung naa kay cloud version, ayaw kabalaka - naa na ang ssl.

Importante!

Sa field nga "Address sa Processor", kinahanglan nga ipakita ang usa ka adres nga ma-access gikan sa Internet!

Ug sa kataposang paghikap, atong i-install ang atong CallMeOut isip aplikasyon sa paghimog mga tawag (aron pinaagi sa pag-klik sa numero sa PBX, usa ka sugo ang molupad aron sa pagsugod sa tawag).

Sa menu, pilia ang: More -> Telephony -> More -> Settings, ibutang sa "Number for outgoing calls by default" Application: CallMeOut ug i-klik ang "Save"

Paghiusa sa Asterisk ug Bitrix24

setup sa asterisk

Para sa malampusong interaksyon tali sa Asterisk ug Bitrix24, kinahanglan natong idugang ang callme AMI user sa 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

Sunod, adunay pipila ka mga limbong nga kinahanglan nga ipatuman gamit ang dialplan (naa kami mga extension.ael).

Akong kutloon ang tibuok nga file, ug dayon mohatag ko og mga pagpasabut:

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

};

Magsugod ta sa sinugdanan: direktiba mga globo.

Variable URLRECORDS gitipigan ang URL sa mga file sa pagrekord sa panag-istoryahanay, sumala sa diin ang Bitrix24 mobira kanila sa contact card.

Sunod, interesado kami sa macro macro Pagrekord.

Dinhi, dugang sa pagrekord sa mga panag-istoryahanay, atong ibutang ang variable Bug-os nga ngalan.

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

Gitipigan niini ang tibuuk nga URL sa usa ka piho nga file (gitawag ang macro bisan asa).

Atong analisahon ang migawas nga tawag:

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

Ingnon ta nga motawag ta sa 89991234567, ang unang butang nga atong makuha dinhi:

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

mga. ang tawag recording macro gitawag ug ang gikinahanglan nga mga baryable gitakda.

dugang pa

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

among girekord kung kinsa ang nagsugod sa tawag ug girekord ang oras sa pagsugod sa tawag.

Ug sa pagkahuman niini, sa usa ka espesyal nga konteksto 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});
}

i-off ang entry sa CDR table alang niini nga extension (dili kinahanglan didto), itakda ang oras sa pagtapos sa tawag, kuwentaha ang gidugayon, kung ang resulta sa tawag wala mahibal-an - set (variable Tawga kog DISPOSITION) ug, ang katapusang lakang, ipadala ang tanan sa Bitrix pinaagi sa system curl.

Ug gamay pa nga salamangka - usa ka umaabot nga tawag:

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

Dinhi kita interesado lamang sa usa ka linya.

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

Siya miingon nga PBX install CallerID(ngalan) variable CallMeCallerIDName.

Ang CallMeCallerIDName variable mismo, sa baylo, gitakda sa aplikasyon sa CallMe (kung ang Bitrix24 adunay tibuuk nga ngalan alang sa numero sa nagtawag, among itakda kini ingon CallerID(ngalan), dili - wala kami magbuhat bisan unsa).

Pag-setup sa aplikasyon

File sa mga setting sa aplikasyon - /var/www/pbx.vistep.ru/config.php

Deskripsyon sa mga parameter sa aplikasyon:

  • CallMeDEBUG - kung 1, nan ang tanan nga mga panghitabo nga giproseso sa aplikasyon isulat sa log file, 0 - wala kami magsulat bisan unsa
  • tech SIP/PJSIP/IAX/etc
  • authToken - Token sa pagtugot sa Bitrix24, kodigo sa pagtugot sa paggawas sa webhook
  • bitrixApiUrl β€” URL sa umaabot nga webhook, walay profile/
  • mga pagpadako - lista sa mga numero sa gawas
  • konteksto - konteksto alang sa gigikanan sa tawag
  • listener_timeout - katulin sa pagproseso sa panghitabo gikan sa asterisk
  • asterisk - usa ka laray nga adunay mga setting sa koneksyon sa asterisk:
  • panon - ip o hostname sa asterisk server
  • plano β€” diagram sa koneksyon (tcp://, tls://)
  • Dunggoanan - pantalan
  • username - Username
  • sekreto - password
  • connect_timeout - timeout sa koneksyon
  • read_timeout - basaha ang timeout

pananglitan nga mga setting sa file:

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

);

Pag-setup sa superbisor

Ang Supervisor gigamit sa paglunsad sa Asterisk CallMeIn.php event handler process, nga nagmonitor sa umaabot nga mga tawag ug nakig-interact sa Bitrix24 (ipakita ang card, itago ang card, ug uban pa).

Settings file nga himoon:

/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

Pagsugod ug pag-restart sa aplikasyon:

supervisorctl start callme
supervisorctl restart callme

tan-awa ang kahimtang sa aplikasyon:

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

konklusyon

Lisud kaayo kini, apan sigurado ako nga ang usa ka eksperyensiyado nga administrador makahimo sa pagpatuman ug pagpahimuot sa iyang mga tiggamit.

Ingon sa gisaad, link sa github.

Mga pangutana, sugyot - palihug sa mga komento. Ingon usab, kung interesado ka kung giunsa ang pag-uswag sa kini nga panagsama, isulat, ug sa sunod nga artikulo sulayan nako nga ipadayag ang tanan nga mas detalyado.

Source: www.habr.com

Idugang sa usa ka comment