Kuphatikiza kwa Asterisk ndi Bitrix24

Kuphatikiza kwa Asterisk ndi Bitrix24
Pali zosankha zosiyanasiyana zophatikizira IP-PBX Asterisk ndi CRM Bitrix24 pa netiweki, komabe tidaganiza zolemba zathu.

Pankhani ya magwiridwe antchito, zonse ndizokhazikika:

  • Podina ulalo wokhala ndi nambala yafoni ya kasitomala ku Bitrix24, Asterisk imalumikiza nambala yamkati ya wogwiritsa ntchito yemwe kudina kwake kudapangidwa ndi nambala yafoni ya kasitomala. Mu Bitrix24, mbiri yakuyimbayimba imajambulidwa ndipo, kumapeto kwa kuyimba, kujambula kwa zokambirana kumakokedwa.
  • Nyenyezi imalandira foni kuchokera kunja - mu mawonekedwe a Bitrix24 tikuwonetsa khadi la kasitomala kwa wogwira ntchito yemwe nambala yake idafika.
    Ngati palibe kasitomala wotere, tidzatsegula khadi kuti tipange chitsogozo chatsopano.
    Kuyitanako kukangotha, timawonetsa izi pa khadi ndikukweza kujambula kwa zokambiranazo.

Pansi pa odulidwawo ndikuuzani momwe mungadzikhazikitsire nokha ndikukupatsani ulalo wa github - inde, inde, tengani ndikugwiritseni ntchito!

Kulongosola kwachidule

Tinatcha kuphatikiza kwathu CallMe. CallMe ndi pulogalamu yaying'ono yapaintaneti yolembedwa mu PHP.

Tekinoloje ndi ntchito zomwe zimagwiritsidwa ntchito

  • PHP 5.6
  • PHP AMI library
  • Wopeka
  • Nginx + php-fpm
  • woyang'anira
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (kusintha kwa REST API)

kukhazikitsa

Pa seva yokhala ndi Asterisk, muyenera kukhazikitsa seva yapaintaneti (kwa ife ndi nginx + php-fpm), woyang'anira ndi git.

Lamulo lokhazikitsa (CentOS):

yum install nginx php-fpm supervisor git

Timapita ku chikwatu chomwe chikupezeka pa seva yapaintaneti, kokerani pulogalamuyi kuchokera ku Git ndikuyika ufulu wofunikira pafoda:


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

Kenako, tiyeni tikonze nginx, config yathu ili mkati

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

Ndisiya kugawa zosintha, zovuta zachitetezo, kupeza satifiketi komanso kusankha seva yapaintaneti kunja kwa nkhaniyo - zambiri zalembedwa za izi. Pulogalamuyi ilibe zoletsa, imagwira ntchito pa http ndi https.

Timagwiritsa ntchito https, tiyeni tilembe satifiketi.

Ngati mwachita zonse molondola, ndiye podina ulalo muyenera kuwona chonga ichi

Kuphatikiza kwa Asterisk ndi Bitrix24

Kukhazikitsa Bitrix24

Tiyeni tipange ma webhooks awiri.

Webhook yobwera.

Pansi pa akaunti ya woyang'anira (ndi id 1), tsatirani njira: Mapulogalamu -> Webhooks -> Onjezani webhook -> Webhook yomwe ikubwera

Kuphatikiza kwa Asterisk ndi Bitrix24

Lembani magawo a webhook yomwe ikubwera monga pazithunzi:

Kuphatikiza kwa Asterisk ndi Bitrix24

Kuphatikiza kwa Asterisk ndi Bitrix24

Ndipo dinani Save.

Mukasunga, Bitrix24 ipereka ulalo wa webhook yomwe ikubwera, mwachitsanzo:

Kuphatikiza kwa Asterisk ndi Bitrix24

Sungani mtundu wanu wa ulalo wopanda chomaliza / mbiri/ - idzagwiritsidwa ntchito mu pulogalamuyo kuti mugwire ntchito ndi mafoni omwe akubwera.

Ndili ndi izi https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook yotuluka.

Mapulogalamu -> Webhook -> Onjezani webhook -> Webhook yotuluka

Zambiri zilinso pazithunzi:

Kuphatikiza kwa Asterisk ndi Bitrix24

Kuphatikiza kwa Asterisk ndi Bitrix24

Sungani ndikulandila nambala yololeza

Kuphatikiza kwa Asterisk ndi Bitrix24

Ndili ndi izi xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Muyeneranso kuzikopera nokha; muyenera kuyimba mafoni otuluka.

Zofunika!

Satifiketi ya SSL iyenera kukhazikitsidwa pa seva ya Bitrix24 (mutha kugwiritsa ntchito letsencrypt), apo ayi Bitrix api sigwira ntchito. Ngati muli ndi mtundu wamtambo, musadandaule - ili ndi ssl.

Zofunika!

Gawo la "Processor Address" liyenera kukhala ndi adilesi yopezeka pa intaneti!

Ndipo monga kukhudza komaliza, tiyeni tiyike CallMeOut yathu ngati pulogalamu yoyimba mafoni (kotero kuti mukadina pa nambala yomwe ili pa PBX, lamulo loyambitsa kuyimbako liwuluke).

Mu menyu, sankhani: Zambiri -> Telephony -> Zambiri -> Zokonda, khalani mu "Nambala yoyimba yotuluka" Ntchito: CallMeOut ndikudina "Sungani"

Kuphatikiza kwa Asterisk ndi Bitrix24

Kupanga asterisk

Kuti tichite bwino pakati pa Asterisk ndi Bitrix24, tifunika kuwonjezera callme ya AMI ku 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

Kenako, pali zidule zingapo zomwe zidzafunikire kukhazikitsidwa kudzera pa dialplan (kwa ife iyi ndi extensions.ael).

Ndipereka fayilo yonse, kenako ndikufotokozerani:

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

};

Tiyeni tiyambe kuyambira pachiyambi: malangizo padziko lonse lapansi.

Zosiyanasiyana URLRECORDS imasunga ulalo ku mafayilo ojambulira zokambirana, malinga ndi zomwe Bitrix24 iwakokera mumakhadi olumikizana nawo.

Kenako timachita chidwi ndi macro macro Zojambula.

Pano, kuwonjezera pa kujambula zokambirana, tidzakhazikitsa kusintha FullFname.

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

Imasunga ulalo wathunthu ku fayilo inayake (macro amatchedwa paliponse).

Tiyeni tiwunikenso kuyimba komwe kumatuluka:

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

Tinene kuti tikuyimba 89991234567, choyamba tifika apa:

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

izo. Nkhani yojambulira macro imatchedwa ndipo zosintha zofunika zimayikidwa.

anapitiriza

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

Timalemba yemwe adayambitsa kuyimba ndikujambulitsa nthawi yoyimba.

Ndipo akamaliza, mu nkhani yapadera 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});
}

zimitsani kulowa patebulo la CDR pakukulitsa uku (sikufunikira pamenepo), ikani nthawi yomaliza ya kuyimba, kuwerengera nthawi, ngati zotsatira za kuyimba sizidziwika - khazikitsani (zosinthika). CallMeDISPOSITION) ndipo, sitepe yotsiriza, tumizani chirichonse ku Bitrix kudzera mu curl dongosolo.

Ndipo matsenga ochulukirapo - kuyimba foni:

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

Pano tikungofuna mzere umodzi wokha.

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

Amauza PBX kukhazikitsa CallerID(dzina) zofanana ndi kusintha CallMeCallerIDName.

CallMeCallerIDName yosinthika yokha, nayonso, imayikidwa ndi CallMe application (ngati Bitrix24 ili ndi dzina lonse la nambala ya woyimbirayo, ikani ngati CallerID(dzina), ayi - sitingachite chilichonse).

Kukonzekera kwa pulogalamu

Fayilo yosinthira ntchito - /var/www/pbx.vistep.ru/config.php

Kufotokozera kwa magawo ogwiritsira ntchito:

  • CallMeDEBUG - ngati 1, ndiye kuti zochitika zonse zomwe zikugwiritsidwa ntchito zidzalembedwa ku fayilo ya log, 0 - sitilemba kalikonse
  • chatekinoloje - SIP/PJSIP/IAX/etc
  • authToken - Chizindikiro chovomerezeka cha Bitrix24, code yovomerezeka ya webhook yotuluka
  • bitrixApiUrl - URL ya webhook yomwe ikubwera, yopanda mbiri/
  • zowonjezera - mndandanda wa manambala akunja
  • nkhani - nkhani yoyambira kuyimba
  • omvera_timeout - Kuthamanga kwa zochitika kuchokera ku asterisk
  • asterisk - mndandanda wokhala ndi zoikamo zolumikizira nyenyezi:
  • khamu - ip kapena dzina la alendo la seva ya asterisk
  • ndondomeko - chithunzi cholumikizira (tcp://, tls://)
  • doko - doko
  • lolowera - Dzina lolowera
  • chinsinsi - password
  • connect_timeout - kugwirizana kwatha
  • read_timeout - werengani nthawi yomaliza

Fayilo yachitsanzo:

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

);

Kupanga kwa woyang'anira

Woyang'anira amagwiritsidwa ntchito poyambitsa ndondomeko yothandizira zochitika kuchokera ku Asterisk CallMeIn.php, yomwe imayang'anira mafoni omwe akubwera ndikuyanjana ndi Bitrix24 (khadi lowonetsera, khadi lobisala, etc.).

Fayilo yokonzekera kuti ipangidwe:

/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

Yambitsani ndikuyambitsanso pulogalamuyi:

supervisorctl start callme
supervisorctl restart callme

Kuwona momwe pulogalamuyo ikugwirira ntchito:

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

Pomaliza

Zinakhala zovuta kwambiri, koma ndikutsimikiza kuti woyang'anira wodziwa bwino azitha kugwiritsa ntchito ndikusangalatsa ogwiritsa ntchito ake.

Monga momwe analonjezera, kulumikizana ndi github.

Mafunso, malingaliro - chonde asiye mu ndemanga. Komanso, ngati muli ndi chidwi ndi momwe chitukuko cha kuphatikiza uku chinayendera, lembani, ndipo m'nkhani yotsatira ndidzayesa kuwulula zonse mwatsatanetsatane.

Source: www.habr.com

Kuwonjezera ndemanga