Kuunganishwa kwa Nyota na Bitrix24

Kuunganishwa kwa Nyota na Bitrix24
Kuna chaguo tofauti za kuunganisha IP-PBX Asterisk na CRM Bitrix24 kwenye mtandao, lakini bado tuliamua kuandika yetu wenyewe.

Kwa upande wa utendaji, kila kitu ni cha kawaida:

  • Kwa kubofya kiungo kilicho na nambari ya simu ya mteja katika Bitrix24, Nyota huunganisha nambari ya ndani ya mtumiaji ambaye kubofya kulifanywa kwa niaba ya nambari ya simu ya mteja. Katika Bitrix24, rekodi ya simu inarekodiwa na, mwisho wa simu, rekodi ya mazungumzo hutolewa.
  • Nyota hupokea simu kutoka nje - katika kiolesura cha Bitrix24 tunaonyesha kadi ya mteja kwa mfanyakazi ambaye nambari yake ya simu ilifika.
    Ikiwa hakuna mteja kama huyo, tutafungua kadi kwa kuunda mwongozo mpya.
    Mara tu simu inapokamilika, tunatafakari hili kwenye kadi na kuvuta rekodi ya mazungumzo.

Chini ya kata nitakuambia jinsi ya kujiweka kila kitu na kukupa kiungo kwa github - ndiyo, ndiyo, ichukue na uitumie!

Maelezo ya jumla

Tuliita muunganisho wetu CallMe. CallMe ni programu ndogo ya wavuti iliyoandikwa katika PHP.

Teknolojia na huduma zinazotumiwa

  • PHP 5.6
  • maktaba ya PHP AMI
  • Kutunga
  • Nginx + php-fpm
  • msimamizi
  • AMI (Kiolesura cha Kidhibiti cha Nyota)
  • Bitrix webbhooks (utekelezaji uliorahisishwa wa REST API)

Kuweka mapema

Kwenye seva iliyo na kinyota, unahitaji kusakinisha seva ya wavuti (kwetu ni nginx+php-fpm), msimamizi na git.

Amri ya usakinishaji (CentOS):

yum install nginx php-fpm supervisor git

Tunaenda kwenye saraka inayopatikana kwa seva ya wavuti, vuta programu kutoka kwa Git na uweke haki zinazohitajika kwenye folda:


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

Ifuatayo, wacha tusanidi nginx, usanidi wetu uko ndani

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

Nitaacha kuchanganua usanidi, maswala ya usalama, kupata cheti na hata kuchagua seva ya wavuti nje ya wigo wa kifungu - mengi yameandikwa juu ya hili. Programu haina vikwazo, inafanya kazi kwa http na https.

Tunatumia https, wacha tusimba cheti kwa njia fiche.

Ikiwa ulifanya kila kitu kwa usahihi, basi kwa kubofya kiungo unapaswa kuona kitu kama hiki

Kuunganishwa kwa Nyota na Bitrix24

Kuanzisha Bitrix24

Wacha tuunde vijiti viwili vya wavuti.

Mtandao unaoingia.

Chini ya akaunti ya msimamizi (na kitambulisho 1), fuata njia: Maombi -> Webhooks -> Ongeza webhook -> Webhook inayoingia

Kuunganishwa kwa Nyota na Bitrix24

Jaza vigezo vya webbook inayoingia kama kwenye picha za skrini:

Kuunganishwa kwa Nyota na Bitrix24

Kuunganishwa kwa Nyota na Bitrix24

Na bonyeza kuokoa.

Baada ya kuhifadhi, Bitrix24 itatoa URL ya webhook inayoingia, kwa mfano:

Kuunganishwa kwa Nyota na Bitrix24

Hifadhi toleo lako la URL bila ya mwisho / wasifu/ - itatumika katika programu kufanya kazi na simu zinazoingia.

Nina hii https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Mtandao unaotoka.

Maombi -> Webhooks -> Ongeza webhook -> Mtandao unaotoka

Maelezo yako tena kwenye picha za skrini:

Kuunganishwa kwa Nyota na Bitrix24

Kuunganishwa kwa Nyota na Bitrix24

Hifadhi na upokee nambari ya uidhinishaji

Kuunganishwa kwa Nyota na Bitrix24

Nina hii xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Pia unahitaji kuinakili kwako mwenyewe; unaihitaji ili kupiga simu zinazotoka.

Muhimu!

Cheti cha SSL lazima kisanidiwe kwenye seva ya Bitrix24 (unaweza kutumia letsencrypt), vinginevyo api ya Bitrix haitafanya kazi. Ikiwa una toleo la wingu, usijali - tayari lina ssl.

Muhimu!

Sehemu ya "Anwani ya Kichakataji" lazima iwe na anwani inayopatikana kutoka kwa Mtandao!

Na kama mguso wa mwisho, hebu tusakinishe CallMeOut yetu kama programu ya kupiga simu (ili unapobofya nambari kwenye PBX, amri ya kuanzisha simu itaondoka).

Katika menyu, chagua: Zaidi -> Simu -> Zaidi -> Mipangilio, weka "Nambari chaguomsingi ya simu inayotoka" Maombi: CallMeOut na ubofye "Hifadhi"

Kuunganishwa kwa Nyota na Bitrix24

Kuweka kinyota

Kwa mwingiliano mzuri kati ya Nyota na Bitrix24, tunahitaji kuongeza simu ya mtumiaji ya AMI kwenye 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

Ifuatayo, kuna hila kadhaa ambazo zitahitajika kutekelezwa kupitia dialplan (kwetu hii ni extensions.ael).

Nitatoa faili nzima, na kisha nitatoa maelezo:

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

};

Wacha tuanze tangu mwanzo: maagizo ulimwengu.

Inaweza kubadilika KUMBUKUMBU ZA URL huhifadhi URL kwa faili za kurekodi mazungumzo, kulingana na ambayo Bitrix24 itawavuta kwenye kadi ya mawasiliano.

Ifuatayo tunavutiwa na macro macro kurekodi.

Hapa, pamoja na kurekodi mazungumzo, tutaweka kutofautiana JinaKamili.

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

Huhifadhi URL kamili kwa faili maalum (jumla inaitwa kila mahali).

Wacha tuchambue simu inayotoka:

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

Wacha tuseme tunapiga simu 89991234567, kwanza kabisa tunafika hapa:

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

hizo. Jumla ya kurekodi mazungumzo inaitwa na vigezo muhimu vimewekwa.

Zaidi ya

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

Tunarekodi ni nani aliyeanzisha simu na kurekodi muda wa kuanza kwa simu.

Na baada ya kukamilika kwake, katika muktadha maalum 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});
}

Lemaza kuingia kwenye jedwali la CDR kwa ugani huu (hauhitajiki hapo), weka wakati wa mwisho wa simu, hesabu muda, ikiwa matokeo ya simu haijulikani - weka (kigeu CallMeDISPOSITION) na, hatua ya mwisho, tuma kila kitu kwa Bitrix kupitia curl ya mfumo.

Na uchawi zaidi - simu inayoingia:

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

Hapa tunavutiwa na mstari mmoja tu.

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

Anaiambia PBX kusakinisha Kitambulisho cha anayepiga (jina) sawa na kutofautiana CallMeCallerIDName.

Kigezo chenyewe cha CallMeCallerIDName, kwa upande wake, kinawekwa na programu ya CallMe (ikiwa Bitrix24 ina jina kamili la nambari ya mpigaji, iweke kama. Kitambulisho cha anayepiga (jina), hapana - hatutafanya chochote).

Mpangilio wa programu

Faili ya mipangilio ya programu - /var/www/pbx.vistep.ru/config.php

Maelezo ya vigezo vya maombi:

  • CallMeDEBUG - ikiwa 1, basi matukio yote yaliyochakatwa na maombi yataandikwa kwa faili ya kumbukumbu, 0 - hatuandiki chochote
  • tech - SIP/PJSIP/IAX/etc
  • authToken - Tokeni ya uidhinishaji ya Bitrix24, nambari ya idhini ya wavuti inayotoka
  • bitrixApiUrl - URL ya mtandao unaoingia, bila wasifu/
  • vipimo - orodha ya nambari za nje
  • muktadha - muktadha wa kuanzisha simu
  • muda_wa_msikilizaji umekwisha - kasi ya usindikaji wa tukio kutoka kwa nyota
  • ngozi - safu iliyo na mipangilio ya kuunganisha kwenye nyota:
  • jeshi β€” ip au jina la mpangishaji la seva ya nyota
  • mpango - mchoro wa unganisho (tcp://, tls://)
  • bandari - bandari
  • username - Jina la mtumiaji
  • siri - nenosiri
  • connect_timeout - muunganisho umeisha
  • kusoma_timeout - soma wakati umeisha

mfano faili ya mipangilio:

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

);

Mpangilio wa msimamizi

Msimamizi hutumika kuzindua mchakato wa kidhibiti tukio kutoka kwa kinyota CallMeIn.php, ambacho hufuatilia simu zinazoingia na kuingiliana na Bitrix24 (kadi ya kuonyesha, kadi ya kuficha, n.k.).

Faili ya mipangilio itakayoundwa:

/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

Zindua na uanze tena programu:

supervisorctl start callme
supervisorctl restart callme

Kuangalia hali ya uendeshaji ya programu:

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

Hitimisho

Ilibadilika kuwa ngumu sana, lakini nina hakika kuwa msimamizi mwenye uzoefu ataweza kutekeleza na kufurahisha watumiaji wake.

Kama alivyoahidi, kiungo kwa github.

Maswali, mapendekezo - tafadhali waache kwenye maoni. Pia, ikiwa una nia ya jinsi maendeleo ya ushirikiano huu yalivyoenda, andika, na katika makala inayofuata nitajaribu kufunua kila kitu kwa undani zaidi.

Chanzo: mapenzi.com

Kuongeza maoni