Amalachadh Asterisk agus Bitrix24

Amalachadh Asterisk agus Bitrix24
Tha diofar roghainnean aig an lìonra airson a bhith ag amalachadh IP-PBX Asterisk agus CRM Bitrix24, ach chuir sinn romhainn, ge-tà, ar cuid fhìn a sgrìobhadh.

Gu h-obrachail, tha a h-uile dad àbhaisteach:

  • Le bhith a’ cliogadh air a’ cheangal le àireamh fòn an neach-dèiligidh ann am Bitrix24, bidh Asterisk a’ ceangal àireamh a-staigh an neach-cleachdaidh às an deach am cliog seo a dhèanamh le àireamh fòn an neach-dèiligidh. Ann am Bitrix24, tha clàr den ghairm air a chlàradh, agus aig deireadh a 'ghairm, tha an clàr còmhraidh air a tharraing suas.
  • Bidh gairm a’ ruighinn Asterisk bhon taobh a-muigh - anns an eadar-aghaidh Bitrix24, bidh sinn a’ sealltainn a ’chairt teachdaiche don neach-obrach aig an tàinig a’ ghairm seo.
    Mura h-eil an leithid de neach-dèiligidh ann, fosgail a’ chairt airson stiùir ùr a chruthachadh.
    Cho luath ‘s a bhios an gairm deiseil, bidh sinn a’ nochdadh seo sa chairt agus a ’tarraing suas clàradh a’ chòmhraidh.

Fon ghearradh, innsidh mi dhut mar a shuidhicheas tu a h-uile càil dhut fhèin agus a bheir thu ceangal gu github - tha, tha, gabh e agus cleachd e!

Tuairisgeul coitcheann

Dh'ainmich sinn ar amalachadh CallMe. Is e tagradh lìn beag a th’ ann an CallMe sgrìobhte ann am PHP.

Teicneòlasan agus seirbheisean air an cleachdadh

  • PHP 5.6
  • Leabharlann PHP AMI
  • sgrìobhadh
  • nginx + php fpm
  • stiùiriche
  • AMI (Eadar-aghaidh Manaidsear Rionnag)
  • Webbhooks Bitrix (buileachadh REST API nas sìmplidhe)

ro-aithris

Air an fhrithealaiche le Asterisk, feumaidh tu frithealaiche lìn a stàladh (tha nginx + php-fpm againn), neach-stiùiridh agus git.

Òrdugh stàlaidh (CentOS):

yum install nginx php-fpm supervisor git

Bheir sinn seachad an eòlaire a tha ri fhaighinn don t-seirbheisiche lìn, tarraing an tagradh bhon git agus suidhich na còraichean riatanach don phasgan:


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

An ath rud, rèiteachadh nginx, tha an config againn suidhichte ann an

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

Fàgaidh mi mion-sgrùdadh air an config, cùisean tèarainteachd, faighinn teisteanas, agus eadhon taghadh frithealaiche lìn taobh a-muigh raon an artaigil - chaidh tòrr a sgrìobhadh mu dheidhinn seo. Chan eil bacadh sam bith air an tagradh, bidh e ag obair air gach cuid http agus https.

Tha https againn, leig leinn an teisteanas a chrioptachadh.

Ma rinn thu a h-uile càil ceart, an uairsin le bhith a’ briogadh air a’ cheangal bu chòir dhut rudeigin mar seo fhaicinn

Amalachadh Asterisk agus Bitrix24

Dèan rèiteachadh air Bitrix24

Cruthaichidh sinn dà bhreac-lìn.

Clàr-lìn a’ tighinn a-steach.

Fon chunntas rianadair (le id 1) theirig air an t-slighe: Tagraidhean -> Webhooks -> Cuir webhook -> webhook a’ tighinn a-steach

Amalachadh Asterisk agus Bitrix24

Lìon a-steach paramadairean a’ bhileag-lìn a tha a’ tighinn a-steach mar a tha anns na seallaidhean-sgrìn:

Amalachadh Asterisk agus Bitrix24

Amalachadh Asterisk agus Bitrix24

Agus cliog air sàbhaladh.

Às deidh dha a bhith air a shàbhaladh, bheir Bitrix24 URL a’ bhileag-lìn a tha a’ tighinn a-steach, mar eisimpleir:

Amalachadh Asterisk agus Bitrix24

Sàbhail an dreach agad den URL às aonais an t-slighe / pròifil / - thèid a chleachdadh san tagradh gus obrachadh le fiosan a thig a-steach.

Tha e agam https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Clàr-lìn a-mach.

Tagraidhean -> Webhooks -> Cuir Webhook ris -> Webhook a-muigh

Tha mion-fhiosrachadh air na dealbhan-sgrìn:

Amalachadh Asterisk agus Bitrix24

Amalachadh Asterisk agus Bitrix24

Sàbhail agus faigh an còd ceadachaidh

Amalachadh Asterisk agus Bitrix24

Tha e agam xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Feumaidh tu cuideachd a chopaigeadh thugad fhèin, tha feum air gus fiosan a-mach a dhèanamh.

Cudromach!

Feumaidh teisteanas ssl a bhith air a rèiteachadh air an fhrithealaiche Bitrix24 (faodaidh tu letsencrypt a chleachdadh), air neo cha obraich an api BitrixXNUMX. Ma tha dreach neòil agad, na gabh dragh - tha ssl ann mu thràth.

Cudromach!

Anns an raon "Seòladh Pròiseasaran", feumar seòladh a tha ruigsinneach bhon eadar-lìn a chomharrachadh!

Agus leis an suathadh mu dheireadh, leig dhuinn ar CallMeOut a chuir a-steach mar thagradh airson fiosan a dhèanamh (gus an tèid àithne le bhith a’ cliogadh air an àireamh air a’ PBX gus a’ ghairm a thòiseachadh).

Anns a 'chlàr-taice, tagh: Barrachd -> Fòn -> Barrachd -> Roghainnean, cuir a-steach an "Àireamh airson fiosan a-mach gu bunaiteach" Iarrtas: CallMeOut agus cliog air "Sàbhail"

Amalachadh Asterisk agus Bitrix24

suidheachadh rionnag

Airson eadar-obrachadh soirbheachail eadar Asterisk agus Bitrix24, feumaidh sinn an neach-cleachdaidh callme AMI a chur ri 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

An ath rud, tha beagan chleasan ann a dh’ fheumar a chuir an gnìomh le bhith a ’cleachdadh dialplan (tha leudachain.ael againn).

Bheir mi iomradh air an fhaidhle gu lèir, agus an uairsin bheir mi mìneachadh:

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

};

Feuch an tòisich sinn bhon toiseach: stiùireadh cruinneachan.

Caochlaideach Clàran URL a’ stòradh an URL gu na faidhlichean clàraidh còmhraidh, a rèir an tarraing Bitrix24 a-steach don chairt-conaltraidh.

An ath rud, tha ùidh againn ann am macro macro clàradh.

An seo, a bharrachd air a bhith a’ clàradh chòmhraidhean, suidhichidh sinn an caochladair Ainm slàn.

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

Bidh e a’ stòradh an URL slàn gu faidhle sònraichte (canar am macro anns a h-uile àite).

Nì sinn sgrùdadh air a’ ghairm a tha a’ dol a-mach:

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

Canaidh sinn 89991234567, a’ chiad rud a gheibh sinn an seo:

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

iadsan. tha am macro clàraidh gairm air a ghairm agus tha na caochladairean riatanach air an suidheachadh.

barrachd

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

bidh sinn a’ clàradh cò a thòisich a’ ghairm agus a’ clàradh àm tòiseachaidh a’ ghairm.

Agus nuair a thèid a chrìochnachadh, ann an co-theacsa sònraichte 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});
}

cuir dheth an inntrigeadh sa chlàr CDR airson an leudachaidh seo (chan eil feum air an sin), suidhich àm crìochnachaidh a’ ghairm, obraich a-mach an ùine, mura h-eil fios air toradh a’ ghairm - seata (caochlaideach Cuir fòn thugam DISPOSITION) agus, an ceum mu dheireadh, cuir a h-uile càil gu Bitrix tron ​​​​t-siostam curl.

Agus beagan a bharrachd draoidheachd - gairm a’ tighinn a-steach:

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

An seo chan eil ùidh againn ach ann an aon loidhne.

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

Tha i ag ràdh stàladh PBX CallerID (ainm) caochlaideach CallMeCallerIDName.

Tha an caochladair CallMeCallerIDName fhèin, an uair sin, air a shuidheachadh leis an tagradh CallMe (ma tha ainm slàn aig Bitrix24 airson àireamh an neach-fios, suidhichidh sinn e mar CallerID (ainm), chan eil - cha dèan sinn dad).

Suidheachadh tagraidh

Faidhle roghainnean tagraidh - /var/www/pbx.vistep.ru/config.php

Tuairisgeul air crìochan an tagraidh:

  • CallMeDEBUG - ma tha 1, an uairsin thèid a h-uile tachartas air an giullachd leis an tagradh a sgrìobhadh chun fhaidhle log, 0 - cha bhith sinn a’ sgrìobhadh dad
  • tech SIP/PJSIP/IAX/etc
  • ughToken - Comharra cead Bitrix24, còd ceadachaidh lìn a-mach
  • bitrixApiUrl - URL a’ bhileag-lìn a tha a’ tighinn a-steach, gun phròifil /
  • leudachain - liosta de na h-àireamhan taobh a-muigh
  • co-theacs - co-theacsa airson tùs gairm
  • timeout_èisteachd - astar giollachd tachartais bho rionnag
  • rionnag - sreath leis na roghainnean ceangail ris an rionnag:
  • slòigh - ip no ainm aoigheachd an fhrithealaiche rionnag
  • sgeama - diagram ceangail (tcp: //, tls: //)
  • port - port
  • ainm-cleachdaidh - Ainm-cleachdaidh
  • dìomhair - facal-faire
  • connect_timeout - ùine ceangail
  • ùine-leughaidh_a-mach - leugh ùine a-mach

eisimpleir faidhle roghainnean:

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

);

Suidheachadh neach-stiùiridh

Tha an neach-stiùiridh air a chleachdadh gus pròiseas làimhseachaidh tachartas Asterisk CallMeIn.php a chuir air bhog, a bhios a’ cumail sùil air fiosan a thig a-steach agus ag eadar-obrachadh le Bitrix24 (seall a ’chairt, cuir am falach a’ chairt, msaa).

Faidhle roghainnean airson a chruthachadh:

/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

A 'tòiseachadh agus ag ath-thòiseachadh an tagraidh:

supervisorctl start callme
supervisorctl restart callme

faic suidheachadh an tagraidh:

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

co-dhùnadh

Thionndaidh e a-mach gu math duilich, ach tha mi cinnteach gum bi rianadair eòlach comasach air a luchd-cleachdaidh a chuir an gnìomh agus a thoileachadh.

Mar a gheall, ceangal gu github.

Ceistean, molaidhean - feuch an cuir thu anns na beachdan. Cuideachd, ma tha ùidh agad ann an mar a chaidh leasachadh an aonachaidh seo, sgrìobh, agus anns an ath artaigil feuchaidh mi ri a h-uile dad fhoillseachadh nas mionaidiche.

Source: www.habr.com

Cuir beachd ann