Fampidirana ny Asterisk sy Bitrix24

Fampidirana ny Asterisk sy Bitrix24
Misy safidy samihafa amin'ny fampidirana ny IP-PBX Asterisk sy CRM Bitrix24 amin'ny tambajotra, saingy mbola nanapa-kevitra ny hanoratra ny anay izahay.

Amin'ny lafiny fampiasa, ny zava-drehetra dia mahazatra:

  • Amin'ny alΓ lan'ny fipihana rohy misy laharan-telefaonin'ny mpanjifa ao amin'ny Bitrix24, dia ampifandraisin'ny Asterisk amin'ny laharan-telefaonan'ny mpanjifa ny nomeraon'ny mpampiasa azy. Ao amin'ny Bitrix24, misy firaketana an-tsoratra momba ny antso ary amin'ny fiafaran'ny antso dia alaina ny firaketana ny resaka.
  • Mandray antso avy any ivelany ny Asterisk - ao amin'ny interface Bitrix24 dia asehontsika ny karatra mpanjifa amin'ny mpiasa izay nahatongavan'ity antso ity.
    Raha tsy misy mpanjifa toy izany dia hanokatra ny karatra hamoronana fitarihana vaovao izahay.
    Raha vantany vao vita ny antso, dia maneho izany eo amin'ny karatra izahay ary manangana firaketana ny resaka.

Eo ambanin'ny fanapahana dia holazaiko aminao ny fomba hametrahana ny zava-drehetra ho anao ary hanome anao rohy mankany amin'ny github - eny, eny, raiso ary ampiasao izany!

Famaritana ankapobeny

Nantsoinay ny fampidiranay CallMe. CallMe dia fampiharana tranonkala kely voasoratra amin'ny PHP.

Teknolojia sy serivisy ampiasaina

  • PHP 5.6
  • PHP AMI Library
  • Composer
  • Nginx + php-fpm
  • mpanara-maso
  • AMI (Asterisk Manager Interface)
  • Bitrix webhooks (fampiharana REST API notsorina)

presetting

Amin'ny mpizara misy Asterisk dia mila mametraka mpizara tranonkala ianao (ho anay dia nginx+php-fpm), mpanara-maso ary git.

Baiko fametrahana (CentOS):

yum install nginx php-fpm supervisor git

Mandeha any amin'ny lahatahiry azo idirana amin'ny mpizara tranonkala izahay, misintona ny fampiharana avy amin'ny Git ary mametraka ny zo ilaina amin'ny lahatahiry:


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

Manaraka, andeha amboary ny nginx, ny config dia hita ao

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

Hiala amin'ny fanaparitahana ny config, ny olana momba ny fiarovana, ny fahazoana mari-pankasitrahana aho ary na dia ny fisafidianana mpizara tranonkala ivelan'ny sehatry ny lahatsoratra aza - betsaka no nosoratana momba izany. Tsy misy famerana ny fampiharana, miasa amin'ny http sy https.

Mampiasa https izahay, andao hanao encryption ny taratasy fanamarinana.

Raha nanao ny zava-drehetra araka ny tokony ho izy ianao dia tokony hahita zavatra toy izao amin'ny fipihana ny rohy

Fampidirana ny Asterisk sy Bitrix24

Fametrahana Bitrix24

Andao hamorona webhook roa.

Webhook miditra.

Eo ambanin'ny kaonty administratera (miaraka amin'ny id 1), araho ny lalana: Applications -> Webhooks -> Add webhook -> Incoming webhook

Fampidirana ny Asterisk sy Bitrix24

Fenoy ny mason'ny webhook miditra toy ny amin'ny pikantsary:

Fampidirana ny Asterisk sy Bitrix24

Fampidirana ny Asterisk sy Bitrix24

Ary tsindrio Save.

Aorian'ny fitahirizana, Bitrix24 dia hanome ny URL an'ny webhook miditra, ohatra:

Fampidirana ny Asterisk sy Bitrix24

Tehirizo ny dikan-teninao amin'ny URL raha tsy misy ny /profile/ farany - hampiasaina amin'ny fampiharana izany mba hiasa amin'ny antso miditra.

Manana ity aho https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

Webhook mivoaka.

Fampiharana -> Webhooks -> Ampio webhook -> Webhook mivoaka

Ny antsipiriany indray amin'ny pikantsary:

Fampidirana ny Asterisk sy Bitrix24

Fampidirana ny Asterisk sy Bitrix24

Tehirizo ary raiso ny kaody fanomezan-dΓ lana

Fampidirana ny Asterisk sy Bitrix24

Manana ity aho xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. Mila maka tahaka izany ho an'ny tenanao ihany koa ianao;

Zava-dehibe!

Ny taratasy fanamarinana SSL dia tsy maintsy amboarina amin'ny mpizara Bitrix24 (azonao ampiasaina ny letsencrypt), raha tsy izany dia tsy mandeha ny Bitrix api. Raha manana dikan-drahona ianao dia aza manahy - efa misy ssl.

Zava-dehibe!

Ny saha "Adiresy Processor" dia tsy maintsy misy adiresy azo idirana amin'ny Internet!

Ary ho fikasihana farany, andao hametraka ny CallMeOut ho toy ny fampiharana hanaovana antso (ka rehefa manindry ny laharana eo amin'ny PBX ianao, dia hanidina ny baikon'ny fiavian'ny antso).

Ao amin'ny menio, safidio: More -> Telephony -> More -> Settings, apetraho ao amin'ny "Laharana fiantsoana mivoaka default" Application: CallMeOut ary tsindrio ny "Save"

Fampidirana ny Asterisk sy Bitrix24

Fametrahana asterisk

Mba hahazoana fifandraisana mahomby eo amin'ny Asterisk sy Bitrix24, mila ampiana ny callme mpampiasa AMI amin'ny 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

Manaraka izany dia misy fika maromaro mila ampiharina amin'ny alΓ lan'ny dialplan (aminay dia extensions.ael).

Hanome ny rakitra manontolo aho, ary avy eo dia hanome fanazavana aho:

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

};

Andeha isika hanomboka amin'ny voalohany: ny toromarika globaly.

Miovaova URLRECORDS mitahiry ny URL amin'ny rakitra firaketana resaka, araka izay i Bitrix24 no hisintona azy ireo ao amin'ny karatra fifandraisana.

Manaraka izany dia liana amin'ny macro macro isika peo.

Eto, ankoatry ny firaketana resaka, dia hametraka ny fari-piainana FullFname.

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

Izy io dia mitahiry ny URL feno amin'ny rakitra manokana (antsoina hoe aiza ny macro).

Andeha hojerentsika ny antso nivoaka:

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

Andeha atao hoe miantso ny 89991234567, voalohany indrindra tonga eto:

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

ireo. Antsoina ny macro fandraketana resaka ary apetraka ny fari-piainana ilaina.

bebe kokoa

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

Raketinay hoe iza no nanomboka ny antso ary raketinay ny ora fanombohan'ny antso.

Ary rehefa vita izany, amin'ny toe-javatra manokana 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});
}

esory ny fidirana amin'ny latabatra CDR ho an'ity fanitarana ity (tsy ilaina izany), apetraho ny fotoana fiafaran'ny antso, kajy ny faharetany, raha tsy fantatra ny valin'ny antso - napetraka (variable CallMeDISPOSITION) ary, ny dingana farany, alefaso any amin'ny Bitrix amin'ny alΓ lan'ny system curl.

Ary ody kely kokoa - antso ho avy:

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

Andalana iray ihany no mahaliana antsika eto.

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

Nilaza tamin'ny PBX izy mba hametraka CallerID(anarana) mitovy amin'ny miovaova CallMeCallerIDName.

Ny fari-pahaizan'ny CallMeCallerIDName, kosa, dia napetraky ny fampiharana CallMe (raha manana anarana feno ho an'ny laharan'ny mpiantso ny Bitrix24, dia apetraho ho CallerID(anarana), tsia - tsy hanao na inona na inona izahay).

Fametrahana ny fampiharana

File fisie fampiharana - /var/www/pbx.vistep.ru/config.php

Famaritana ny mari-pamantarana fampiharana:

  • CallMeDEBUG - raha 1, dia hosoratana amin'ny rakitra log ny hetsika rehetra nokarakarain'ny fampiharana, 0 - tsy manoratra na inona na inona izahay
  • Tech - SIP/PJSIP/IAX/sns
  • authToken - Token'ny fanomezan-dΓ lana Bitrix24, kaody fanomezan-dΓ lana mivoaka amin'ny webhook
  • bitrixApiUrl - URL an'ny webhook miditra, tsy misy mombamomba/
  • extensionions - lisitry ny isa ivelany
  • teny manodidina - contexte niavian'ny antso
  • listener_time out - hafainganam-pandehan'ny hetsika avy amin'ny asterisk
  • asterisk - laharana misy fika ahafahana mampifandray amin'ny asterisk:
  • miaramila - ip na anaran'ny mpampiantrano ny mpizara asterisk
  • tetika - kisarisary fifandraisana (tcp://, tls://)
  • seranan-tsambo - seranana
  • Anaran'ny mpampiasa - Anarana mpampiasa
  • zava-miafina - tenimiafina
  • connect_time out - fe-potoana fifandraisana
  • read_time out - famakiana fotoana

ohatra fisie fichier:

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

);

Fametrahana mpanara-maso

Ny Supervisor dia ampiasaina amin'ny fanombohana ny fizotran'ny mpikarakara hetsika avy amin'ny Asterisk CallMeIn.php, izay manara-maso ny antso miditra sy mifandray amin'ny Bitrix24 (asehoy ny karatra, afeno karatra, sns.).

Fikirakirana hoforonina:

/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

Alefaso ary avereno indray ny fampiharana:

supervisorctl start callme
supervisorctl restart callme

Mijery ny toetry ny fiasan'ny fampiharana:

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

famaranana

Sarotra be izany, saingy azoko antoka fa ho afaka hampihatra izany ny mpitantana za-draharaha ary hampifaly ny mpampiasa azy.

Araka ny nampanantenaina, rohy mankany github.

Fanontaniana, soso-kevitra - avelao izy ireo ao amin'ny fanehoan-kevitra. Ary koa, raha liana amin'ny fomba nandehanan'ny fampivoarana ity fampidirana ity ianao, soraty, ary amin'ny lahatsoratra manaraka dia hiezaka ny hanambara ny zava-drehetra amin'ny antsipiriany bebe kokoa aho.

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS πŸ”₯ Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster