የአስቴሪክ እና Bitrix24 ውህደት

የአስቴሪክ እና Bitrix24 ውህደት
አውታረ መረቡ IP-PBX Asterik እና CRM Bitrix24 ን ለማዋሃድ የተለያዩ አማራጮች አሉት, ግን እኛ ግን የራሳችንን ለመጻፍ ወስነናል.

በተግባር ፣ ሁሉም ነገር መደበኛ ነው-

  • በBitrix24 ውስጥ ካለው የደንበኛው ስልክ ቁጥር ጋር ያለውን አገናኝ ጠቅ በማድረግ፣ ኮከብ ምልክት የተጠቃሚውን የውስጥ ቁጥር በደንበኛው ስልክ ቁጥር በመወከል ያገናኛል። በ Bitrix24 ውስጥ የጥሪው መዝገብ ይመዘገባል እና በጥሪው መጨረሻ ላይ የውይይት መዝገብ ይነሳል።
  • ጥሪ ከውጭ ወደ አስትሪስክ ይደርሳል - በ Bitrix24 በይነገጽ ውስጥ የደንበኛ ካርዱን ይህ ጥሪ ለደረሰበት ሰራተኛ እናሳያለን።
    እንደዚህ አይነት ደንበኛ ከሌለ አዲስ መሪ ለመፍጠር ካርዱን ይክፈቱ።
    ጥሪው እንደተጠናቀቀ, ይህንን በካርዱ ውስጥ እናንጸባርቃለን እና የውይይቱን ቅጂ እናነሳለን.

በቆራጩ ስር ሁሉንም ነገር ለራስዎ እንዴት እንደሚያዘጋጁ እነግርዎታለሁ እና ለ github አገናኝ - አዎ ፣ አዎ ይውሰዱት እና ይጠቀሙበት!

አጠቃላይ መግለጫ

ውህደታችንን CallMe ብለነዋል። CallMe በPHP የተጻፈ ትንሽ የድር መተግበሪያ ነው።

ያገለገሉ ቴክኖሎጂዎች እና አገልግሎቶች

ቅድመ ዝግጅት ማድረግ

አስትሪስክ ባለው አገልጋይ ላይ የድር አገልጋይ (nginx + php-fpm አለን)፣ ሱፐርቫይዘር እና ጂት መጫን ያስፈልግዎታል።

የመጫኛ ትዕዛዝ (CentOS)፡-

yum install nginx php-fpm supervisor git

ለድር አገልጋዩ የሚገኘውን ማውጫ እናስተላልፋለን ፣ አፕሊኬሽኑን ከ git ጎትተን እና አስፈላጊዎቹን መብቶች ወደ አቃፊው እናዘጋጃለን-


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

በመቀጠል nginx ን ያዋቅሩ፣ የእኛ ውቅረት የሚገኘው በ ውስጥ ነው።

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

የውቅረትን ትንተና ፣ የደህንነት ጉዳዮችን ፣ የምስክር ወረቀት ማግኘት እና ከጽሑፉ ወሰን ውጭ የድር አገልጋይን እንኳን እመርጣለሁ - ስለዚህ ጉዳይ ብዙ ተጽፏል። አፕሊኬሽኑ ምንም ገደብ የለዉም በ http እና https ላይ ይሰራል።

https አለን፣ ሰርተፍኬት እናመስጥር።

ሁሉንም ነገር በትክክል ካደረጉት, አገናኙን ጠቅ በማድረግ እንደዚህ ያለ ነገር ማየት አለብዎት

የአስቴሪክ እና Bitrix24 ውህደት

Bitrix24 ን በማዋቀር ላይ

ሁለት የድር መንጠቆዎችን እንፍጠር።

ገቢ የድር መንጠቆ።

በአስተዳዳሪ መለያ ስር (በመታወቂያ 1) በመንገዱ ላይ ይሂዱ፡ መተግበሪያዎች -> የድር መንጠቆዎች -> የድር መንጠቆን ይጨምሩ -> መጪ የድር መንጠቆ

የአስቴሪክ እና Bitrix24 ውህደት

እንደ ቅጽበታዊ ገጽ እይታዎች የገቢውን የድር መንጠቆ መለኪያዎችን ይሙሉ፡

የአስቴሪክ እና Bitrix24 ውህደት

የአስቴሪክ እና Bitrix24 ውህደት

እና አስቀምጥን ጠቅ ያድርጉ።

ካስቀመጠ በኋላ Bitrix24 የመጪውን የድር መንጠቆ ዩአርኤል ያቀርባል፣ ለምሳሌ፡-

የአስቴሪክ እና Bitrix24 ውህደት

የዩአርኤል ሥሪትዎን ያለ መከታተያ/መገለጫ/ ያስቀምጡ - ከገቢ ጥሪዎች ጋር ለመስራት በመተግበሪያው ውስጥ ጥቅም ላይ ይውላል።

አለኝ https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

ወጪ የድር መንጠቆ።

መተግበሪያዎች -> የድር መንጠቆዎች -> Webhook ጨምር -> የወጪ ድር መንጠቆ

ዝርዝሮች በቅጽበታዊ ገጽ እይታዎች ላይ ይገኛሉ፡-

የአስቴሪክ እና Bitrix24 ውህደት

የአስቴሪክ እና Bitrix24 ውህደት

አስቀምጥ እና የፍቃድ ኮድ አግኝ

የአስቴሪክ እና Bitrix24 ውህደት

አለኝ xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. እንዲሁም ወደ እራስዎ መቅዳት ያስፈልግዎታል, ወጪ ጥሪዎችን ለማድረግ ያስፈልጋል.

አስፈላጊ!

የssl ሰርተፍኬት በBitrix24 አገልጋይ ላይ መዋቀር አለበት (ሌሴንክሪፕት መጠቀም ይችላሉ)፣ አለበለዚያ BitrixXNUMX api አይሰራም። የደመና ስሪት ካሎት, አይጨነቁ - ssl ቀድሞውኑ አለ.

አስፈላጊ!

በ "ፕሮሰሰር አድራሻ" መስክ ከኢንተርኔት የሚገኝ አድራሻ መጠቆም አለበት!

እና በመጨረሻው ንክኪ ጥሪ ለማድረግ የእኛን CallMeOut እንደ መተግበሪያ እንጭነው (በፒቢኤክስ ላይ ያለውን ቁጥር ጠቅ በማድረግ ጥሪውን ለመጀመር ትዕዛዝ ይበርራል)።

በምናሌው ውስጥ፡ ተጨማሪ -> ቴሌፎን -> ተጨማሪ -> መቼቶች የሚለውን ይምረጡ፡ “በነባሪ ወጪ ጥሪዎች ቁጥር” የሚለውን መተግበሪያ፡ CallMeOut የሚለውን ይንኩ።

የአስቴሪክ እና Bitrix24 ውህደት

የኮከብ አቀማመጥ

በAsterisk እና Bitrix24 መካከል ለተሳካ መስተጋብር፣የደዋይ AMI ተጠቃሚን ወደ 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

በመቀጠል, dialplan ን በመጠቀም መተግበር ያለባቸው ጥቂት ዘዴዎች አሉ (እኛ extensions.ael አለን).

ሙሉውን ፋይል እጠቅሳለሁ እና ማብራሪያዎችን እሰጣለሁ፡-

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

};

ከመጀመሪያው እንጀምር፡ መመሪያ ግሎባንስ.

ተለዋዋጭ URL ሪኮርድስ ዩአርኤሉን ወደ የውይይት ቀረጻ ፋይሎች ያከማቻል፣ በዚህ መሠረት Bitrix24 ወደ የእውቂያ ካርዱ ይጎትቷቸዋል።

በመቀጠል, ለማክሮ ማክሮ ፍላጎት አለን መቅዳት.

እዚህ, ንግግሮችን ከመቅዳት በተጨማሪ, ተለዋዋጭውን እናዘጋጃለን ሙሉ የፋን ስም.

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

ሙሉውን ዩአርኤል ወደ አንድ የተወሰነ ፋይል ያከማቻል (ማክሮው በሁሉም ቦታ ይባላል)።

ወጪ ጥሪውን እንመርምር፡-

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

89991234567 ደውለን እንበል፣ መጀመሪያ እዚህ የምናገኘው፡-

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

እነዚያ። የጥሪ ቀረጻ ማክሮ ተጠርቷል እና አስፈላጊዎቹ ተለዋዋጮች ተዘጋጅተዋል።

ከዚህ በላይ

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

ጥሪውን ማን እንደጀመረ እንመዘግባለን እና የጥሪው መጀመሪያ ሰዓት እንቀዳለን።

እና ሲጠናቀቅ በልዩ አውድ ውስጥ 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});
}

ለዚህ ቅጥያ በሲዲአር ሠንጠረዥ ውስጥ ያለውን ግቤት ያጥፉ (እዚያ አያስፈልግም), የጥሪው የመጨረሻ ጊዜ ያዘጋጁ, የሚቆይበትን ጊዜ ያሰሉ, የጥሪው ውጤት የማይታወቅ ከሆነ - አዘጋጅ (ተለዋዋጭ) ደውልልኝ DISPOSITION) እና, የመጨረሻው ደረጃ, ሁሉንም ነገር በሲስተም ኩርባ በኩል ወደ Bitrix ይላኩ.

እና ትንሽ ተጨማሪ አስማት - ገቢ ጥሪ:

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

እዚህ የምንፈልገው በአንድ መስመር ላይ ብቻ ነው።

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

PBX ጫን ትላለች። የደዋይ መታወቂያ (ስም) ተለዋዋጭ ደዋይ ደዋይ መታወቂያ ስም.

የCallerMeCaller መታወቂያው ተለዋዋጭ ራሱ፣ በተራው፣ በCallMe መተግበሪያ ተዘጋጅቷል (Bitrix24 ለጠሪው ቁጥር ሙሉ ስም ካለው፣ እንደ እናዘጋጀዋለን) የደዋይ መታወቂያ (ስም), አይሆንም - ምንም ነገር አናደርግም).

መተግበሪያ ማዋቀር

የመተግበሪያ ቅንብሮች ፋይል - /var/www/pbx.vistep.ru/config.php

የመተግበሪያ መለኪያዎች መግለጫ፡-

  • ደውልMeDEBUG - 1 ከሆነ ፣ በመተግበሪያው የተከናወኑ ሁሉም ክስተቶች ወደ ሎግ ፋይል ይፃፋሉ ፣ 0 - ምንም ነገር አንጽፍም
  • የቴክኖሎጂ SIP/PJSIP/IAX/ወዘተ
  • authToken — Bitrix24 የፈቀዳ ማስመሰያ፣ የወጪ የዌብ መንጠቆ የፍቃድ ኮድ
  • bitrixApiUrl - የመጪው የድር መንጠቆ ዩአርኤል፣ ያለ መገለጫ/
  • መጠኖች - የውጭ ቁጥሮች ዝርዝር
  • አውድ - የጥሪ አመጣጥ አውድ
  • የአድማጭ_ጊዜ ማብቂያ - የክስተት ሂደት ፍጥነት ከኮከብ
  • ኮከብ ምልክት - ከኮከቢት ጋር የግንኙነት ቅንብሮች ያለው ድርድር
  • አስተናጋጅ - የአስቴሪክ አገልጋይ አይፒ ወይም አስተናጋጅ ስም
  • እቅድ - የግንኙነት ንድፍ (tcp://, tls://)
  • ወደብ - ወደብ
  • የተጠቃሚ ስም - የተጠቃሚ ስም
  • ምሥጢራዊ - የይለፍ ቃል
  • የግንኙነት_ጊዜ ማብቂያ - የግንኙነት ጊዜ አልቋል
  • የማንበብ_ጊዜ ማብቂያ - የእረፍት ጊዜ ማንበብ

የቅንብሮች ፋይል ምሳሌ

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

);

የተቆጣጣሪ ማዋቀር

ተቆጣጣሪው ገቢ ጥሪዎችን የሚከታተል እና ከBitrix24 (ካርዱን ያሳዩ፣ ካርዱን ይደብቁ፣ ወዘተ) የሚገናኘውን የኮከብ የCallMeIn.php ክስተት ተቆጣጣሪ ሂደትን ለማስጀመር ይጠቅማል።

ለመፍጠር የቅንብሮች ፋይል፡-

/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

መተግበሪያውን መጀመር እና እንደገና ማስጀመር፡-

supervisorctl start callme
supervisorctl restart callme

የመተግበሪያውን ሁኔታ ይመልከቱ፡-

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

መደምደሚያ

በጣም አስቸጋሪ ሆኖ ተገኝቷል፣ ግን አንድ ልምድ ያለው አስተዳዳሪ ተጠቃሚዎቹን መተግበር እና ማስደሰት እንደሚችል እርግጠኛ ነኝ።

በገባው ቃል መሰረት ወደ github አገናኝ.

ጥያቄዎች, ጥቆማዎች - እባክዎን በአስተያየቶች ውስጥ. እንዲሁም, የዚህ ውህደት እድገት እንዴት እንደሄደ ለማወቅ ፍላጎት ካሎት, ይፃፉ, እና በሚቀጥለው ርዕስ ውስጥ ሁሉንም ነገር በበለጠ ዝርዝር ለማሳየት እሞክራለሁ.

ምንጭ: hab.com

አስተያየት ያክሉ