Asterisk болон Bitrix24-ийг нэгтгэх

Asterisk болон Bitrix24-ийг нэгтгэх
Сүлжээнд IP-PBX Asterisk болон CRM Bitrix24-ийг нэгтгэх өөр өөр сонголтууд байдаг ч бид өөрсдөө бичихээр шийдсэн хэвээр байна.

Үйл ажиллагааны хувьд бүх зүйл стандарт юм:

  • Bitrix24 дээрх үйлчлүүлэгчийн утасны дугаар бүхий холбоос дээр дарснаар од нь өмнөөс нь товшилт хийсэн хэрэглэгчийн дотоод дугаарыг үйлчлүүлэгчийн утасны дугаартай холбодог. Bitrix24 дээр дуудлагын бичлэгийг бичиж, дуудлагын төгсгөлд ярианы бичлэгийг татаж авдаг.
  • Од нь гаднаас дуудлага хүлээн авдаг - Bitrix24 интерфейс дээр бид энэ дуудлага ирсэн ажилтанд үйлчлүүлэгчийн картыг харуулдаг.
    Хэрэв ийм үйлчлүүлэгч байхгүй бол бид шинэ хар тугалга үүсгэх картыг нээх болно.
    Дуудлага дуусмагц бид үүнийг картанд тусгаж, ярианы бичлэгийг татаж авдаг.

Тайлбарын доор би бүх зүйлийг өөртөө хэрхэн тохируулахыг хэлж, github-ийн холбоосыг өгөх болно - тийм ээ, тийм ээ, үүнийг аваад ашигла!

Ерөнхий тайлбар

Бид нэгдсэнээ CallMe гэж нэрлэсэн. CallMe бол PHP хэл дээр бичигдсэн жижиг вэб програм юм.

Ашигласан технологи, үйлчилгээ

  • PHP 5.6
  • PHP AMI номын сан
  • хөгжмийн зохиолч
  • Nginx + php-fpm
  • хянагч
  • AMI (Одны менежерийн интерфейс)
  • Bitrix webhooks (хялбаршуулсан REST API хэрэгжилт)

урьдчилан тохируулах

Asterisk-тэй сервер дээр вэб сервер (бидний хувьд nginx+php-fpm), supervisor болон git суулгах шаардлагатай.

Суулгах тушаал (CentOS):

yum install nginx php-fpm supervisor git

Бид вэб серверт нэвтрэх боломжтой лавлах руу очиж, Git-ээс програмыг татаж аваад хавтас руу шаардлагатай эрхийг тохируулна.


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

Дараа нь nginx-ийг тохируулцгаая, бидний тохиргоо энд байрладаг

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

Би тохиргоог задлан шинжлэх, аюулгүй байдлын асуудал, гэрчилгээ авах, тэр ч байтугай нийтлэлийн хүрээнээс гадуур вэб сервер сонгохыг орхих болно - энэ талаар маш их зүйл бичсэн. Аппликейшн нь ямар ч хязгаарлалтгүй бөгөөд http болон https дээр ажилладаг.

Бид https ашигладаг, гэрчилгээг шифрлэцгээе.

Хэрэв та бүх зүйлийг зөв хийсэн бол холбоос дээр дарснаар та иймэрхүү зүйлийг харах болно

Asterisk болон Bitrix24-ийг нэгтгэх

Bitrix24-ийг тохируулж байна

Хоёр webhook үүсгэцгээе.

Ирж буй вэб дэгээ.

Администраторын акаунтын доор (id 1-тэй) дараах замыг дагана уу: Програмууд -> Webhooks -> Webhook нэмэх -> Ирж буй вэб дэгээ.

Asterisk болон Bitrix24-ийг нэгтгэх

Дэлгэцийн зураг дээрх шиг ирж буй вэб дэгээний параметрүүдийг бөглөнө үү.

Asterisk болон Bitrix24-ийг нэгтгэх

Asterisk болон Bitrix24-ийг нэгтгэх

Мөн хадгалах товчийг дарна уу.

Хадгалсны дараа Bitrix24 нь ирж буй вэб дэгээний URL-г өгнө, жишээлбэл:

Asterisk болон Bitrix24-ийг нэгтгэх

URL-ийн хувилбараа эцсийн /профайл/гүйгээр хадгалаарай - энэ нь ирж буй дуудлагатай ажиллахад хэрэглэгдэх болно.

Надад энэ байна https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Гарч буй вэб дэгээ.

Програмууд -> Webhooks -> Webhook нэмэх -> Гарах вэб дэгээ

Дэлгэрэнгүй мэдээллийг дэлгэцийн зураг дээр дахин харуулав:

Asterisk болон Bitrix24-ийг нэгтгэх

Asterisk болон Bitrix24-ийг нэгтгэх

Зөвшөөрлийн кодыг хадгалж, хүлээн авна уу

Asterisk болон Bitrix24-ийг нэгтгэх

Надад энэ байна xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Та мөн үүнийг өөртөө хуулж авах хэрэгтэй бөгөөд энэ нь гадагш дуудлага хийхэд хэрэгтэй болно.

Чухал!

Bitrix24 сервер дээр SSL сертификат тохируулагдсан байх ёстой (та letsencrypt ашиглаж болно), эс тэгвээс Bitrix api ажиллахгүй. Хэрэв танд үүлэн хувилбар байгаа бол санаа зовох хэрэггүй - энэ нь аль хэдийн ssl-тэй байна.

Чухал!

"Процессорын хаяг" талбарт интернетээс хандах боломжтой хаяг байх ёстой!

Эцэст нь хэлэхэд, CallMeOut-ийг дуудлага хийх програм болгон суулгая (ингэснээр та PBX дээрх дугаар дээр дарахад дуудлага хийх команд алга болно).

Цэсээс: Дэлгэрэнгүй -> Утас -> Бусад -> Тохиргоог сонгоод “Өгөгдмөл гарах дуудлагын дугаар” програмыг тохируулаад: CallMeOut, “Хадгалах” дээр дарна уу.

Asterisk болон Bitrix24-ийг нэгтгэх

Од тэмдгийг тохируулж байна

Asterisk болон Bitrix24 хооронд амжилттай харилцахын тулд бид manager.conf-д AMI хэрэглэгчийн callme-г нэмэх хэрэгтэй:

[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

Дараа нь dialplan-ээр дамжуулан хэрэгжүүлэх шаардлагатай хэд хэдэн заль мэх байдаг (бидний хувьд энэ нь extensions.ael юм).

Би файлыг бүхэлд нь өгөөд дараа нь тайлбар өгөх болно:

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

};

Эхнээс нь эхэлцгээе: удирдамж бөмбөрцөг.

Хувьсах URLRECORDS Харилцан ярианы бичлэгийн файлуудын URL хаягийг хадгалдаг бөгөөд үүний дагуу Bitrix24 нь тэдгээрийг харилцах карт руу татах болно.

Дараа нь бид макро макро сонирхож байна Бичлэг хийх.

Энд бид харилцан яриаг бичихээс гадна хувьсагчийг тохируулах болно Бүтэн нэр.

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

Энэ нь тодорхой файлд URL-г бүрэн хэмжээгээр хадгалдаг (макрог хаа сайгүй дууддаг).

Гарч буй дуудлагад дүн шинжилгээ хийцгээе:

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

Бид 89991234567 руу залгая гэж бодъё, юуны түрүүнд энд ирлээ:

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

тэдгээр. Харилцан яриа бичих макро дуудаж, шаардлагатай хувьсагчдыг тохируулна.

цаашид

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

Бид хэн дуудлагыг эхлүүлснийг тэмдэглэж, дуудлага эхлэх цагийг тэмдэглэнэ.

Мөн дууссаны дараа тусгай нөхцөл байдалд 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});
}

Энэ өргөтгөлийн CDR хүснэгтэд нэвтрэхийг идэвхгүй болгох (энэ нь шаардлагагүй), дуудлагын дуусах хугацааг тохируулах, дуудлагын үр дүн мэдэгдэхгүй бол үргэлжлэх хугацааг тооцоолох - тохируулах (хувьсагч) CallMeDISPOSITION) болон сүүлийн алхам бол системийн curl-ээр дамжуулан бүх зүйлийг Bitrix руу илгээнэ үү.

Мөн бага зэрэг ид шид - ирж буй дуудлага:

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

Энд бид зөвхөн нэг мөрийг сонирхож байна.

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

Тэр PBX-д суулгахыг хэлдэг Дуудлагын ID(нэр) хувьсагчтай тэнцүү CallMeCallerIDName.

CallMeCallerIDName хувьсагч нь өөрөө CallMe програмаар тохируулагддаг (хэрэв Bitrix24 нь залгагчийн дугаарын бүтэн нэртэй бол үүнийг тохируулна уу. Дуудлагын ID(нэр), үгүй ​​- бид юу ч хийхгүй).

Програмыг тохируулж байна

Програмын тохиргооны файл - /var/www/pbx.vistep.ru/config.php

Хэрэглээний параметрүүдийн тодорхойлолт:

  • CallMeDEBUG - хэрэв 1 бол програмын боловсруулсан бүх үйл явдал бүртгэлийн файлд бичигдэх болно, 0 - бид юу ч бичихгүй.
  • технологийн - SIP/PJSIP/IAX/ гэх мэт
  • authToken — Bitrix24 зөвшөөрлийн токен, гарах вэб дэгээний зөвшөөрлийн код
  • bitrixApiUrl — Ирж буй вэб дэгээний URL, профайлгүй/
  • өргөтгөлүүд - гадаад дугааруудын жагсаалт
  • нөхцөл байдал - дуудлага хийх нөхцөл
  • сонсогчийн_цаг хугацаа — одны тэмдэгтээс үйл явдлыг боловсруулах хурд
  • од байна — одтой холбогдох тохиргоо бүхий массив:
  • хост — од серверийн ip эсвэл хостын нэр
  • схем - холболтын диаграм (tcp://, tls://)
  • порт - порт
  • хэрэглэгчийн нэр - Хэрэглэгчийн нэр
  • нууц - нууц үг
  • холболтын_цаг хугацаа - холболтын завсарлага
  • унших_хугацаа - унших завсарлага

жишээ тохиргооны файл:

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

);

Хянагчийн тохиргоо

Supervisor нь ирж буй дуудлагыг хянаж, Bitrix24-тэй харьцдаг (карт харуулах, картыг нуух гэх мэт) Asterisk CallMeIn.php-ээс үйл явдал зохицуулагч процессыг эхлүүлэхэд ашиглагддаг.

Үүсгэх тохиргооны файл:

/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

Програмыг ажиллуулаад дахин эхлүүлнэ үү:

supervisorctl start callme
supervisorctl restart callme

Аппликешны үйлдлийн төлөвийг харах:

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

дүгнэлт

Энэ нь нэлээд төвөгтэй байсан ч туршлагатай администратор үүнийг хэрэгжүүлж, хэрэглэгчиддээ таалагдах болно гэдэгт би итгэлтэй байна.

Амласан ёсоороо, github руу холбох.

Асуулт, санал - сэтгэгдэл дээр үлдээнэ үү. Түүнчлэн, хэрэв та энэхүү интеграцийн хөгжил хэрхэн явагдсаныг сонирхож байгаа бол бичээрэй, дараагийн нийтлэлд би бүх зүйлийг илүү нарийвчлан дэлгэхийг хичээх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх