Integration ti Aami akiyesi ati Bitrix24

Integration ti Aami akiyesi ati Bitrix24
Awọn aṣayan oriṣiriṣi wa fun sisọpọ Aami akiyesi IP-PBX ati CRM Bitrix24 lori nẹtiwọọki, ṣugbọn a tun pinnu lati kọ tiwa.

Ni awọn ofin ti iṣẹ ṣiṣe, ohun gbogbo jẹ boṣewa:

  • Nipa titẹ si ọna asopọ pẹlu nọmba foonu alabara ni Bitrix24, Aami akiyesi so nọmba inu ti olumulo fun orukọ ẹniti tẹ tẹ pẹlu nọmba foonu alabara. Ni Bitrix24, igbasilẹ ipe ti wa ni igbasilẹ ati ni ipari ipe, gbigbasilẹ ibaraẹnisọrọ ti fa soke.
  • Aami akiyesi gba ipe lati ita - ni wiwo Bitrix24 a fihan kaadi alabara si oṣiṣẹ ti nọmba rẹ ti ipe yii de.
    Ti ko ba si iru onibara, a yoo ṣii kaadi fun ṣiṣẹda titun kan asiwaju.
    Ni kete ti ipe naa ba ti pari, a ṣe afihan eyi lori kaadi ati fa igbasilẹ ti ibaraẹnisọrọ naa.

Ni isalẹ gige Emi yoo sọ fun ọ bi o ṣe le ṣeto ohun gbogbo fun ararẹ ati fun ọ ni ọna asopọ si github - bẹẹni, bẹẹni, gba ati lo!

Apejuwe gbogbogbo

A pe isọpọ wa CallMe. CallMe jẹ ohun elo wẹẹbu kekere ti a kọ sinu PHP.

Awọn imọ-ẹrọ ati awọn iṣẹ ti a lo

  • PHP 5.6
  • PHP AMI ìkàwé
  • olupilẹṣẹ
  • Nginx + php-fpm
  • olutọju
  • AMI (Iroju Aṣabojuto Aami akiyesi)
  • Bitrix webhooks (imuse REST API ti o rọrun)

Iṣeto-tẹlẹ

Lori olupin pẹlu Aami akiyesi, o nilo lati fi sori ẹrọ olupin wẹẹbu kan (fun wa o jẹ nginx+php-fpm), alabojuto ati git.

Aṣẹ fifi sori ẹrọ (CentOS):

yum install nginx php-fpm supervisor git

A lọ si itọsọna ti o wọle si olupin wẹẹbu, fa ohun elo lati Git ki o ṣeto awọn ẹtọ to wulo si folda naa:


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

Nigbamii, jẹ ki a tunto nginx, atunto wa wa ninu

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

Emi yoo lọ kuro ni atunto atunto, awọn ọran aabo, gbigba ijẹrisi ati paapaa yiyan olupin wẹẹbu kan ni ita aaye ti nkan naa - pupọ ni a ti kọ nipa eyi. Ohun elo naa ko ni awọn ihamọ, o ṣiṣẹ lori mejeeji http ati https.

A lo https, jẹ ki a encrypt ijẹrisi.

Ti o ba ṣe ohun gbogbo ni deede, lẹhinna nipa tite lori ọna asopọ o yẹ ki o wo nkan bi eyi

Integration ti Aami akiyesi ati Bitrix24

Ṣiṣeto Bitrix24

Jẹ ká ṣẹda meji webhooks.

ti nwọle webhook.

Labẹ akọọlẹ alakoso (pẹlu id 1), tẹle ọna: Awọn ohun elo -> Awọn oju opo wẹẹbu -> Ṣafikun webhook -> Hook wẹẹbu ti nwọle

Integration ti Aami akiyesi ati Bitrix24

Fọwọsi awọn paramita ti webhook ti nwọle bi ninu awọn sikirinisoti:

Integration ti Aami akiyesi ati Bitrix24

Integration ti Aami akiyesi ati Bitrix24

Ki o si tẹ Fipamọ.

Lẹhin fifipamọ, Bitrix24 yoo pese URL ti webhook ti nwọle, fun apẹẹrẹ:

Integration ti Aami akiyesi ati Bitrix24

Ṣafipamọ ẹya URL rẹ laisi ipari / profaili/ - yoo ṣee lo ninu ohun elo lati ṣiṣẹ pẹlu awọn ipe ti nwọle.

Mo ni eyi https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Ti njade webhook.

Awọn ohun elo -> Awọn iwo wẹẹbu -> Ṣafikun kio wẹẹbu –> Hook wẹẹbu ti njade

Awọn alaye wa lẹẹkansi lori awọn sikirinisoti:

Integration ti Aami akiyesi ati Bitrix24

Integration ti Aami akiyesi ati Bitrix24

Fipamọ ati gba koodu igbanilaaye

Integration ti Aami akiyesi ati Bitrix24

Mo ni eyi xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. O tun nilo lati daakọ rẹ funrararẹ; o nilo rẹ lati ṣe awọn ipe ti njade.

Pataki!

Ijẹrisi SSL gbọdọ wa ni tunto lori olupin Bitrix24 (o le lo letsencrypt), bibẹẹkọ api Bitrix kii yoo ṣiṣẹ. Ti o ba ni ẹya awọsanma, maṣe yọ ara rẹ lẹnu - o ti ni ssl tẹlẹ.

Pataki!

Aaye “Adirẹsi isise” gbọdọ ni adirẹsi ti o wa lati Intanẹẹti ninu!

Ati bi ifọwọkan ikẹhin, jẹ ki a fi sori ẹrọ CallMeOut wa bi ohun elo fun ṣiṣe awọn ipe (ki nigba ti o ba tẹ nọmba lori PBX, aṣẹ fun ipilẹṣẹ ipe yoo fo kuro).

Ninu akojọ aṣayan, yan: Diẹ sii -> Tẹlifoonu -> Diẹ sii -> Eto, ṣeto ni “Nọmba ipe ti njade Aiyipada” Ohun elo: CallMeOut ki o tẹ “Fipamọ”

Integration ti Aami akiyesi ati Bitrix24

Ṣiṣeto aami akiyesi

Fun ibaraenisepo aṣeyọri laarin Aami akiyesi ati Bitrix24, a nilo lati ṣafikun AMI callme olumulo si 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

Nigbamii ti, awọn ẹtan pupọ wa ti yoo nilo lati ṣe imuse nipasẹ dialplan (fun wa eyi ni extensions.ael).

Emi yoo pese gbogbo faili naa, lẹhinna Emi yoo fun alaye kan:

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

};

Jẹ ki a bẹrẹ lati ibẹrẹ: itọsọna naa awọn ibọwọ agbaye.

Oniyipada Awọn igbasilẹ URL tọju URL naa si awọn faili gbigbasilẹ ibaraẹnisọrọ, ni ibamu si eyiti Bitrix24 yoo fa wọn sinu kaadi olubasọrọ.

Nigbamii ti a nifẹ si Makiro gbigbasilẹ.

Nibi, ni afikun si awọn ibaraẹnisọrọ gbigbasilẹ, a yoo ṣeto oniyipada FullForukọsilẹ.

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

O tọju URL ni kikun si faili kan pato (macro ni a pe ni ibi gbogbo).

Jẹ ki a ṣe itupalẹ ipe ti njade:

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

Jẹ ká sọ pe a pe 89991234567, akọkọ ti a gba nibi:

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

awon. Makiro gbigbasilẹ ibaraẹnisọrọ ni a pe ati awọn oniyipada pataki ti ṣeto.

Nigbamii ti o wa

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

A ṣe igbasilẹ ẹniti o bẹrẹ ipe ati ṣe igbasilẹ akoko ibẹrẹ ipe naa.

Ati ni ipari rẹ, ni aaye pataki kan 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});
}

mu gbigbasilẹ ṣiṣẹ ni tabili CDR fun itẹsiwaju yii (ko nilo nibẹ), ṣeto akoko ipari ti ipe, ṣe iṣiro iye akoko, ti abajade ipe ko ba mọ - ṣeto (ayipada) CallMeDISPOSITION) ati, igbesẹ ti o kẹhin, firanṣẹ ohun gbogbo si Bitrix nipasẹ ọna ẹrọ.

Ati idan diẹ diẹ sii - ipe ti nwọle:

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

Nibi a nifẹ si laini kan nikan.

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

O sọ fun PBX lati fi sori ẹrọ ID (orukọ) dogba si oniyipada CallMeCallerIDOrukọ.

Oluyipada CallMeCallerIDName funrararẹ, ni ọna, ti ṣeto nipasẹ ohun elo CallMe (ti Bitrix24 ba ni orukọ kikun fun nọmba olupe, ṣeto bi ID (orukọ)Rara - a kii yoo ṣe ohunkohun).

Eto ohun elo

Faili eto ohun elo - /var/www/pbx.vistep.ru/config.php

Apejuwe awọn paramita ohun elo:

  • PeMeDEBUG - ti o ba jẹ 1, lẹhinna gbogbo awọn iṣẹlẹ ti o ni ilọsiwaju nipasẹ ohun elo naa yoo kọ si faili log, 0 — a ko kọ ohunkohun
  • tekinoloji - SIP/PJSIP/IAX/ati be be lo
  • authToken - Aami aṣẹ aṣẹ Bitrix24, koodu aṣẹ aṣẹ webhook ti njade
  • bitrixApiUrl - URL ti webhook ti nwọle, laisi profaili /
  • awọn iwọn - akojọ awọn nọmba ita
  • o tọ - agbegbe fun ipilẹṣẹ ipe kan
  • gbo_akoko - iyara ti processing iṣẹlẹ lati aami akiyesi
  • aami akiyesi kan - opo pẹlu awọn eto fun sisopọ si aami akiyesi:
  • ogun - ip tabi orukọ olupin ti olupin aami akiyesi
  • Eto - aworan asopọ (tcp: //, tls: //)
  • ibudo - ibudo
  • olumulo - Orukọ olumulo
  • ìkọkọ - ọrọigbaniwọle
  • connect_timeout - akoko ipari asopọ
  • kika_akoko - ka akoko

faili eto apẹẹrẹ:

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

);

Eto olubẹwo

A lo olubẹwo lati ṣe ifilọlẹ ilana olutọju iṣẹlẹ lati Aami akiyesi CallMeIn.php, eyiti o ṣe abojuto awọn ipe ti nwọle ati ibaraenisepo pẹlu Bitrix24 (kaadi ifihan, kaadi tọju, ati bẹbẹ lọ).

Faili eto lati ṣẹda:

/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

Lọlẹ ki o tun ohun elo naa bẹrẹ:

supervisorctl start callme
supervisorctl restart callme

Wiwo ipo iṣẹ ohun elo naa:

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

ipari

O wa ni idiju pupọ, ṣugbọn Mo ni idaniloju pe oluṣakoso ti o ni iriri yoo ni anfani lati ṣe imuse rẹ ki o wu awọn olumulo rẹ.

Gẹgẹbi ileri, ọna asopọ si github.

Awọn ibeere, awọn imọran - jọwọ fi wọn silẹ ninu awọn asọye. Paapaa, ti o ba nifẹ si bii idagbasoke iṣọpọ yii ṣe lọ, kọ, ati ninu nkan atẹle Emi yoo gbiyanju lati ṣafihan ohun gbogbo ni awọn alaye diẹ sii.

orisun: www.habr.com

Fi ọrọìwòye kun