Njikọ nke akara mmuke na Bitrix24

Njikọ nke akara mmuke na Bitrix24
Enwere nhọrọ dị iche iche maka ijikọ akara ngosi IP-PBX na CRM Bitrix24 na netwọkụ, mana anyị ka kpebiri ide nke anyị.

N'ọrụ, ihe niile bụ ọkọlọtọ:

  • Site na ịpị njikọ dị na nọmba ekwentị onye ahịa na Bitrix24, akara mmuke na-ejikọ ọnụ ọgụgụ dị n'ime nke onye ọrụ nke ejiri akara ekwentị onye ahịa jiri aha ya mee pịa ya. Na Bitrix24, a na-edekọ ndekọ oku ma na njedebe oku a, a na-adọta ndekọ mkparịta ụka.
  • Ihe akara mmuke na-enweta oku sitere na mpụga - na interface Bitrix24 anyị na-egosi kaadị onye ahịa onye ọrụ onye oku a rutere.
    Ọ bụrụ na enweghị onye ahịa dị otú ahụ, mepee kaadị maka ịmepụta ụzọ ọhụrụ.
    Ozugbo akpọchara oku a, anyị na-atụgharị uche na nke a na kaadị ma wepụta ndekọ nke mkparịta ụka ahụ.

N'okpuru ịkpụ m ga-agwa gị otu esi edozi ihe niile maka onwe gị wee nye gị njikọ github - ee, ee, were ya ma jiri ya!

Nkọwa zuru ezu

Anyị kpọrọ njikọ anyị CallMe. CallMe bụ obere ngwa webụ edere na PHP.

Teknụzụ na ọrụ ejiri

  • PHP 5.6
  • PHP AMI Library
  • andiwet
  • Nginx + php-fpm
  • onye nlekọta
  • AMI (Ntugharị njikwa akara akara)
  • Bitrix webhooks (mmejuputa REST API dị mfe)

presetting

Na sava nwere akara akara, ịkwesịrị ịwụnye sava weebụ (anyị nwere nginx + php-fpm), onye nlekọta na git.

Iwu nwụnye (CentOS):

yum install nginx php-fpm supervisor git

Anyị na-aga na ndekọ nke sava weebụ nwere ike ịnweta, dọpụta ngwa ahụ na Git wee tọọ ikike dị mkpa na folda ahụ:


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

Ọzọ, ka anyị hazie nginx, nhazi anyị dị na

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

M ga-ahapụ nyocha nke nhazi, okwu nchekwa, ịnweta akwụkwọ, na ọbụna ịhọrọ sava weebụ na-abụghị akụkụ nke isiokwu - ọtụtụ ihe edere banyere nke a. Ngwa ahụ enweghị ihe mgbochi, ọ na-arụ ọrụ na ma http na https.

Anyị nwere https, ka anyị zoo asambodo.

Ọ bụrụ na ịmere ihe niile n'ụzọ ziri ezi, mgbe ahụ site na ịpị njikọ ị ga-ahụ ihe dị ka nke a

Njikọ nke akara mmuke na Bitrix24

Ịtọlite ​​​​Bitrix24

Ka anyị mepụta webhooks abụọ.

nko webụ na-abata.

N'okpuru akaụntụ nchịkwa (ya na id 1), soro ụzọ: Ngwa -> Webhooks -> Tinye webhook -> webhook na-abata

Njikọ nke akara mmuke na Bitrix24

Dejupụta paramita nke webhook na-abata dị ka ọ dị na nseta ihuenyo:

Njikọ nke akara mmuke na Bitrix24

Njikọ nke akara mmuke na Bitrix24

Pịa Chekwa.

Mgbe ịchekwaa, Bitrix24 ga-enye URL nke webhook na-abata, dịka ọmụmaatụ:

Njikọ nke akara mmuke na Bitrix24

Chekwaa ụdị URL gị na-enweghị ikpeazụ /profaịlụ/ - a ga-eji ya na ngwa iji rụọ ọrụ na oku mbata.

Enwere m ya https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

nko webụ na-apụ apụ.

Ngwa -> Webhooks -> Tinye webhook -> nko webụ na-apụ apụ

Nkọwa dị na nseta ihuenyo:

Njikọ nke akara mmuke na Bitrix24

Njikọ nke akara mmuke na Bitrix24

Chekwa ma nweta koodu ikike

Njikọ nke akara mmuke na Bitrix24

Enwere m ya xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Ikwesiri iṅomi ya n'onwe gị, ọ dị mkpa iji mee oku ọpụpụ.

Ihe dị mkpa!

Ekwesịrị ịhazi akwụkwọ SSL na sava Bitrix24 (ị nwere ike iji letsencrypt), ma ọ bụghị ya, api Bitrix agaghị arụ ọrụ. Ọ bụrụ na ị nwere ụdị igwe ojii, echegbula onwe gị - o nweela ssl.

Ihe dị mkpa!

N'ime "adreesị nhazi" ahụ, a ga-egosirịrị adreesị a na-enweta na ịntanetị!

Na dị ka mmetụ ikpeazụ, ka anyị wụnye CallMeOut anyị dị ka ngwa maka ịkpọ oku (nke mere na mgbe ịpịrị nọmba na PBX, iwu maka ịmalite oku ahụ ga-efepụ).

N'ime menu, họrọ: More -> Telephony -> Ndị ọzọ -> Ntọala, tọọ na "nọmba oku ọpụpụ nke an-kpọ" Ngwa: CallMeOut wee pịa "Chekwa"

Njikọ nke akara mmuke na Bitrix24

nhazi akara mmuke

Maka mmekọrịta na-aga nke ọma n'etiti akara mmuke na Bitrix24, anyị kwesịrị ịgbakwunye oku onye ọrụ AMI na 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

Na-esote, enwere ọtụtụ aghụghọ ga-adị mkpa ka emejuputa ya site na dialplan (maka anyị nke a bụ extensions.ael).

M ga-ehota faịlụ ahụ dum, mgbe ahụ, m ga-enye nkọwa:

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

};

Ka anyị malite site na mmalite: ntuziaka ụwa.

Mgbanwe Ihe ndekọ URL na-echekwa URL na faịlụ ndekọ mkparịta ụka, dịka nke Bitrix24 ga-adọta ha na kaadị kọntaktị.

Ọzọ, anyị nwere mmasị na nnukwu macro ndekọ.

N'ebe a, na mgbakwunye na ndekọ mkparịta ụka, anyị ga-edozi mgbanwe FullFname.

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

Ọ na-echekwa URL zuru ezu na otu faịlụ (a na-akpọ macro ebe niile).

Ka anyị tụlee oku ọpụpụ:

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

Ka anyị kwuo na anyị na-akpọ 89991234567, nke mbụ anyị nwetara ebe a:

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

ndị ahụ. a na-akpọ nnukwu ndekọ ndekọ oku ma edobere mgbanwe ndị dị mkpa.

n'ihu

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

Anyị na-edekọ onye butere oku ma dekọọ oge mmalite nke oku a.

Na mgbe emechara ya, n'ọnọdụ pụrụ iche 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});
}

gbanyụọ ntinye na tebụl CDR maka ndọtị a (ọ dịghị mkpa n'ebe ahụ), tọọ oge njedebe nke oku ahụ, gbakọọ oge, ma ọ bụrụ na a maghị nsonaazụ oku ahụ - setịpụ (mgbanwe). KpọọMeMKWUO) na, nzọụkwụ ikpeazụ, ziga ihe niile na Bitrix site na usoro curl.

Na ntakịrị anwansi ọzọ - oku mbata:

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

N'ebe a, anyị nwere mmasị na otu ahịrị.

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

Ọ na-ekwu na PBX wụnye Onye ọkpụkpọ (aha) mgbanwe KpọọMeCallerAha.

CallMeCallerIDName na-agbanwe n'onwe ya, n'aka nke ya, nke ngwa CallMe na-edozi (ọ bụrụ na Bitrix24 nwere aha zuru ezu maka nọmba onye na-akpọ oku, anyị ga-edozi ya dị ka Onye ọkpụkpọ (aha), mba - anyị agaghị eme ihe ọ bụla).

Ntọlite ​​ngwa

Faịlụ ntọala ngwa - /var/www/pbx.vistep.ru/config.php

Nkọwa nke paramita ngwa:

  • KpọọMeDEBUG - ọ bụrụ 1, mgbe ahụ, a ga-edere ihe omume niile nke ngwa ahụ na-ede na faịlụ ndekọ, 0 - anyị anaghị ede ihe ọ bụla.
  • tech - SIP / PJSIP / IAX / wdg
  • autToken - akara ikike Bitrix24, koodu ikike webhook na-apụ apụ
  • bitrixApiUrl - URL nke webhook na-abata, na-enweghị profaịlụ /
  • ókè - ndepụta nke nọmba mpụga
  • onodu - ọnọdụ maka mmalite oku
  • onye na-ege ntị_oge agwụla - ọsọ nhazi mmemme site na akara mmuke
  • akara mmuke - usoro nwere ntọala maka ijikọ na akara mmuke:
  • usu - ip ma ọ bụ aha nnabata nke ihe nkesa akara mmuke
  • atụmatụ - eserese njikọ (tcp: //, tls: //)
  • n'ọdụ ụgbọ mmiri - ọdụ ụgbọ mmiri
  • aha njirimara - Aha njirimara
  • nzuzo - paswọọdụ
  • connect_oge agwụla - oge njikọ
  • gụchara_oge - ịgụ oge agwụla

faịlụ ntọala ihe atụ:

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

);

Nhazi onye nlekọta

A na-eji onye nlekọta wepụta usoro njikwa ihe omume Asterisk CallMeIn.php, nke na-enyocha oku mbata na mmekọrịta ya na Bitrix24 (gosi kaadị ahụ, zoo kaadị, wdg).

Faịlụ ntọala iji mepụta:

/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

Mwepụta ma malitegharịa ngwa:

supervisorctl start callme
supervisorctl restart callme

lelee ọkwa nke ngwa a:

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

nkwubi

Ọ tụgharịrị bụrụ ihe mgbagwoju anya, mana ejiri m n'aka na onye nchịkwa nwere ahụmahụ ga-enwe ike mejuputa ya ma mee ihe ga-atọ ndị ọrụ ya ụtọ.

Dịka e kwere nkwa, njikọ github.

Ajụjụ, aro - biko hapụ ha na nkọwa. Ọzọkwa, ọ bụrụ na ị nwere mmasị na otú mmepe nke njikọ a si gaa, dee, na n'isiokwu na-esonụ m ga-agbalị ikpughe ihe niile n'ụzọ zuru ezu.

isi: www.habr.com

Tinye a comment