Samþætting Asterisk og Bitrix24

Samþætting Asterisk og Bitrix24
Netið hefur mismunandi möguleika til að samþætta IP-PBX Asterisk og CRM Bitrix24, en við ákváðum engu að síður að skrifa okkar eigin.

Virknilega séð er allt staðlað:

  • Með því að smella á hlekkinn með símanúmeri viðskiptavinarins í Bitrix24 tengir Asterisk innra númer notandans sem þessi smellur var á vegum hans við símanúmer viðskiptavinarins. Í Bitrix24 er skrá yfir símtalið skráð og í lok símtalsins er samtalsskráin dregin upp.
  • Símtal berst í Stjörnu utanfrá - í Bitrix24 viðmótinu sýnum við starfsmanni sem þetta símtal barst í númer viðskiptavinarins.
    Ef það er enginn slíkur viðskiptavinur, opnaðu kortið til að búa til nýtt kaup.
    Um leið og símtalinu er lokið endurspeglum við þetta á kortinu og drögum upp upptöku samtalsins upp.

Undir klippunni skal ég segja þér hvernig á að setja allt upp fyrir sjálfan þig og gefa tengil á github - já, já, taktu það og notaðu það!

Almenn lýsing

Við kölluðum samþættingu okkar CallMe. CallMe er lítið vefforrit skrifað í PHP.

Notuð tækni og þjónusta

  • PHP 5.6
  • PHP AMI bókasafn
  • Semja
  • nginx + php fpm
  • umsjónarmaður
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (einfölduð REST API útfærsla)

forstilling

Á þjóninum með Asterisk þarftu að setja upp vefþjón (við erum með nginx + php-fpm), supervisor og git.

Uppsetningarskipun (CentOS):

yum install nginx php-fpm supervisor git

Við sendum möppuna sem er tiltæk fyrir vefþjóninn, dragum forritið úr git og setjum nauðsynleg réttindi á möppuna:


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

Næst skaltu stilla nginx, stillingin okkar er staðsett í

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

Ég mun skilja greininguna á stillingunum, öryggisvandamálum, fá skírteini og jafnvel val á vefþjóni utan ramma greinarinnar - mikið hefur verið skrifað um þetta. Forritið hefur engar takmarkanir, það virkar bæði á http og https.

Við höfum https, við skulum dulkóða vottorð.

Ef þú gerðir allt rétt, þá ættir þú að sjá eitthvað eins og þetta með því að smella á hlekkinn

Samþætting Asterisk og Bitrix24

Uppsetning Bitrix24

Við skulum búa til tvo webhooks.

Vefhókur á innleið.

Undir stjórnandareikningnum (með auðkenni 1) farðu eftir slóðinni: Forrit -> Webhooks -> Add webhook -> Incoming webhook

Samþætting Asterisk og Bitrix24

Fylltu út færibreytur komandi vefhóks eins og á skjámyndunum:

Samþætting Asterisk og Bitrix24

Samþætting Asterisk og Bitrix24

Og smelltu á vista.

Eftir vistun mun Bitrix24 gefa upp vefslóð komandi vefhóks, til dæmis:

Samþætting Asterisk og Bitrix24

Vistaðu útgáfuna þína af vefslóðinni án /prófílsins/ - það verður notað í forritinu til að vinna með símtölum sem berast.

ég hef það https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Sendandi vefhook.

Forrit -> Webhooks -> Add Webhook -> Outgoing Webhook

Upplýsingar eru á skjámyndum:

Samþætting Asterisk og Bitrix24

Samþætting Asterisk og Bitrix24

Vistaðu og fáðu heimildarkóðann

Samþætting Asterisk og Bitrix24

ég hef það xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Þú þarft líka að afrita það á sjálfan þig, það er nauðsynlegt til að hringja út.

Mikilvægt!

Ssl vottorð verður að vera stillt á Bitrix24 þjóninum (þú getur notað letsencrypt), annars virkar BitrixXNUMX API ekki. Ef þú ert með skýjaútgáfu skaltu ekki hafa áhyggjur - ssl er þegar til staðar.

Mikilvægt!

Í reitnum „Heimilisfang vinnsluaðila“ þarf að tilgreina heimilisfang sem er aðgengilegt af netinu!

Og með síðustu snertingu skulum við setja CallMeOut okkar upp sem forrit til að hringja (svo að með því að smella á númerið á PBX mun skipun fljúga til að hringja).

Í valmyndinni, veldu: Meira -> Símakerfi -> Meira -> Stillingar, settu inn "Númer fyrir úthringingar sjálfgefið" Forrit: CallMeOut og smelltu á "Vista"

Samþætting Asterisk og Bitrix24

stjörnuuppsetning

Til að ná árangri í samskiptum milli Asterisk og Bitrix24 þurfum við að bæta callme AMI notandanum við 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

Næst eru nokkur brellur sem þarf að útfæra með því að nota dialplan (við höfum extensions.ael).

Ég ætla að vitna í alla skrána og gefa síðan skýringar:

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

};

Byrjum á byrjuninni: tilskipun globals.

Breytilegt URL RECORDS geymir slóðina á samtalsupptökuskrárnar, samkvæmt því mun Bitrix24 draga þær inn á tengiliðaspjaldið.

Næst höfum við áhuga á macro macro upptöku.

Hér, auk þess að taka upp samtöl, munum við stilla breytuna FullFname.

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

Það geymir alla vefslóðina á tiltekna skrá (fjölvi er kallaður alls staðar).

Við skulum greina úthringinguna:

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

Segjum að við hringjum í 89991234567, það fyrsta sem við fáum hér:

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

þeim. hringt er í símtalsupptökufjöldann og nauðsynlegar breytur stilltar.

Nánar

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

við skráum hver byrjaði símtalið og skráum upphafstíma símtalsins.

Og að því loknu, í sérstöku samhengi 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});
}

slökktu á færslunni í CDR töflunni fyrir þessa viðbyggingu (þarf ekki þar), stilltu lokatíma símtalsins, reiknaðu lengdina, ef niðurstaða símtalsins er ekki þekkt - stilltu (breytu Kallaðu mig ORÐSTÖÐUN) og síðasta skrefið, sendu allt til Bitrix í gegnum system curl.

Og aðeins meiri töfrar - símtal sem berast:

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ér höfum við aðeins áhuga á einni línu.

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

Hún segir PBX setja upp Hringir (nafn) breytilegt CallMeCallerIDName.

CallMeCallerIDName breytan sjálf er aftur á móti stillt af CallMe forritinu (ef Bitrix24 hefur fullt nafn fyrir númer þess sem hringir munum við stilla það sem Hringir (nafn), nei - við gerum ekki neitt).

Uppsetning forrita

Forritsstillingaskrá - /var/www/pbx.vistep.ru/config.php

Lýsing á forritabreytum:

  • CallMeDEBUG - ef 1, þá verða allir atburðir sem forritið vinnur með skrifað í annálaskrána, 0 - við skrifum ekki neitt
  • Tech SIP/PJSIP/IAX/o.s.frv
  • authToken — Bitrix24 heimildarlykill, heimildarkóði á útleið vefhook
  • bitrixApiUrl — Vefslóð komandi vefhóks, án prófíls/
  • útvíkkun — listi yfir ytri númer
  • samhengi — samhengi fyrir upphaf símtala
  • hlustar_tími - vinnsluhraði atburða frá stjörnu
  • stjörnu - fylki með tengistillingum við stjörnuna:
  • gestgjafi - ip eða hýsingarheiti stjörnuþjónsins
  • kerfi - tengimynd (tcp://, tls://)
  • höfn - höfn
  • notandanafn - Notandanafn
  • leyndarmál - lykilorð
  • connect_timeout - tengingartími
  • lestur_tími - lestími

dæmi stillingaskrá:

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

);

Uppsetning umsjónarmanns

Supervisor er notaður til að ræsa Asterisk CallMeIn.php atburðastjórnunarferlið, sem fylgist með símtölum og hefur samskipti við Bitrix24 (sýna kortið, fela kortið osfrv.).

Stillingaskrá til að búa til:

/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

Byrja og endurræsa forritið:

supervisorctl start callme
supervisorctl restart callme

skoða stöðu umsóknarinnar:

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

Ályktun

Það reyndist frekar erfitt, en ég er viss um að reyndur stjórnandi mun geta innleitt og þóknast notendum sínum.

Eins og lofað var, tengill á github.

Spurningar, tillögur - vinsamlegast í athugasemdum. Einnig, ef þú hefur áhuga á hvernig þróun þessarar samþættingar gekk, skrifaðu, og í næstu grein mun ég reyna að sýna allt nánar.

Heimild: www.habr.com

Bæta við athugasemd