Asterisk və Bitrix24 inteqrasiyası

Asterisk və Bitrix24 inteqrasiyası
Şəbəkənin IP-PBX Asterisk və CRM Bitrix24 inteqrasiyası üçün müxtəlif variantları var, lakin buna baxmayaraq, biz özümüzü yazmağa qərar verdik.

Funksional olaraq hər şey standartdır:

  • Bitrix24-də müştərinin telefon nömrəsi olan linkə klikləməklə, Asterisk adından bu klikin edildiyi istifadəçinin daxili nömrəsini müştərinin telefon nömrəsi ilə əlaqələndirir. Bitrix24-də zəngin qeydi qeydə alınır və zəngin sonunda danışıq qeydi yuxarı çəkilir.
  • Kənardan Asterisk-ə zəng gəlir - Bitrix24 interfeysində müştəri kartını bu zəng gələn işçiyə göstəririk.
    Belə bir müştəri yoxdursa, yeni potensial yaratmaq üçün kartı açın.
    Zəng başa çatan kimi biz bunu kartda əks etdiririk və söhbətin qeydini çıxarırıq.

Kəsmə altında sizə hər şeyi özünüz üçün necə quracağınızı və github-a bir keçid verəcəyinizi söyləyəcəyəm - bəli, bəli, götür və istifadə et!

Ümumi təsviri

Biz inteqrasiyamızı CallMe adlandırdıq. CallMe PHP-də yazılmış kiçik veb proqramdır.

İstifadə olunan texnologiyalar və xidmətlər

  • PHP 5.6
  • PHP AMI Kitabxanası
  • bəstələmək
  • nginx + php fpm
  • nəzarətçi
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (sadələşdirilmiş REST API tətbiqi)

əvvəlcədən təyin edilməsi

Asterisk ilə serverdə veb server (bizdə nginx + php-fpm var), supervisor və git quraşdırmalısınız.

Quraşdırma əmri (CentOS):

yum install nginx php-fpm supervisor git

Veb server üçün mövcud olan kataloqu ötürürük, proqramı git-dən çıxarırıq və qovluğa lazımi hüquqları təyin edirik:


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

Sonra, nginx-i konfiqurasiya edin, konfiqurasiyamız yerləşir

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

Konfiqurasiyanın təhlilini, təhlükəsizlik məsələlərini, sertifikat əldə etməyi və hətta məqalə çərçivəsindən kənar bir veb server seçməyi tərk edəcəyəm - bu barədə çox şey yazılmışdır. Tətbiqin heç bir məhdudiyyəti yoxdur, həm http, həm də https-də işləyir.

Bizdə https var, sertifikatı şifrələyək.

Hər şeyi düzgün etmisinizsə, linkə klikləməklə buna bənzər bir şey görməlisiniz

Asterisk və Bitrix24 inteqrasiyası

Bitrix24 konfiqurasiyası

Gəlin iki webhook yaradaq.

Gələn webhook.

Administrator hesabı altında (id 1 ilə) aşağıdakı yol ilə gedin: Proqramlar -> Webhooks -> Webhook əlavə et -> Daxil olan webhook

Asterisk və Bitrix24 inteqrasiyası

Ekran görüntülərində olduğu kimi daxil olan webhookun parametrlərini doldurun:

Asterisk və Bitrix24 inteqrasiyası

Asterisk və Bitrix24 inteqrasiyası

Və saxla klikləyin.

Yadda saxladıqdan sonra Bitrix24 daxil olan veb-qancanın URL-ni təmin edəcək, məsələn:

Asterisk və Bitrix24 inteqrasiyası

URL versiyasını arxada /profil/ olmadan yadda saxlayın - o, daxil olan zənglərlə işləmək üçün tətbiqdə istifadə olunacaq.

Məndə var https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Gedən webhook.

Proqramlar -> Webhooks -> Webhook əlavə et -> Gedən Webhook

Təfərrüatlar ekran görüntülərindədir:

Asterisk və Bitrix24 inteqrasiyası

Asterisk və Bitrix24 inteqrasiyası

Yadda saxlayın və avtorizasiya kodunu əldə edin

Asterisk və Bitrix24 inteqrasiyası

Məndə var xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Siz həmçinin özünüzə kopyalamalısınız, gedən zənglər etmək üçün lazımdır.

Mühüm!

Bitrix24 serverində ssl sertifikatı konfiqurasiya edilməlidir (letsencrypt-dən istifadə edə bilərsiniz), əks halda BitrixXNUMX api işləməyəcək. Bulud versiyanız varsa, narahat olmayın - ssl artıq mövcuddur.

Mühüm!

"Prosessorun ünvanı" sahəsində İnternetdən əldə edilə bilən ünvan göstərilməlidir!

Və son toxunuşla CallMeOut-u zəng etmək üçün bir proqram kimi quraşdıraq (belə ki, PBX-dəki nömrəyə klikləməklə, zəng etmək üçün əmr uçacaq).

Menyuda seçin: Daha çox -> Telefoniya -> Daha çox -> Parametrlər, "Defolt olaraq gedən zənglər üçün nömrə" olaraq təyin edin Tətbiq: CallMeOut və "Saxla" düyməsini basın.

Asterisk və Bitrix24 inteqrasiyası

ulduz quraşdırma

Asterisk və Bitrix24 arasında uğurlu qarşılıqlı əlaqə üçün callme AMI istifadəçisini manager.conf-a əlavə etməliyik:

[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

Sonra, dialplan istifadə edərək həyata keçirilməli olan bir neçə fənd var (bizdə extensions.ael var).

Bütün faylı sitat gətirəcəyəm, sonra izahat verəcəyəm:

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

};

Əvvəldən başlayaq: direktiv qloballar.

Dəyişən URLQEYDLƏR Bitrix24 onları kontakt kartına çəkəcək danışıq qeyd fayllarının URL-sini saxlayır.

Sonra, makro makro ilə maraqlanırıq qeyd.

Burada söhbətləri qeyd etməklə yanaşı, dəyişəni də təyin edəcəyik TamFadı.

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

Tam URL-ni müəyyən bir fayla saxlayır (makros hər yerdə çağırılır).

Gəlin gedən zəngi təhlil edək:

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

Deyək ki, 89991234567 nömrəsinə zəng edirik, burada ilk əldə etdiyimiz şey:

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

olanlar. zəng qeydi makrosu çağırılır və lazımi dəyişənlər təyin edilir.

Əlavə

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

biz zəngi kimin başlatdığını qeyd edirik və zəngin başlama vaxtını qeyd edirik.

Və başa çatdıqdan sonra, xüsusi kontekstdə 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});
}

bu uzantı üçün CDR cədvəlindəki girişi söndürün (orada lazım deyil), zəngin bitmə vaxtını təyin edin, zəngin nəticəsi məlum deyilsə, müddəti hesablayın - təyin edin (dəyişən Mənə DISPOSITION zəng edin) və son addım, sistem curl vasitəsilə hər şeyi Bitrix-ə göndərin.

Və bir az daha sehrli - gələn zəng:

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

Burada bizi yalnız bir xətt maraqlandırır.

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

O deyir ki, PBX quraşdırın Zəng edənin ID (ad) dəyişən CallMeCallerIDName.

CallMeCallerIDName dəyişəninin özü də öz növbəsində CallMe proqramı tərəfindən təyin edilir (əgər Bitrix24-də zəng edənin nömrəsi üçün tam adı varsa, biz onu belə təyin edəcəyik. Zəng edənin ID (ad), yox - heç nə etməyəcəyik).

Tətbiq quraşdırması

Proqram parametrləri faylı - /var/www/pbx.vistep.ru/config.php

Tətbiq parametrlərinin təsviri:

  • CallMeDEBUG - 1 olarsa, onda proqram tərəfindən işlənmiş bütün hadisələr log faylına yazılacaq, 0 - heç nə yazmırıq
  • tech SIP/PJSIP/IAX/s
  • authToken — Bitrix24 avtorizasiya nişanı, gedən webhook icazə kodu
  • bitrixApiUrl — daxil olan webhookun URL-i, profilsiz/
  • uzantılar — xarici nömrələrin siyahısı
  • kontekst — zəngin yaranması üçün kontekst
  • dinləyici_vaxt aşımı - ulduzdan hadisə emal sürəti
  • asterisk - ulduz işarəsi ilə əlaqə parametrləri olan massiv:
  • sahib - ulduz serverinin ip və ya host adı
  • sxem — əlaqə diaqramı (tcp://, tls://)
  • port - liman
  • istifadəçi adı - İstifadəçi adı
  • gizli - parol
  • qoşulma_zamanı - əlaqə fasiləsi
  • read_timeout - oxuma vaxtı aşımı

nümunə parametrlər faylı:

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

);

Nəzarətçinin quraşdırılması

Supervisor, daxil olan zəngləri izləyən və Bitrix24 ilə qarşılıqlı əlaqədə olan (kartı göstərmək, kartı gizlətmək və s.) Asterisk CallMeIn.php hadisə idarəedici prosesini işə salmaq üçün istifadə olunur.

Yaratmaq üçün parametrlər faylı:

/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

Proqramın işə salınması və yenidən işə salınması:

supervisorctl start callme
supervisorctl restart callme

tətbiqin statusuna baxın:

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

Nəticə

Olduqca çətin oldu, amma əminəm ki, təcrübəli idarəçi öz istifadəçilərini həyata keçirə və sevindirə biləcək.

Söz verildiyi kimi, github-a keçid.

Suallar, təkliflər - şərhlərdə qeyd edin. Həm də bu inteqrasiyanın inkişafının necə getdiyi ilə maraqlanırsınızsa, yazın, növbəti yazıda hər şeyi daha ətraflı açmağa çalışacağam.

Mənbə: www.habr.com

Добавить комментарий