Asterisk اور Bitrix24 کا انٹیگریشن

Asterisk اور Bitrix24 کا انٹیگریشن
نیٹ ورک پر IP-PBX Asterisk اور CRM Bitrix24 کو یکجا کرنے کے لیے مختلف آپشنز موجود ہیں، لیکن ہم نے پھر بھی اپنا لکھنے کا فیصلہ کیا۔

فعالیت کے لحاظ سے، سب کچھ معیاری ہے:

  • Bitrix24 میں کلائنٹ کے فون نمبر والے لنک پر کلک کرنے سے، Asterisk صارف کے اندرونی نمبر کو جوڑتا ہے جس کی جانب سے کلائنٹ کے فون نمبر کے ساتھ کلک کیا گیا تھا۔ Bitrix24 میں، کال کا ایک ریکارڈ ریکارڈ کیا جاتا ہے اور، کال کے اختتام پر، گفتگو کی ریکارڈنگ کھینچ لی جاتی ہے۔
  • Asterisk کو باہر سے کال موصول ہوتی ہے - Bitrix24 انٹرفیس میں ہم اس ملازم کو کلائنٹ کارڈ دکھاتے ہیں جس کے نمبر پر یہ کال آئی تھی۔
    اگر ایسا کوئی کلائنٹ نہیں ہے، تو ہم ایک نئی لیڈ بنانے کے لیے کارڈ کھولیں گے۔
    جیسے ہی کال مکمل ہوتی ہے، ہم اسے کارڈ پر منعکس کرتے ہیں اور گفتگو کی ریکارڈنگ کھینچتے ہیں۔

کٹ کے نیچے میں آپ کو بتاؤں گا کہ اپنے لیے سب کچھ کیسے ترتیب دیا جائے اور آپ کو گیتھب کا لنک دیا جائے - ہاں، ہاں، اسے لے لو اور اسے استعمال کرو!

عمومی وضاحت

ہم نے اپنے انضمام کو CallMe کہا۔ کالمی پی ایچ پی میں لکھی گئی ایک چھوٹی ویب ایپلیکیشن ہے۔

استعمال شدہ ٹیکنالوجیز اور خدمات

  • پی ایچ پی کی 5.6
  • پی ایچ پی AMI لائبریری
  • تحریر
  • Nginx + php-fpm
  • سپروائزر
  • AMI (Asterisk مینیجر انٹرفیس)
  • Bitrix ویب ہکس (آسان REST API کا نفاذ)

پری سیٹنگ

Asterisk والے سرور پر، آپ کو ایک ویب سرور انسٹال کرنے کی ضرورت ہے (ہمارے لیے یہ nginx+php-fpm ہے)، سپروائزر اور git۔

انسٹالیشن کمانڈ (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 استعمال کرتے ہیں، آئیے سرٹیفکیٹ کو خفیہ کریں۔

اگر آپ نے سب کچھ صحیح طریقے سے کیا ہے، تو لنک پر کلک کرکے آپ کو کچھ ایسا نظر آنا چاہیے۔

Asterisk اور Bitrix24 کا انٹیگریشن

Bitrix24 ترتیب دینا

آئیے دو ویب ہکس بنائیں۔

آنے والا ویب ہک۔

ایڈمنسٹریٹر اکاؤنٹ کے تحت (آئی ڈی 1 کے ساتھ)، اس راستے پر عمل کریں: ایپلی کیشنز -> ویب ہکس -> ویب ہک شامل کریں -> آنے والی ویب ہک

Asterisk اور Bitrix24 کا انٹیگریشن

اسکرین شاٹس کی طرح آنے والے ویب ہک کے پیرامیٹرز کو پُر کریں:

Asterisk اور Bitrix24 کا انٹیگریشن

Asterisk اور Bitrix24 کا انٹیگریشن

اور محفوظ کریں پر کلک کریں۔

محفوظ کرنے کے بعد، Bitrix24 آنے والے ویب ہک کا URL فراہم کرے گا، مثال کے طور پر:

Asterisk اور Bitrix24 کا انٹیگریشن

اپنے URL کے ورژن کو حتمی /profile/ کے بغیر محفوظ کریں - اسے آنے والی کالوں کے ساتھ کام کرنے کے لیے ایپلی کیشن میں استعمال کیا جائے گا۔

یہ میرے پاس ہے https://b24-xsynia.bitrix24.ru/rest/1/7eh61lh8pahw0fwt/

آؤٹ گوئنگ ویب ہُک۔

ایپلی کیشنز -> ویب ہکس -> ویب ہک شامل کریں -> آؤٹ گوئنگ ویب ہک

تفصیلات دوبارہ اسکرین شاٹس پر ہیں:

Asterisk اور Bitrix24 کا انٹیگریشن

Asterisk اور Bitrix24 کا انٹیگریشن

اجازت کا کوڈ محفوظ کریں اور وصول کریں۔

Asterisk اور Bitrix24 کا انٹیگریشن

یہ میرے پاس ہے xcrp2ylhzzd2v43cmfjqmkvrgrcbkni6. آپ کو اسے اپنے لیے بھی کاپی کرنے کی ضرورت ہے؛ آپ کو آؤٹ گوئنگ کالز کرنے کے لیے اس کی ضرورت ہے۔

اہم!

ایک SSL سرٹیفکیٹ Bitrix24 سرور پر کنفیگر ہونا چاہیے (آپ letsencrypt استعمال کر سکتے ہیں)، ورنہ Bitrix api کام نہیں کرے گا۔ اگر آپ کے پاس کلاؤڈ ورژن ہے تو پریشان نہ ہوں - اس میں پہلے سے ہی ایس ایس ایل موجود ہے۔

اہم!

"پروسیسر ایڈریس" فیلڈ میں انٹرنیٹ سے قابل رسائی پتہ ہونا چاہیے!

اور حتمی رابطے کے طور پر، آئیے کال کرنے کے لیے ایک ایپلیکیشن کے طور پر اپنے CallMeOut کو انسٹال کریں (تاکہ جب آپ PBX پر موجود نمبر پر کلک کریں تو کال شروع کرنے کا حکم اڑ جائے)۔

مینو میں، منتخب کریں: مزید -> ٹیلی فونی -> مزید -> ترتیبات، "ڈیفالٹ آؤٹ گوئنگ کال نمبر" ایپلیکیشن میں سیٹ کریں: CallMeOut اور "محفوظ کریں" پر کلک کریں۔

Asterisk اور Bitrix24 کا انٹیگریشن

ستارہ ترتیب دینا

Asterisk اور Bitrix24 کے درمیان کامیاب تعامل کے لیے، ہمیں AMI صارف callme کو 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

اس کے بعد، کئی ترکیبیں ہیں جن کو ڈائل پلان کے ذریعے لاگو کرنے کی ضرورت ہوگی (ہمارے لیے یہ 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});
}

};

آئیے شروع سے شروع کریں: ہدایت عالمی سطح پر.

متغیر URLRECORDS 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});
}

اس ایکسٹینشن کے لیے سی ڈی آر ٹیبل میں داخلے کو غیر فعال کریں (وہاں اس کی ضرورت نہیں ہے)، کال کا اختتامی وقت مقرر کریں، مدت کا حساب لگائیں، اگر کال کا نتیجہ معلوم نہیں ہے - سیٹ (متغیر کال میڈیسپوزیشن) اور، آخری مرحلہ، سسٹم curl کے ذریعے سب کچھ 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());

وہ پی بی ایکس کو انسٹال کرنے کو کہتی ہے۔ کالر آئی ڈی (نام) متغیر کے برابر CallMeCallerIDName.

CallMeCallerIDName متغیر، بدلے میں، CallMe ایپلیکیشن کے ذریعے سیٹ کیا جاتا ہے (اگر Bitrix24 میں کالر کے نمبر کے لیے پورا نام ہے، تو اسے اس طرح سیٹ کریں کالر آئی ڈی (نام)، نہیں - ہم کچھ نہیں کریں گے)۔

ایپلیکیشن سیٹ اپ

ایپلیکیشن سیٹنگ فائل - /var/www/pbx.vistep.ru/config.php

درخواست کے پیرامیٹرز کی تفصیل:

  • کال میڈیبگ - اگر 1، تو ایپلی کیشن کے ذریعے پروسیس ہونے والے تمام واقعات لاگ فائل میں لکھے جائیں گے، 0 - ہم کچھ نہیں لکھتے
  • ٹیک - SIP/PJSIP/IAX/etc
  • authToken - Bitrix24 اجازت کا ٹوکن، آؤٹ گوئنگ ویب ہُک کی اجازت کا کوڈ
  • bitrixApiUrl - آنے والے ویب ہک کا URL، پروفائل کے بغیر/
  • توسیع - بیرونی نمبروں کی فہرست
  • سیاق و سباق - کال شروع کرنے کا سیاق و سباق
  • سننے والا_ٹائم آؤٹ - نجمہ سے ایونٹ پروسیسنگ کی رفتار
  • اسٹرک - ستارے سے جڑنے کی ترتیبات کے ساتھ ایک صف:
  • میزبان - نجمہ سرور کا ip یا میزبان نام
  • سکیم - کنکشن ڈایاگرام (tcp://, tls://)
  • پورٹ --.بندرگاہ n
  • کا صارف کا نام - صارف نام
  • راز - پاس ورڈ
  • connect_timeout - رابطے کا وقت ختم
  • read_timeout - ٹائم آؤٹ پڑھیں

مثال کی ترتیبات فائل:

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

);

سپروائزر سیٹ اپ

Asterisk CallMeIn.php سے ایونٹ ہینڈلر کے عمل کو شروع کرنے کے لیے سپروائزر کا استعمال کیا جاتا ہے، جو آنے والی کالوں کی نگرانی کرتا ہے اور Bitrix24 (کارڈ دکھائیں، کارڈ چھپائیں، وغیرہ) کے ساتھ تعامل کرتا ہے۔

ترتیبات کی فائل بنائی جائے گی:

/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

حاصل يہ ہوا

یہ کافی پیچیدہ نکلا، لیکن مجھے یقین ہے کہ ایک تجربہ کار منتظم اس پر عمل درآمد کر سکے گا اور اپنے صارفین کو خوش کر سکے گا۔

وعدہ کے مطاپق، گیتھب سے لنک کریں۔.

سوالات، تجاویز - براہ کرم انہیں تبصروں میں چھوڑ دیں۔ اس کے علاوہ، اگر آپ اس میں دلچسپی رکھتے ہیں کہ اس انضمام کی ترقی کیسے ہوئی، لکھیں، اور اگلے مضمون میں میں ہر چیز کو مزید تفصیل سے ظاہر کرنے کی کوشش کروں گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں