Hoʻohui o Asterisk a me Bitrix24

Hoʻohui o Asterisk a me Bitrix24
Loaʻa i ka pūnaewele nā ​​koho likeʻole no ka hoʻohuiʻana i ka IP-PBX Asterisk a me CRM Bitrix24, akā naʻe, ua hoʻoholo mākou e kākau i kā mākou iho.

Ma ka hana, he maʻamau nā mea a pau:

  • Ma ke kaomi ʻana i ka loulou me ka helu kelepona o ka mea kūʻai ma Bitrix24, hoʻopili ʻo Asterisk i ka helu kūloko o ka mea hoʻohana ma ka inoa nona kēia kaomi me ka helu kelepona o ka mea kūʻai. Ma Bitrix24, hoʻopaʻa ʻia kahi moʻolelo o ke kelepona, a ma ka hopena o ke kelepona, huki ʻia ka moʻolelo kamaʻilio.
  • Ua hōʻea mai kahi kelepona ma Asterisk mai waho - ma ke kikowaena Bitrix24, hōʻike mākou i ke kāleka mea kūʻai aku i ka limahana nona ka helu i hiki mai ai kēia kelepona.
    Inā ʻaʻohe mea kūʻai aku, wehe i ke kāleka no ka hana ʻana i kahi alakaʻi hou.
    I ka pau ʻana o ke kelepona, e noʻonoʻo mākou i kēia ma ke kāleka a huki i ka hoʻopaʻa ʻana o ke kamaʻilio.

Ma lalo o ka ʻoki, e haʻi wau iā ʻoe pehea e hoʻonohonoho ai i nā mea āpau no ʻoe iho a hāʻawi i kahi loulou i github - ʻae, ʻae, lawe a hoʻohana!

Hōʻikeʻano nui

Ua kāhea mākou i kā mākou hoʻohui CallMe. ʻO CallMe kahi palapala pūnaewele liʻiliʻi i kākau ʻia ma PHP.

Hoʻohana ʻia nā ʻenehana a me nā lawelawe

  • PHP 5.6
  • Hale Waihona Puke AMI PHP
  • haku mele
  • nginx + php fpm
  • luna hoʻomalu
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (hoʻokō REST API maʻalahi)

presetting

Ma ke kikowaena me Asterisk, pono ʻoe e hoʻokomo i kahi kikowaena pūnaewele (loaʻa iā mākou nginx + php-fpm), luna a me git.

Kauoha hoʻokomo (CentOS):

yum install nginx php-fpm supervisor git

Hāʻawi mākou i ka papa kuhikuhi i loaʻa i ka pūnaewele pūnaewele, huki i ka noi mai ka git a hoʻonoho i nā kuleana kūpono i ka waihona:


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

A laila, hoʻonohonoho i ka nginx, aia kā mākou config i loko

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

E haʻalele wau i ka nānā ʻana o ka config, nā pilikia palekana, ka loaʻa ʻana o kahi palapala hōʻoia, a me ke koho ʻana i kahi kikowaena pūnaewele ma waho o ke ʻano o ka ʻatikala - ua kākau nui ʻia e pili ana i kēia. ʻAʻohe palena o ka noi, hana ia ma http a me https.

Loaʻa iā mākou https, e hoʻopili i ka palapala hōʻoia.

Inā hana pololei ʻoe i nā mea āpau, a laila ma ke kaomi ʻana i ka loulou e ʻike ʻoe i kahi mea e like me kēia

Hoʻohui o Asterisk a me Bitrix24

Hoʻonohonoho i ka Bitrix24

E hana kāua i ʻelua mau hoʻopaʻa pūnaewele.

Hoʻokomo pūnaewele.

Ma lalo o ka moʻokāki luna (me ka id 1) e hele ma ke ala: Nā noi -> Webhooks -> Hoʻohui i ka webhook -> Incoming webhook

Hoʻohui o Asterisk a me Bitrix24

E hoʻopiha i nā ʻāpana o ka webhook e hiki mai ana e like me nā screenshots:

Hoʻohui o Asterisk a me Bitrix24

Hoʻohui o Asterisk a me Bitrix24

A kaomi mālama.

Ma hope o ka mālama ʻana, hāʻawi ʻo Bitrix24 i ka URL o ka webhook e hiki mai ana, no ka laʻana:

Hoʻohui o Asterisk a me Bitrix24

E mālama i kāu mana o ka URL me ka ʻole o ka ʻaoʻao / profile/ - e hoʻohana ʻia ia i ka noi e hana me nā kelepona komo.

Loaʻa iaʻu https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Puka pūnaewele puka.

Nā noi -> Webhooks -> Pākuʻi Webhook -> Webhook i waho

Aia nā kikoʻī ma nā screenshots:

Hoʻohui o Asterisk a me Bitrix24

Hoʻohui o Asterisk a me Bitrix24

E mālama a loaʻa ke code ʻae

Hoʻohui o Asterisk a me Bitrix24

Loaʻa iaʻu xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Pono ʻoe e kope iā ʻoe iho, pono ia e hana i nā kelepona i waho.

Mea nui!

Pono e hoʻonohonoho ʻia kahi palapala ssl ma ka server Bitrix24 (hiki iā ʻoe ke hoʻohana i ka letsencrypt), inā ʻaʻole e holo ka BitrixXNUMX api. Inā he mana kapua kāu, mai hopohopo - aia ʻo ssl ma laila.

Mea nui!

Ma ke kahua "Processor's address", pono e hōʻike ʻia kahi helu i loaʻa mai ka Pūnaewele!

A me ka hoʻopā hope ʻana, e hoʻokomo i kā mākou CallMeOut ma ke ʻano he noi no ke kelepona ʻana (i ke kaomi ʻana i ka helu ma ka PBX, e lele ke kauoha e hoʻomaka i ke kelepona).

Ma ka papa kuhikuhi, koho: More -> Telephony -> More -> Settings, e hookomo i ka "Number for outgoing calls by default" Application: CallMeOut a kaomi "Save"

Hoʻohui o Asterisk a me Bitrix24

hoʻonohonoho asterisk

No ka launa pū ʻana ma waena o Asterisk a me Bitrix24, pono mākou e hoʻohui i ka mea hoʻohana callme AMI i 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

A laila, aia kekahi mau hana hoʻopunipuni e pono e hoʻokō me ka hoʻohana ʻana i ka dialplan (loaʻa iā mākou extensions.ael).

E haʻi wau i ka faila holoʻokoʻa, a laila e wehewehe wau:

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

};

E hoʻomaka kākou mai ka hoʻomaka: kuhikuhi poepoe honua.

Nā ʻano URLRECORDS mālama i ka URL i nā faila hoʻopaʻa kamaʻilio, e like me ia e huki ai ʻo Bitrix24 iā lākou i ke kāleka pili.

A laila, makemake mākou i ka macro macro i hoʻopaʻa '.

Maʻaneʻi, ma waho aʻe o ka hoʻopaʻa ʻana i nā kamaʻilio, e hoʻonohonoho mākou i ka loli Ka inoa piha.

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

Mālama ia i ka URL piha i kahi faila kikoʻī (ua kapa ʻia ka macro ma nā wahi āpau).

E noʻonoʻo kākou i ke kelepona puka ʻana:

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

E ʻōlelo kākou e kelepona iā 89991234567, ka mea mua i loaʻa iā mākou ma ʻaneʻi:

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

ka poe. ua kapa ʻia ka macro hoʻopaʻa kelepona a ua hoʻonohonoho ʻia nā mea hoʻololi pono.

no hoi ia

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

Hoʻopaʻa mākou i ka mea nāna i hoʻomaka ke kelepona a hoʻopaʻa i ka manawa hoʻomaka o ke kelepona.

A i ka pau ʻana, ma kahi pōʻaiapili kūikawā 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});
}

e hoʻopau i ke komo ʻana ma ka papa CDR no kēia hoʻonui (ʻaʻole pono ma laila), hoʻonohonoho i ka manawa hope o ke kelepona, helu i ka lōʻihi, inā ʻaʻole ʻike ʻia ka hopena o ke kelepona - hoʻonohonoho (variable Kāhea iaʻu DISPOSITION) a, ʻo ka hana hope, e hoʻouna i nā mea a pau iā Bitrix ma o ka ʻōnaehana curl.

A he mea kilokilo hou aʻe - he kelepona hele mai:

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

Eia wale nō kā mākou hoihoi i ka laina hoʻokahi.

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

'Ōleloʻo ia e hoʻokomo iā PBX CallerID(inoa) hoʻololi CallMeCallerIDName.

ʻO ka hoʻololi CallMeCallerIDName ponoʻī, ua hoʻonohonoho ʻia e ka noi CallMe (inā he inoa piha ʻo Bitrix24 no ka helu o ka mea kelepona, e hoʻonoho mākou iā ia e like me CallerID(inoa), ʻaʻole - ʻaʻole mākou e hana i kekahi mea).

Hoʻonohonoho noi

Kōnae hoʻonohonoho noi - /var/www/pbx.vistep.ru/config.php

ʻO ka wehewehe ʻana i nā ʻāpana noi:

  • CallMeDEBUG - inā 1, a laila e kākau ʻia nā hanana āpau e ka noi i ka faila log, 0 - ʻaʻole mākou e kākau i kekahi mea
  • ʻenehana SIP/PJSIP/IAX/etc
  • authToken - Bitrix24 hōʻailona mana, puka i waho webhook palapala ʻae
  • bitrixApiUrl — HKH o ka webhook e hiki mai ana, me ka ʻike ʻole/
  • hoʻonui - papa inoa o nā helu waho
  • ka pōʻaiapili — pōʻaiapili no ka hoʻomaka ʻana o ke kelepona
  • listener_timeout - ka wikiwiki o ka hana hanana mai ka asterisk
  • kiʻi - kahi papa me nā hoʻonohonoho pili i ka asterisk:
  • koa - ip a i ʻole hostname o ka kikowaena asterisk
  • polokalamu — kiʻikuhi pili (tcp://, tls://)
  • ke awa - awa
  • inoa mea hoʻohana - inoa hoʻohana
  • huna - hua huna
  • hoʻokuʻu_manawa - pau ka manawa pili
  • heluhelu_manawa - heluhelu manawa pau

laʻana waihona hoʻonohonoho:

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

);

Hoʻonohonoho luna

Hoʻohana ʻia ʻo Supervisor no ka hoʻomaka ʻana i ke kaʻina hana hoʻokele hanana Asterisk CallMeIn.php, nāna e nānā i nā kelepona komo a launa pū me Bitrix24 (hōʻike i ke kāleka, hūnā i ke kāleka, etc.).

Nā faila e hana ai:

/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

Hoʻomaka a hoʻomaka hou i ka polokalamu:

supervisorctl start callme
supervisorctl restart callme

e nānā i ke kūlana o ka noi:

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

hopena

Ua paʻakikī loa ia, akā maopopo iaʻu e hiki i kahi luna hoʻokele akamai ke hoʻokō a hōʻoluʻolu i kāna mea hoʻohana.

E like me ka mea i hoʻohiki ʻia, loulou i github.

Nā nīnau, manaʻo manaʻo - e ʻoluʻolu ma nā manaʻo. Eia kekahi, inā makemake ʻoe i ka hele ʻana o ka hoʻomohala ʻana o kēia hoʻohui, e kākau, a ma ka ʻatikala aʻe e hoʻāʻo wau e hōʻike i nā mea āpau i nā kikoʻī.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka