Integrasi Asterisk jeung Bitrix24

Integrasi Asterisk jeung Bitrix24
Jaringan ngagaduhan pilihan anu béda pikeun ngahijikeun IP-PBX Asterisk sareng CRM Bitrix24, tapi kami, kumaha waé, mutuskeun pikeun nyerat sorangan.

Sacara fungsional, sadayana standar:

  • Ku ngaklik tautan sareng nomer telepon klien di Bitrix24, Asterisk nyambungkeun nomer internal pangguna atas nama anu klik ieu dilakukeun nganggo nomer telepon klien. Dina Bitrix24, rékaman telepon dirékam, sareng dina tungtung telepon, rékaman paguneman ditarik ka luhur.
  • Telepon sumping ka Asterisk ti luar - dina antarmuka Bitrix24, kami nunjukkeun kartu klien ka karyawan anu nomerna telepon ieu sumping.
    Upami teu aya klien sapertos kitu, buka kartu pikeun nyiptakeun kalungguhan anyar.
    Pas nelepon geus réngsé, urang ngagambarkeun ieu dina kartu jeung narik nepi rekaman paguneman.

Dina potongan, kuring bakal nyarioskeun ka anjeun kumaha nyetél sadayana pikeun diri anjeun sareng masihan tautan ka github - enya, enya, candak sareng dianggo!

pedaran umum

Urang disebut integrasi kami CallMe. CallMe nyaéta aplikasi wéb leutik anu ditulis dina PHP.

Téknologi sareng jasa anu dianggo

  • PHP 5.6
  • Perpustakaan AMI PHP
  • komposer
  • nginx + php fpm
  • nu ngawas
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (implementasi REST API saderhana)

prasetél

Dina server nganggo Asterisk, anjeun kedah masang pangladén wéb (urang gaduh nginx + php-fpm), pengawas sareng git.

Paréntah instalasi (CentOS):

yum install nginx php-fpm supervisor git

Kami lulus diréktori anu sayogi pikeun pangladén wéb, tarik aplikasi tina git sareng nyetél hak anu diperyogikeun kana polder:


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

Salajengna, ngonpigurasikeun nginx, config kami aya di

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

Kuring bakal ngantunkeun analisa konfigurasi, masalah kaamanan, kéngingkeun sertipikat, bahkan milih server wéb di luar ruang lingkup tulisan - seueur anu ditulis ngeunaan ieu. Aplikasina teu aya larangan, tiasa dianggo dina http sareng https.

Kami ngagaduhan https, hayu urang énkripsi sertipikat.

Upami anjeun ngalakukeun sadayana leres, teras ku ngaklik tautan anjeun kedah ningali anu sapertos kieu

Integrasi Asterisk jeung Bitrix24

Nyetél Bitrix24

Hayu urang nyieun dua webhooks.

Webhook asup.

Dina akun administrator (kalayan id 1) lebet kana jalur: Aplikasi -> Webhooks -> Tambah webhook -> Webhook asup

Integrasi Asterisk jeung Bitrix24

Eusian parameter tina webhook asup sakumaha dina Potret layar:

Integrasi Asterisk jeung Bitrix24

Integrasi Asterisk jeung Bitrix24

Sareng klik simpen.

Saatos nyimpen, Bitrix24 bakal nyayogikeun URL webhook anu asup, contona:

Integrasi Asterisk jeung Bitrix24

Simpen versi URL anjeun tanpa labuh /profil/ - éta bakal dianggo dina aplikasi pikeun damel sareng telepon asup.

Kuring boga eta https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook kaluar.

Aplikasi -> Webhooks -> Tambah Webhook -> Outgoing Webhook

Rincian aya dina screenshot:

Integrasi Asterisk jeung Bitrix24

Integrasi Asterisk jeung Bitrix24

Simpen sareng kéngingkeun kode otorisasina

Integrasi Asterisk jeung Bitrix24

Kuring boga eta xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Anjeun ogé kedah nyalin ka diri anjeun, diperyogikeun pikeun nelepon kaluar.

Penting!

Sertipikat SSL kedah dikonpigurasi dina server Bitrix24 (anjeun tiasa nganggo letsencrypt), upami henteu, api BitrixXNUMX moal jalan. Upami anjeun gaduh versi awan, tong hariwang - ssl parantos aya.

Penting!

Dina widang "Alamat Prosesor", alamat anu tiasa diaksés tina Internét kedah dituduhkeun!

Sareng kalayan sentuhan akhir, hayu urang pasang CallMeOut urang salaku aplikasi pikeun nelepon (ku kituna ku ngaklik nomer dina PBX, paréntah bakal ngapung pikeun ngadamel telepon).

Dina ménu, pilih: More -> Telephony -> More -> Setélan, lebetkeun dina "Jumlah telepon kaluar sacara standar" Aplikasi: CallMeOut teras klik "Simpen"

Integrasi Asterisk jeung Bitrix24

pangaturan asterisk

Pikeun suksés interaksi antara Asterisk sareng Bitrix24, urang kedah nambihan pangguna AMI callme kana 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

Salajengna, aya sababaraha trik anu kedah dilaksanakeun nganggo dialplan (urang gaduh extensions.ael).

Kuring bakal ngadugikeun sadayana file, teras kuring bakal masihan katerangan:

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

};

Hayu urang mimitian ti mimiti: diréktif globals.

Variabel URLRECORDS nyimpen URL kana file rekaman paguneman, nurutkeun nu Bitrix24 bakal narik kana kartu kontak.

Salajengna, urang museurkeun makro makro rekaman.

Di dieu, salian ngarékam paguneman, urang bakal nyetél variabel Ngaran lengkep.

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

Éta nyimpen URL lengkep kana file khusus (makro disebut dimana-mana).

Hayu urang analisa telepon kaluar:

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

Anggap we nelepon 89991234567, hal kahiji urang meunang di dieu:

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

jelema. makro rekaman panggero disebut jeung variabel perlu diatur.

saterusna

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

urang ngarekam saha ngagagas panggero jeung ngarekam waktu mimiti panggero.

Jeung kana parantosan na, dina konteks husus 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});
}

mareuman éntri dina tabel CDR pikeun extension ieu (teu diperlukeun aya), nyetel waktos tungtung sauran, ngitung lilana, lamun hasil panggero teu dipikawanoh - set (variabel). Nelepon kuring DISPOSITION) jeung, lengkah panungtungan, ngirim sagalana ka Bitrix ngaliwatan sistem curl.

Sareng sakedik deui sihir - telepon asup:

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

Di dieu urang ngan museurkeun hiji garis.

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

Manéhna nyebutkeun PBX install CallerID(ngaran) variabel CallMeCallerIDName.

Variabel CallMeCallerIDName sorangan, giliran, diatur ku aplikasi CallMe (upami Bitrix24 gaduh nami lengkep pikeun nomer panelepon, kami bakal nyetél éta salaku CallerID(ngaran), euweuh - urang moal ngalakukeun nanaon).

Setélan aplikasi

File setélan aplikasi - /var/www/pbx.vistep.ru/config.php

Katerangan ngeunaan parameter aplikasi:

  • CallMeDEBUG - upami 1, maka sadaya acara anu diolah ku aplikasi bakal diserat kana file log, 0 - kami henteu nyerat nanaon
  • tech SIP/PJSIP/IAX/jsb
  • authToken - Token otorisasi Bitrix24, kode otorisasi webhook kaluar
  • bitrixApiUrl — URL webhook anu asup, tanpa profil/
  • extensions - daptar nomer éksternal
  • konteks - konteks pikeun origination panggero
  • listener_timeout - speed processing acara ti tanda bintang
  • tanda asterisk - Asép Sunandar Sunarya sareng setélan sambungan kana tanda bintang:
  • nu boga imah - ip atanapi hostname tina server asterisk
  • skéma - diagram sambungan (tcp://, tls://)
  • palabuhan - palabuhan
  • ngaran pamaké - Ngaran pamaké
  • rasiah - sandi
  • connect_timeout - waktos sambungan
  • read_timeout - baca waktos kaluar

conto file setélan:

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

);

Setup pangawas

Pengawas dianggo pikeun ngaluncurkeun prosés panangan acara Asterisk CallMeIn.php, anu ngawas telepon asup sareng berinteraksi sareng Bitrix24 (némbongkeun kartu, nyumputkeun kartu, jsb).

Setélan file pikeun nyieun:

/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

Ngamimitian sareng ngabalikan deui aplikasi:

supervisorctl start callme
supervisorctl restart callme

tingali status aplikasi:

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

kacindekan

Tétéla rada hese, tapi kuring yakin yén administrator ngalaman bakal tiasa nerapkeun sarta mangga pamaké-Na.

Sakumaha jangji, link ka github.

Patarosan, saran - mangga dina komentar. Ogé, upami anjeun kabetot dina kumaha ngembangkeun integrasi ieu indit, nulis, sarta dina artikel salajengna kuring bakal nyoba nembongkeun sagalana dina leuwih jéntré.

sumber: www.habr.com

Tambahkeun komentar